详解R语言图像处理EBImage包

目录
  • 什么是EBImage
    • 1. 图像读取与保存
    • 2.色彩管理
    • 3.图像处理
    • 4.空间变换
    • 5.形态运算
    • 6.图像分割

本文摘自《Keras深度学习:入门、实战及进阶》第四章部分章节。

什么是EBImage

EBImage是R的一个扩展包,提供了用于读取、写入、处理和分析图像的通用功能,非常容易上手。EBImage包在Bioconductor中,通过以下命令进行安装。

install.packages("BiocManager")
BiocManager::install("EBImage")

EBImage安装后,可以通过以下命令将其加载到R中。

library("EBImage")

1. 图像读取与保存

EBImage的基本功能包括图像的读取、显示和写入。使用readImage()函数读取图像,函数中的参数files表示需要读取的文件名或URL,参数type表示读取的图像文件格式,目前支持jpeg、jpg和tiff三种图像文件格式。
首先,将我们将一张图像格式为jpg文件的灰色图像加载到R中。我们可以通过display()函数对刚刚加载的图像进行可视化

> img <- readImage('../images/cat.jpg')
> display(img ,method = 'browser')

当display()函数的参数method为“browser”时,在R中运行命令后将在默认Web浏览器中打开图像,在RStudio中运行命令后将在View窗口打开可交互的图像。使用鼠标或者键盘快捷键可以放大或缩小图像、平移或循环显示多个图像。当参数method为“raster”时,就在当前设备上绘制静态图像,我们还可以利用R的低级绘图函数在图像上添加其他元素。运行以下程序代码将在图像上添加文本标签

> display(img,method = 'raster')
> text(x = 20,y = 20,label = 'cat',adj = c(0,1),col = 'orange',cex = 2)

上面示例读入的是黑白图像(或称灰色图像),readImage()和display()函数也可以轻松读入彩色照片。

> imgcol <- readImage('../images/cat-color.jpg')
> display(imgcol,method = 'raster')

2.色彩管理

colorMode()函数可用于访问和更改此属性,修改图像的渲染模式。在下一个例子中,我们将一张彩色图像的模式变为灰色(Grayscale),那么该图像将不再显示单一的彩色图像,而是转换为三帧的灰色图像,分别对应红、绿、蓝三个通道。colorMode()函数只会改变EBImage渲染图像的方式,并不会改变图像的内容。运行以下程序代码,将一个彩色图像渲染为一个具有3帧(红色通道、绿色通道、蓝色通道)的灰色图像。

> colorMode(imgcol) <- Grayscale
> display(imgcol,method = 'raster',all = TRUE,nx = 3)

我们可以使用更灵活的channel()函数进行色彩空间转换,可以将灰色图像转换为彩色图像,也可以从彩色图像中提取颜色通道。与colorMode()函数不同,channel()函数还可以更改图像的像素强度值。asred、asgreen和asblue转换模式可以将灰色图像或数组转换为指定色调的彩色图像,此时图形数据也将从二维变成三维。

> img_asgreen <- channel(img,'asgreen')
> dim(img)
[1] 1920 1080
> dim(img_asgreen)
[1] 1920 1080    3

3.图像处理

作为数值数组,可以使用R的任何算数运算符方便地操作图像。例如,我们可以通过简单地利用其最大值减去图像数据来生成负图像。

> img_neg <- max(img) - img
> img_comb <- combine(img,img_neg) TRUE)

我们还可以通过加法来增加图像的亮度,通过相乘来调整对比度,以及通过求幂来应用伽玛校正。

> img_comb1 <- combine(
+   img,
+   img + 0.3,
+   img * 2,
+   img ^ 0.5
+ )
> display(img_comb1,method = 'raster',all=TRUE)

我们可以使用标准矩阵的子集选取方式对图像进行裁剪。比如我们通过选取Image类的部分数据用于绘制猫咪的头像

> img_crop <- img[800:1700, 100:950]
> plot(img_crop)

4.空间变换

对于灰色图像,可以使用R基础包的t()函数或者EBImage扩展包的transpose()函数进行转置。

> img_t <- transpose(img) # 等价于 img_t <- t(img)
> plot(img_t)

对于彩色图像,我们不能使用t()函数,而是需要使用transpose()函数对其进行转置,其能通过交换空间维度来置换图像。

> t(imgcol) # 报错
Error in t.default(imgcol) : argument is not a matrix
> imgcol_t <- transpose(imgcol)
> plot(imgcol_t)

除了转置,我们还有更多关于图像的空间变换,例如平移、旋转、反射和缩放。translate()函数通过指定的二维向量移动图像平面,裁剪图像区域外的像素,并将进入图像区域的像素设置为背景。参数v是由两个数字组成的向量,表示以像素为单位的平移向量。以下代码实现将图像往右移动100像素,往上移动50像素。

