我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解R语言图像处理EBImage包

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解R语言图像处理EBImage包

本文摘自《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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解R语言图像处理EBImage包

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

R语言glmnet包lasso回归中分类变量的处理图文详解

Lasso回归又称为套索回归,是Robert Tibshirani于1996年提出的一种新的变量选择技术,下面这篇文章主要给大家介绍了关于R语言glmnet包lasso回归中分类变量的处理的相关资料,需要的朋友可以参考下
2022-11-13

详解R语言caret包trainControl函数

这篇文章主要介绍了R语言caret包trainControl函数详解,本文通过源码分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

R语言学习之基础绘图详解

这篇文章主要为大家详细介绍了R语言中基础绘图的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
2023-03-22

OpenCV图像处理之图像拼接详解

本文主要介绍了如何使用C++ OpenCV实现图像景拼接,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以了解一下
2022-11-13

go语言import报错处理图文详解

今天本来想尝试一下go语言中公有和私有的方法,结果import其他包的时候直接报错了,下面这篇文章主要给大家介绍了关于go语言import报错处理的相关资料,需要的朋友可以参考下
2023-05-18

Python图像处理之图像增广算法详解

图像增广算法在计算机视觉领域扮演着至关重要的角色,本文将着重介绍图像增广算法中的三个关键方面:图像旋转、图像亮度调整以及图像裁剪与拼接,感兴趣的可以了解一下
2023-05-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录