use R for fun系列之玩转图像篇
系列以use R for fun为主题,以COS论坛上的英华帖、相关package以及本身的一些code为素材,团结自身的一些编程体会,从而整合成文。本文是第三篇玩转图像篇。
*本文素材出处均已在正文中注明
接着for fun的话题往下讲,各人或多或少都曾经用过PS来玩过图片,其强大的成果令我们不得不惊叹,无论是美图照旧是恶搞都曾给我们带来了不少的兴趣。本日我们就要让这种兴趣在万能的R中实现!虽然实现的进程是艰苦的,因为这一切一部门需要依靠本身码代码,但同时也是轻松的,因为与之前差异的是这里开始涉及到许多其他的扩展包,带来了很大的便利,接下来会一一先容。
1 从画一张赤色毛爷爷说起
关于这一篇得先从一张赤色毛爷爷说起,有一次跟伴侣谈天谈起无比艰苦的糊口,聊着聊着那哥们就开始质疑R的作图成果,溘然冒了一句R能画张人民币出来么,我一想这不简轻松加愉快么,网上下张图片读进去不就完了(详细读图要领后头会讲),功效那哥们也不是呆子,跟了一句必然要画不能读图并且不能用扩展包,听起来仿佛有点难度,于是就在完全不思量代码雅观性的前提下三下五除二码了一段交了差,画出来了一张高仿假钞,还顺便借这玩意去某论坛刷了下人气(好吧确实有点猥琐)。
r<-read.table(“r100.txt”,header=F);g<-read.table(“g100.txt”,header=F);b<-read.table(“b100.txt”,header=F);r<-t(r);r<-r[,ncol(r):1];g<-t(g);g<-g[,ncol(g):1];b<-t(b);b<-b[,ncol(b):1];par(mar=rep(0, 4));Rcolor1<-rgb(1:255,0,0,alpha=120,maxColorValue=255);Rcolor2<-rgb(0,1:255,0,alpha=80,maxColorValue=255);Rcolor3<-rgb(0,0,1:255,alpha=30,maxColorValue=255);image(1:457,1:225,r,col=Rcolor1,add=F,axes=F,ann=F);image(1:457,1:225,g,col=Rcolor2,add=T,axes=F,ann=F);image(1:457,1:225,b,col=Rcolor3,add=T,axes=F,ann=F);
其实代码很是水,是一个很是典范的后面课本。并且从某种意义上讲是一种耍赖行为,因为没说不能读数据于是我就光亮正大的把RGB矩阵给读了进来,最后借助了颜色图也就是image函数(该函数在之后的文章中会有较量高的进场频率)。
这里简朴先容一下颜色图和image函数,颜色图本质上是一种网格图,每个网格可以展示一种颜色,正是因为这一特点,它可以用于在平面上展示三维数据,许多时候将其与等高图团结利用描写地理信息时往往会有很是不错的视觉结果。不外在这里就被我用来画位图了,即把每一个网格当成一个像素点,通过读进来的颜色矩阵来上色。关于image函数,不妨先来看看它的用法
image(x, y, z, zlim, xlim, ylim, col = heat.colors(12),
add = FALSE, xaxs = “i”, yaxs = “i”, xlab, ylab,
breaks, oldstyle = FALSE, useRaster, …)
参数x、y、z与等高线的参数雷同,x和y相当于横纵坐标(数值向量),用于分别网格,z则是对应的矩阵,也就是每一格对应一个数字。另外还可以通过把x,y,z整合成列表的形式赋予函数,因此它是一个泛型函数。col参数用于配置颜色,可以通过某些特定的颜色主题生成,如rainbow()等,缺省值是heat.colors(12),生成的颜色序列会按照z中的数据对应填充到每一个格子中。另一个重要参数是add,虽然add 为TRUE 是,image就会成为初级画图函数在原图上添加(故此时必需有已经打开的作图设备),为FALSE则具有高级画图的成果,缺省值FALSE。剩余参数寄义大多与plot()中参数寄义无异,这里不再赘述。
把握一个函数光靠看了usage是没用的,很快就会忘掉,因此最快最有效的要领就是通过一个富有趣味性的例子,于是这里冒着离题的风险盗用辅佐文档中与等高图(contour函数)团结的示例来给各人加深印象:
x<-10*(1:nrow(volcano))
y<-10*(1:ncol(volcano))
image(x,y,volcano,col=terrain.colors(100),axes=FALSE)
contour(x,y,volcano,levels = seq(90, 200, by = 5),
add=TRUE, col=”peru”)
axis(1,at=seq(100,800,by = 100))
axis(2,at=seq(100,600,by = 100))
box()
title(main=”Maunga Whau Volcano”,font.main = 4)
2 把图片读进来
玩图片的第一步自然就是把图给读进来,读图的要领R倒是提供了不少,光package就有n多个。这里主要提一提专门用来读图的包(指除读写外根基没有其他的图片处理惩罚扩展成果),我在CRAN上劈头找了一下主要有这么几个,可以那面向的图片名目分为两类,第一类是专注于某一种名目标包,别离有jpeg、png、tiff、bmp三个包,这几个包别离只能读本身名字所对应的图片名目,相信这几种名目各人都不生疏了,都较量常用,并且除bmp外,都出自同一人之手(Simon Urbanek)所以函数用法什么的都根基一致故而很是好记,不妨以jpeg为例,读图函数readJPEG(别的对应的readPNG和readTIFF则参数更多一些)的用法为
readJPEG(source, native = FALSE)
#p#分页标题#e#
source较量容易领略即方针工具的路径,而native则有须要简朴表明下,它主要影响到图片读进来后存储的内容,假如是FALSE那么读进来后就是一个数组,取值均在0,1之间,这样也就便于我们之后的处理惩罚,所以一般都回收缺省值(F),但假如选择了TRUE则返回的工具为nativeRaster类,它的利益在于很容易通过rasterImage()把图绘制出来。举个例子
library(jpeg);
img<-readJPEG(system.file(“img”,”Rlogo.jpg”,package=”jpeg”))
img.n<-readJPEG(system.file(“img”,”Rlogo.jpg”,package=”jpeg”),TRUE)
读者不妨可以看看这两者之间的区别。bmp包略有差异,对应的函数名为read.bmp(),用法为
read.bmp(f, Verbose = FALSE)
f雷同于source,Verbose指是否给出具体告诫,一般回收默认的F。接下来顺便提一下raster和rasterImage()函数,Raster 是R 顶用于展示位图的一类工具,与matrix、vector等雷同,is.raster和as.raster 可以别离用于鉴别和转换,而rasterImage()则事实上是一个初级作图函数,可以看一下他的用法
rasterImage(image,
xleft, ybottom, xright, ytop,
angle = 0, interpolate = TRUE, …)
image的工具必需是raster可能可以通过as.raster强行转换,中间四个参数指定了绘制的区域,寄义可直接按照字面意思领略,angle 指的是旋转的角度,默认是不旋转也就是0,interpolate则是询问是否插值。
plot(1:2,type=”n”);
rasterImage(img.n,1.2,1.27,1.8,1.73,angle=30);
除此之外剩下的一个就是readbitmap包(今朝依赖于上述三个包)包,它的特点在于可以同时包括出tiff之外的三种名目了,同样通过例子来看一看它的用法
read.bitmap(f, channel, IdentifyByExtension = FALSE, …)
两者对比只能说各有优势吧,孰好孰坏这里就不妄下定论了,究竟笔者也不太专业只是本着玩的心态来看故而从不执着于此。另外值得一提的是,关于bmp包其今朝支持的bmp 名目范围于8位的灰度图和24、32位的RGB图,别的它与jpeg、png和tiff包尚有一点差异的是该包的实现仅仅依靠R自己而并没有外部依赖(jpeg和png别离依赖于libjpeg和libpng库),关于上述扩展包的详细信息在辅佐文档中都有论述(部门包中还包括实现鉴别名目等成果的函数),个中文档中的一些相对专业的观念一方面为防备跑题另一方面也为了防备误导故本文并未涉及,读者可自行查察。
除了本节所说的这些,事实上在之后提到的几个综合性的玩图的包中也都包括了这些成果,后头会简朴提到。
3 聊一聊图形设备
只要用过R的相信对图形设备一点都不生疏,前两篇的问世大多也大多仰仗于R强大的图形设备,所以在详细叙述之前,得先把常用的几个图形设备函数摆列了一下,供各人参考,虽然照旧那句老话,欲知详情,烦请help
dev.new():建设新的图形窗口
dev.cur():显示当前的图形窗口
dev.list():查察图形窗列表口
dev.next():下一个图形窗口
dev.prev():上一个图形窗口
dev.set(which=dev.next()):切换下一个图形窗口为当前图形窗口
dev.off():封锁当前图形窗口
graphics.off():封锁所有图形窗口
因为后头各式百般的图片结果会较量多,所以不免会需要同时打开多个图形窗口,假如读者随着我的步骤一起玩的话,把握这几条最根基的呼吁是很有须要的。然后就正式切入正题!
4 有一个包名叫biOps
其实写这篇文章最初的动力就来自于这个包,事实上在这之前尚有一个图像处理惩罚的包rimage,惋惜因为本人打仗R的时间较量短,等我开始玩R的时候这个包早已离我而去了,尚有ripa包什么的此刻也早已都通通不见了踪影,如今还在CRAN上坚定的在世的还算完整的包根基也就只剩下biOps了。
关于它的安装,笔者安装时并没有呈现什么问题,所以也并没有去寄望详细安装方面的留意事项,假如安装呈现错误不妨参考下COS论坛上的这个帖子,假如是其他的错误那就只能贫苦自行google之了。
从辅佐文档来看,它的成果很强大,因为函数浩瀚,光函数列表就列了三页,也算是一个集大成之作了(但其实有许多函数都是成果反复的并没有存在的须要,后头提到的EBImage 则走的是简捷蹊径,各有特点),它的汗青也算是较量“悠久”了,预计也是各类担任了前人的血汗造福我们这种子弟,小的在此谢过。但也很是遗憾这么“好”的包却没有一篇好的小品文来指导我们(我只能说包实在是太杂乱了),着实让我悲痛不已,于是就只能谨遵伟大首脑毛主席的教训“本身动手,人给家足”,按照辅佐文档来简朴整理一下仅供参考。别的肖凯老师也有一篇博文提到这个包,参考这里。
4.1 读、写那些事
#p#分页标题#e#
包中所带的读图函数为readJpeg()和readTiff(),参数只有一个就是文件,依赖于libtiff和libjpeg库,对应的尚有writeJpeg()和writeTiff()浸染和道理我想也没须要再说了吧,至于图像的展示该包则是提供了plot.imagedata()函数。
ima<-readJpeg(system.file(“samples”,”violet.jpg”,package=”biOps”))
plot(ima)
4.2 简朴的烦琐一下空间调动
空间调动包罗了放缩旋转等,之前也提到了完成这些大多得依赖于插值实现,而插值的方法有不少一般较量常用的有最近邻、双线性以及样条等等,各有优势也各有致命伤。biOps在这方面就做的很全面,譬喻做旋转,就有针对各类插值方法的imgCubicRotate()、imgBilinearRotate()、imgNearestNeighborRotate()、img-SplineRotate()等(见名思意即可)函数,参数均只有一个angle,指的是顺时针旋转的角度,虽然假如以为记这么多函数名贫苦的话,包中尚有一个imgRotate()函数则是荟萃了上述函数的成果,多了一个参数interpolation用于选择插值方法(nearest neighbor, bilinear, cubic, spline)。
x<-readJpeg(system.file(“samples”,”violet.jpg”,package=”biOps”))
y<-imgRotate(x,45,”spline”)
plot(y);
另外假如是放缩只需把上述函数名后的Rotate改成Scale就OK了,雷同的也有imgScale()函数是一个综合的函数,同样的interpolation 参数用于选择插值方法(一般用于放大)。同时开拓者们本着宁缺毋滥的精力还提供了imgAverageShrink()和imgMedianShrink()主要用于缩小。除旋转放缩外,切割图像用的是imgCrop()函数,譬喻
y<-imgCrop(x,100,50,100,50);
4.3 关于色彩
imageType()函数可以用来鉴别图片的颜色范例(RGB与灰度),而imgRGB2Grey()则可以将RGB图转换为灰度图(其实这点很是有用)。
imageType(x);
y<-imgRGB2Grey(x);
plot(y);
而图像的比拟度、亮度别离可以通过imgDecreaseContrast, imgDecreaseIntensity(把Decrease改成Increase就是增加)实现,imgGamma则用于伽马校正。
假如需要提取RGB图中某一颜色的矩阵,则可以别离通过imgRedBand(x)等函数(换中间的单词即可)实现,如
imgBlueBand(x);
plot(imgBlueBand(x));
则是提取了图中的蓝色,但留意画出来的图可不是蓝色的哦。
4.4 来点实在的糟蹋——滤镜
对付玩图这件工作包中提供了大量img系列函数(虽然也包罗之前提到的),让人应接不暇,而滤镜自然是最值得倒腾的(前面其实已经设涉及到一些),相信玩过PS的应该对滤镜一点都不生疏,于是笔者就挑一些既简朴又好玩的与各人分享。
4.4.1 最简朴的恍惚与锐化
恍惚和锐化不出意外应该是更为人熟知的滤镜了,他们的实现要领也不难,一般都是通过取平均值淘汰相邻像素间的差别从而柔化图像。虽然这么简朴的事情本身写措施就太挥霍时间挥霍生命了,biOps的作者们已经给我们备好了函数imgBlur()和imgSharpen(),用起来很利便
y1<-imgBlur(x)
plot(y2);
dev.new();
y2<-imgSharpen(x,2)
plot(y2);
可是也有一个不能容忍的处所就是它的机动性实在是太差了,主要表此刻滤波器掩模的选择上,譬喻恍惚仅仅提供了一种选择,而锐化则只有三种(实在是无力吐槽啊),所以说简捷许多时候照旧得支付价钱,不外这并不料味着当函数满意不了我们的时候就得本身码代码,因为biOps中的imgConvolve()函数事实上包括了上述成果(恍惚和锐化属于卷积处理惩罚),别的后头谨慎推出的EBImage也能办理这个问题(拍手! )。
4.4.2 浮雕结果
所谓浮雕结果就是通过勾绘图象表面和低落周围像素颜色值,从而浮现出有凹凸感。其道理是对图像的每一个点举办卷积处理惩罚,跟方才所说的恍惚和锐化较大的区别即在于滤波器掩模(一般是三乘三矩阵)的选择上,虽然同样没须要本身去码,方才提到的imgConvolve()函数可以帮你排忧解难。一个例子说明一切
m<-matrix(c(1,0,0,0,0,0,0,0,-1),3,3)
y<-imgConvolve(x,m,12)
plot(y)
m即为所用到的滤波器掩模,如此一来,明明的浮雕结果就出来了。
假如还想玩的再high一点的话,那就不妨用这招给本身做枚眷念币?
4.4.3 添加杂色
许多时候杂色也是不行或缺的,添加水平的差异结果也会有明明的差别,函数imgGaussianNoise可用于添加高斯杂色
y<-imgGaussianNoise(x,0,200);
plot(y)
是否能看出一丝下雨的结果呢?
4.4.4 边沿探测
#p#分页标题#e#
边沿探测(Edge Detection)常见于遥感,即针对遥感图像的阐明,既如此那么边沿探测的算法也则一定是一个很重要的脚色,因此biOps包的作者们往包里塞了一大坨的各式百般的边沿探测的函数唯恐漏掉,差异的函数算法大多差异, 故请自行help或google。
如此并勾勒出了大抵的表面,看起来结果照旧很不错的。稍作窜改也可以做出壁画的感受
4.4.5 素描结果
这条来自于轩哥博客,算法也略微要巨大些,在他博文中有具体的说明和代码,感乐趣的读者请猛戳这里 ,但千万不要复制下来直接跑,不要忘了rimage已经不复存在了,至于怎么改的问题看了前文这里应该不需要多说了吧。顺便盗用一下结果图
由于许多成果与接下来先容的EBImage包反复,故某些处所并未具体论述,另外由于函数浩瀚且许多函数的存在实在是没须要(而且表明也及其简朴)所以并无法八面见光,所以但愿进一步相识的可以自行参考辅佐文档可能google。跟biOps包有着细密接洽的尚有一个biOpsGUI 包。biOpsGUI 提供了一个GUI 用于展示图片,需要GTK+ 的支持,也就是得事先安装RGtk2包,他的利益在于展示图片利便,并且鼠标所到支出可以返回该点的坐标和颜色值(RGB),缺点则是除此之外就没什么其他成果了,仅仅是一个展示。用辅佐文档中所给的例子也就足以说明一切了。
x<-readJpeg(system.file(“samples”, “violet.jpg”, package=”biOps”));
imgDisplay(x);
读者可自行查察结果。
5 有时候CRAN并非较佳选择——EBImage
看完了CRAN中的图像处理惩罚包biOps,利益不少但槽点也实在是略多,充实浮现了抱负与现实的差距,所以这里我们不妨把视角转移R的另一大软件包客栈——bioconductor,或者不从事生物信息学可能医学统计的伴侣对此并不熟悉。事实上在bioconductor上给我们提供了很是好的资源有好的数据也有好的措施,谢大对其也有着很是高的评价。所谓统计的都是相通的(虽然玩也是想通的),bioconductor上的也并不是只有搞生统的才气用,因此这里也借EBImage包简朴先容一下bioconductor的利用。
bioconductor的一大长处在于它的包根基都配有小品文(Vignettes),小我私家以为小品文可以很好的辅佐我们理清包的思路以及主要函数的用法(假如写的好的话),这对快速的上手有着很大的辅佐,因为辅佐文档的函数都是按首字母排序的,进修起来会没有层次(与带给我强烈坑爹感的biOps形成光鲜比拟)。
先从包的安装说起,bioconductor中包的安装与CRAN略有差异,每次在安装包之前需要特别运行一段剧本biocLite.R,该剧本存放在官网上,运行之后就可以举办安装,安装函数也略有差异,这里利用的是biocLite()即相当于我们平时常用的install.package函数,以EBImage包为例,就可以通过如下代码举办安装:
source(“http://bioconductor.org/biocLite.R”)
biocLite(“EBImage”)
事实上在每个包的主页上城市有关于安装的说明,另外尚有其他相关的信息,内容布局大抵与CRAN沟通(Document的内容更富厚了些),按需下载即可。
接下来简朴说说EBImage的十八般技艺(内容大多来历于文档的翻译,所以利用过该包的读者可以略过此段)。
5.1 图片的读、显、写
#p#分页标题#e#
该包作者给它的定位是一个在R中图像处理惩罚和阐明的东西包,既然如此那处理惩罚图像最根基的三件事同样也是必不行少,图片的读取前面已经提了不少,CRAN的包也纷纷各显神通,EBImage自然也自带了一个,就是readImage()函数,它既可以读取当地文件中的图片也可以读取网络中的图片(url),不外今朝支持的名目并不多,只有JPEG、PNG、TIFF三种,但其实也足够用了,我们平时所用的图片名目其实也根基不过乎这几种。举个例子
pic<-system.file(“images”,”lena-color.png”,package=”EBImage”)
lenac<-readImage(pic)
读进去了之后还得显示出来,虽然包的作者也是不会把这茬给遗漏的,display()函数就包袱起了这一汗青使命。接着上面的代码我们继承写下
display(lenac)
运行之后一个美男就呈现了(换个口胃这节就以她为素材了),并且预计各人也不会生疏,她的出境频率简直是很高(lena就是她的名字,是一个瑞典模特,为防备跑题故请欲知详情者自行google)。值得一提的是,默认的显示方法是在电脑的默认欣赏器中显示也就是网页显示,假如需要在R 的作图窗口中显示则需要把display函数中method参数改为raster,即
display(lenac,method=”raster”)
写入图片可以通过writeImage()函数实现,文件名目可以通过文件扩展名揣度。事实上这一成果也是用来实现图片名目转换的一个不错方法,例如说下面这句呼吁就在眨眼之间把图片从png转换成了jpeg名目。
writeImage(lenac,”lenac.jpeg”,quality=85)
这里quality参数指的就是图片的质量,缺省值是100。
5.2 再谈图像矩阵
同样在这里也难免俗的通过多维数组来存储图像。因此正是因为这一点,我们同样可以通过一些很简朴的语句来把原本好端端的一幅美图给糟蹋掉。远的不说,就是最根基的加减乘除就可以做到,接着之前的代码
lenac1<-lenac+0.5
lenac2<-3*lenac
lenac3<-(0.2+lenac)^3
温馨提示下定刻意看结果图前请掩护好你的双眼。对比不消多说各人也应该大抵大白了这几条呼吁的意义了,”\verb|+|”可以调解图片的亮度(假如对RGB有必然相识的相信对这些用法都不难领略),”\verb|*|”用来调解图片比拟度,而”\verb|^|”则是可以用来节制gamma 校正参数。这也进一步说明白biOps中有些函数的简直确太多余了。虽然还不止这些,不妨再罗列三条
lena<-system.file(“images”, “lena.png”, package=”EBImage”);
lena<-readImage(lena);
lena4<-lena[299:376, 224:301];
lenac5<-lenac>0.2;
lena6<-t(lena);
这几条怕是不消说各人也能知道是怎么回事了,对比而言取个阈值出来的结果更带感一点(读者可自行把该呼吁用于彩色图中,同样请掩护双眼)。
是不是能看出一点剪纸结果呢?另外该包还提供了combine()函数用于多重画面的建造,譬喻
lenacomb<-combine(lenac, lenac+0.1, lenac+0.2, lenac+0.4)
display(lenacomb,method=”raster”,all=T)
需要留意的是假如这里不选择欣赏器显示,那么参数all必然要改为TRUE即显示全部图片,不然只会显示第一张图。
5.3 再来试试最简朴的空间调动
这几招在之前也早已都玩过了,不外这里照旧要简朴提一下,究竟一句呼吁办理问题的工作,多一种要领多一条路,利便好记何乐而不为呢?
lenac7<-rotate(lenac, 30)
lenac8<-translate(lenac, c(40, 70))
lenac9<-flip(lenac)
lenacomb<-combine(lenac, lenac7, lenac8, lenac9)
display(lenacomb,method=”raster”,all=T)
不外凭据老例最后多嘴一句,这些函数同样可以用在通例的矩阵操纵上(因为本质就是对矩阵操纵)。
5.4 颜色打点
不知各人是否相识通道这一观念,不外不相识也无妨,这里只需对颜色模式有必然相识就行了,这里提供的颜色模式同样只有两种灰度模式和彩色模式,两者之间是可以彼此转换的。另外也可以把图像中某一颜色通道提取出来(可以领略为把某一种颜色提取出来),这一点与biOps雷同。对应的函数为colorMode(),一看例子便知。
colorMode(lenac)<-Grayscale
display(lenac)
colorMode(lenac)<-Color
另外辅佐文档中也给了我们一个很是有意思的例子,不妨看一下
lenab<-rgbImage(red=lena,green=flip(lena),blue=flop(lena))
display(lenab,method=”raster”)
是不是有种幻影的感受呢?
5.5 再玩滤镜结果
在我看来滤镜永远是重点,因为它总能带给我们惊喜,不妨先往返首一下之前玩过的恍惚与锐化,看看它们在EBImage中是如何实现的
flo<–makeBrush(21, shape=’disc’, step=FALSE)
flo<-flo/sum(flo)
lenaflo<-filter2(lenac, flo)
fhi<-matrix(1, nc=3, nr=3)
fhi[1,1]<–3;fhi[1,3]<–3
lenafhi1<-filter2(lenac, fhi)
fhi<-matrix(1, nc=3, nr=3)
fhi[2,2]<–8
lenafhi2<-filter2(lenac, fhi)
lenacomb<-combine(lenac,lenaflo,lenafhi1,lenafhi2)
display(lenacomb,method=”raster”,all=T)
#p#分页标题#e#
操纵要领概略雷同,只不外换了一个函数(filter2)罢了,函数makeBrush()用于指定画刷的巨细范例等,虽然之前所提到的浮雕等结果在这里同样OK,矩阵变着变着就各式百般的结果都出来了,而且我以为EBImage所提供的对比用起来更顺手也更机动些。这里再提一些之前没有提到的
5.5.1 高斯恍惚
EBImage特意提供了gblur()函数来实现,用法同样很简朴只需提供方差和半径即可
x<-readImage(system.file(“images”,”lena.png”,package=”EBImage”))
y<-gblur(x,sigma=4)
display(y,method=”raster”,all=T)
假如对高斯恍惚详细的道理和在R如何DIY是实现感乐趣的读者可以参考轩哥的博文,这里为防备误导不再赘述。
5.5.2 老照片结果
老照片结果的浸染是把一张正常的照片通过线性调动糟蹋成年久泛黄的结果,自然也就给人一种老照片的感受。实现起来同样很是简朴,本身动手写几句即可,本着能水则水的原则不到一分钟就可以搞定
结果大抵是有了,但尚有许多不尽如人意的处所,这点各人可以按照爱好自行修改(如调动的矩阵,亮度比拟的调解等)。
lenac<-readImage(pic);
R1<-lenac[,,1];
G1<-lenac[,,1];
B1<-lenac[,,1];
R<-0.393*R1+0.769*G1+0.189*B1;
G<-0.349*R1+0.686*G1+0.168*B1;
B<-0.272*R1+0.534*G1+0.131*B1;
lenact<-lenac;
lenact[,,1]<-R;
lenact[,,2]<-G;
lenact[,,3]<-B;
display(lenact,method=”raster”,all=T)
*调动矩阵引用自网上
5.6 形态学处理惩罚
这里再讲一讲该包的形态学处理惩罚成果。这一点在对文字图片的处理惩罚上有更直观的浮现,包中自带了一张用于演示的例图,结果一看便知。
一张是冲刷的结果,而另一张则是膨胀的结果,别离通过erode(),dilate()函数实现,最后附上代码
ei<-readImage(system.file(‘images’, ‘shapes.png’, package=’EBImage’))
ei<-ei[110:512,1:130]
display(ei,method=”raster”,all=T);
dev.new()
kern<-makeBrush(5, shape=’diamond’)
eierode<-erode(ei, kern)
eidilat<-dilate(ei, kern)
display(eierode,method=”raster”,all=T)
dev.new()
display(eidilat,method=”raster”,all=T)
5.7 还能有点啥
其实没提到的玩法尚有许多许多,包罗图像的支解算法实现等(医学和生物学上的应用),思量到篇幅这里就不再多说了,感乐趣的可以跟着辅佐文档继承摸索。
6 零琐屑碎
除了之前所说之外,尚有一些零琐屑碎的包也能对图像处理惩罚提供一些辅佐,这里略微提一提,详细请直接参考文档。
6.1 adimpro包
该包也是CRAN提供的一个可以用于简朴图像处理惩罚的包,依赖于Image Magick,用法大多雷同,到这也已没有了多嘴的须要,包的作者给大部门函数都写了demo,所以想继承相识该包的读者可以通过包中提供的demo进修。
6.2 pixmap包
#p#分页标题#e#
pixmap也是一个用于位图处理惩罚的扩展包,包中的函数仅仅提供了最最根基的获取、绘制等成果,不外它提供的read.pnm()函数可以用来读取PBM(利害),PGM(灰度)以及PPM(彩色)等并不太常见名目标图片。
7 挖掘潜力是一件永无尽头的工作
其实说到底前面所说的都是一些皮毛只能算是抛砖引玉,R的潜力是不行估计的(各方面都一样),需要我们去挖掘,轩哥的layer包(致敬!)就是一个很好的典范,在R中引入了图层,仰慕至极,相关的资料可以在统计之都主站找到。再好比说,操作前两篇文章所用到的交互事实上就可以做出一个发起图像处理惩罚界面(GUI则更佳)。虽然也可以从文献中的找些图像处理惩罚算法在R实现等等,不怕做不到就怕想不到。
8 最后再来fun一把!
讲了这么多包,扯了这么多无聊的对象,在本文邻近尾声之际,也该放松一下来好好fun一把了!
8.1 马赛克拼图
这玩意看起来是较量高端的,所以用于装逼长短常符合。这个玩法源于刘思喆(更早些)和波波版主两位大佬的博客,内里都有很是具体的论述和代码,所以感乐趣的读者不妨直接会见他们的博客。
需要提一下的是博文中部门代码大概已颠末期了(更新的原因),但都可以通过上文提到的函数取代,所以假如呈现报错等环境贫苦自行修改。
8.2 平面图的炫酷3D化
这个想法来自于rgl包的辅佐文档中一个展示地球仪的例子,“3D+交互”的结果着实令我惊叹不已,更有意思的是可以把处理惩罚好的图片在一个更好的情况下揭示出来,遂萌生将此招盗用过来之意。厥后考据一下后发明其实这招在论坛中也有曾经有呈现,但也没引起深入的接头故也没引起各人的留意。代码先行
library(rgl)
library(EBImage)
lat <- matrix(seq(90,-90, len=50)*pi/180, 50, 50, byrow=TRUE)
long <- matrix(seq(-180, 180, len=50)*pi/180, 50, 50)
x <- cos(lat)*cos(long)
y <- cos(lat)*sin(long)
z <- sin(lat)
open3d()
persp3d(x, y, z, col=”white”,
texture=system.file(“images/lena-color.png”,package=”EBImage”),
specular=”black”, axes=FALSE, box=FALSE,
xlab=””, ylab=””, zlab=””,
normal_x=x, normal_y=y, normal_z=z)
结果一看便知,不外记得要转到一个符合角度哦,否则就不堪入目了。
9 道歉与展望
事实上关于图像处理惩罚,早已不是一个新话题,不止COS的前辈们早就在搞,在2010年的London R 上就有题为Image Analysis Using R的陈诉,来自mango-solutions(如雷贯耳啊),而且他们在CRAN 上也早已为我们筹备好了Task View,只不外题目为医学图像处理惩罚(Medical Image Analysis),本该为这些成就在医学上的推广尽一份力的,惋惜思想觉悟不足高,在这里误导列位,实在是罪过罪过。因此在这里暗示最诚挚的歉意!以上颠三倒四图个乐即可。
以上内容也可供列位码代码打发时间时参考,说不定哪位仁兄一无聊我的文章又能更新了,那我就再兴奋不外了,定当谢谢涕零。本文篇幅略长,挥霍列位名贵时间,再次深表歉意!