> img_rotate <- rotate(img,30)
> plot(img_rotate)

使用resize()函数可以将图像进行缩放,如果仅提供宽度或者高度之一,则将自动计算另一个尺寸并保持原始宽高比。以下代码实现将img、imgcol图像的宽、高均设置为256。

> # 调整图像尺寸
> img_resize <- resize(img,w = 256,h = 256)
> imgcol_resize <- resize(imgcol,w = 256,h = 256)
> par(mfrow=c(1,2))
> plot(img_resize)
> plot(imgcol_resize)
> par(mfrow=c(1,1))

flip()和flop()函数分别围绕水平轴和垂直轴反射图像。

> img_flip <- flip(img)
> img_flop <- flop(img)
> display(combine(img_flip, img_flop),
+         all=TRUE,method = 'raster')

affine()函数可以实现空间线性变换,其中像素坐标(用矩阵px表示)转换为cbind(px, 1)%*%m。

> m <- matrix(c(1,-.5,128,0,1,0),nrow=3,ncol=2)
> img_affine <- affine(img, m)
> display(img_affine)

5.形态运算

二值图像是仅包含两组像素的图像,其值为0和1,分别表示背景像素和前景像素。这样的图像要经历几种非线性的形态学运算:侵蚀、膨胀、打开和闭合。这些操作通过以下方式在二进制图像上覆盖一个称为结构元素的掩码来工作:

  • 腐蚀:对于每个前景像素,在其周围放置一个遮罩,如果遮罩覆盖的任何像素来自背景,请将其设置为背景。
  • 膨胀:对于每个背景像素,在其周围放置一个蒙版,如果蒙版覆盖的任何像素都来自前景,请将像素设置为前景。

我们首先读入一个二值图像,然后利用markBrush()函数创建一个形状为diamond,大小为3的滤波器,再通过erode()函数对二值图像进行腐蚀、dilate()函数对图像进行膨胀。

> shapes <- readImage('../images/shapes.jpg')
> kern = makeBrush(3, shape='diamond')
> shapes_erode= erode(shapes, kern) # 腐蚀
> shapes_dilate = dilate(shapes, kern) # 膨胀
> display(combine(shapes,shapes_erode, shapes_dilate),
+         all=TRUE,method = 'raster',nx = 3)

6.图像分割

图像分割是指对图像进行分割,通常用于识别图中的对象。非接触连接的对象可以使用bwlabel()函数进行分段,而watershed()与propagate()函数能够用更复杂的算法分离彼此接触的对象。
bwlabel()函数查找除背景以外的每个相连像素集,并用唯一递增的整数重新标记这些集。可以在带阈值的二进制图像上调用它以提取对象。

> shapes_label <- bwlabel(shapes)
> table(shapes_label)
shapes_label
 0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15 
16821   398   129   135   11   147    81   109    60    87    93    81    78   100    87    15 
> max(shapes_label)
[1] 15

shapes_label图像的像素值范围从0(对应于背景)到其包含的对象数,最大值为15。
我们利用normalize()函数对其进行(0,1)范围内的标准化,这将导致不同的对象以不同的灰色阴影渲染

> display(normalize(shapes_label),method = 'raster') # 灰色渲染

可视化分割的另一种方式是使用colorLabels()函数,该函数通过唯一颜色的随机排列对对象进行颜色编码。

> display(colorLabels(shapes_label),method = 'raster') # 彩色渲染

EBImage将对象掩码定义为具有相同唯一整数值的一组像素。通常,包含对象掩码的图像就是分割函数的结果,如bwlabel、watershed或propagate。通过rmObject()函数可以将对象从这些图像中删除,只需将对象的像素值设置为0就可以从掩码中删除对象。默认情况下,在删除对象之后,所有剩余的对象都会被重新标记,以便最高对象ID对应于掩码中的对象数量。参数reenumerate可用于更改此行为并保留原始对象id。
我们需要将RstudioKeras对象中的“”移除,通过以下程序代码实现。

> z <- rmObjects(shapes_label,15) # 移除"_"
> display(z,method = 'raster')

到此这篇关于R语言图像处理EBImage包详解的文章就介绍到这了,更多相关R语言图像处理EBImage内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解R语言图像处理EBImage包

    目录 什么是EBImage 1. 图像读取与保存 2.色彩管理 3.图像处理 4.空间变换 5.形态运算 6.图像分割 本文摘自<Keras深度学习:入门.实战及进阶>第四章部分章节. 什么是EBImage EBImage是R的一个扩展包,提供了用于读取.写入.处理和分析图像的通用功能,非常容易上手.EBImage包在Bioconductor中,通过以下命令进行安装. install.packages("BiocManager") BiocManager::install(

  • 详解R语言中生存分析模型与时间依赖性ROC曲线可视化

    R语言简介 R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. 人们通常使用接收者操作特征曲线(ROC)进行二元结果逻辑回归.但是,流行病学研究中感兴趣的结果通常是事件发生时间.使用随时间变化的时间依赖性ROC可以更全面地描述这种情况下的预测模型. 时间依赖性ROC定义 令 Mi为用于死亡率预测的基线(时间0)标量标记. 当随时间推移观察到结果时,其预测性能取决于评估时间 t.直观地说,在零时间测量的标记值应该

  • 详解R语言数据合并一行代码搞定

    数据的合并 需要的函数 cbind(),rbind(),bind_rows(),merge() 准备数据 我们先构造一组数据,以便下面的演示 > data1<-data.frame( + namea=c("海波","立波","秀波"), + value=c("一波","接","一波") + ) > data1 namea value 1 海波 一波 2 立波 接 3 秀

  • 详解Go语言中关于包导入必学的 8 个知识点

    1. 单行导入与多行导入 在 Go 语言中,一个包可包含多个 .go 文件(这些文件必须得在同一级文件夹中),只要这些 .go 文件的头部都使用 package 关键字声明了同一个包. 导入包主要可分为两种方式: 单行导入 import "fmt" import "sync" 多行导入 import( "fmt" "sync" ) 如你所见,Go 语言中 导入的包,必须得用双引号包含,在这里吐槽一下. 2. 使用别名 在一些场

  • 详解R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

    在标准线性模型中,我们假设 .当线性假设无法满足时,可以考虑使用其他方法. 多项式回归 扩展可能是假设某些多项式函数, 同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数  可以使用最小二乘法获得,其中  在  . 即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的近似值 .实际上,根据 Stone-Weierstrass定理,如果  在某个区间上是连续的,则有一个统一的近似值  ,通过多项式函数. 仅作说明,请考虑以下数据集 db = data.frame(x=xr,y=y

  • 详解R语言中的表达式、数学公式、特殊符号

      在R语言的绘图函数中,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化. y <- function(x) (exp(-(x^2)/2))/sqrt(2*pi) plot(y, -5, 5, main = expression(f(x) == frac(1,sqrt(2*pi))*e^(-frac(x^2,2))), lwd = 3, col = "blue") library(ggplot2) x <- seq(0, 2*pi, b

  • 详解R语言实现前向逐步回归(前向选择模型)

    目录 前向逐步回归原理 数据导入并分组 导入数据 特征与标签分开存放 前向逐步回归构建输出特征集合 从空开始一次创建属性列表 模型效果评估 前向逐步回归原理 前向逐步回归的过程是:遍历属性的一列子集,选择使模型效果最好的那一列属性.接着寻找与其组合效果最好的第二列属性,而不是遍历所有的两列子集.以此类推,每次遍历时,子集都包含上一次遍历得到的最优子集.这样,每次遍历都会选择一个新的属性添加到特征集合中,直至特征集合中特征个数不能再增加. 数据导入并分组 导入数据,将数据集抽取70%作为训练集,剩

  • 详解R语言caret包trainControl函数

    目录 trainControl参数详解 源码 参数详解 示例 trainControl参数详解 源码 caret::trainControl <- function (method = "boot", number = ifelse(grepl("cv", method), 10, 25), repeats = ifelse(grepl("[d_]cv$", method), 1, NA), p = 0.75, search = "

  • 详解Go语言的context包从放弃到入门

    一.Context包到底是干嘛用的 我们会在用到很多东西的时候都看到context的影子,比如gin框架,比如grpc,这东西到底是做啥的? 大家都在用,没几个知道这是干嘛的,知其然而不知其所以然, 谁都在CRUD,谁都觉得if else就完了,有代码能copy我也行,原理啥啥不懂不重要,反正就是一把梭 原理说白了就是: 当前协程取消了,可以通知所有由它创建的子协程退出 当前协程取消了,不会影响到创建它的父级协程的状态 扩展了额外的功能:超时取消.定时取消.可以给子协程共享数据 二.主协程退出通

  • 详解R语言plot函数参数合集

    最近用R语言画图,plot 函数是用的最多的函数,而他的参数非常繁多,由此总结一下,以供后续方便查阅. plot(x, y = NULL, type = "p", xlim = NULL, ylim = NULL, log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL, ann = par("ann"), axes = TRUE, frame.plot = axes, panel.

随机推荐