星期三, 六月 27, 2012

如何用R来处理图片


做为“会电脑”的人,除了“友情”帮别人装系统杀杀毒之外,时常会承担一些图片处理的活。也就是对一些照片施加缩放、旋转、裁剪之类的事情。这类小事自然无需动用photoshop这种庞然大物了。在R语言中就有一个很好玩的biOps包,它可以很方便的进行各类图片处理操作。而且用程序来处理图片有一个天然的优势,就是很容易进行批量处理和自动化处理。下面以本人的头像机器人瓦利来做一些简单的示范。

# 加载扩展包
library(biOps) 
# 读取本地的图像文件,观察到此图像是399*399像素的rgb图片
x <-  readJpeg("d:\\xccds.jpg")
print(x)
# 先尝试缩放操作,后面的参数是缩放的比例,可以采用四种方式进行插值,这里用的是最近邻法
plot(imgScale(x,1.3,1.3,interpolation='nearestneighbor'))
#之后进行柔化降噪,此处采用的是中位数滤镜
plot(imgBlockMedianFilter(x,5))



# 也很方便进行图片裁剪,先设定好左上角的坐标像素,再设定好图片的宽度和高度即可
plot(imgCrop(x,0,0,399,200))
# 修改后的结果可以用writeJpeg函数存到本地磁盘中
y <- imgCrop(x,0,0,399,200)
writeJpeg(filename='d:\\test.jpg',imgdata=y)


# 另外还有一些有用的处理函数
# 图像聚类以进行颜色的压缩
plot(imgKMeans(x,8))


# 翻转图像
plot(imgHorizontalMirroring(x))
# 负片效果
plot(imgNegative(x))
# 转灰度效果
plot(imgRGB2Grey(x))


# 最后来个复杂点的例子,给图片的白色背景换成灰色背景
# rgb图像文件本质上是一个三维数组,它是由红、绿、兰三个矩阵所构成。将这三个矩阵的数值进行修改即是修改图片的颜色
y <- unclass(x)
y1 <- y[,,1]
y2 <- y[,,2]
y3 <- y[,,3]
z <- y1>220&y2>220&y3>220 
y1[z] <- y2[z] <- y3[z]<- 77
# 修改后的矩阵再重新组合为图片格式
y <- imagedata(array(data=c(y1,y2,y3),dim=c(399,399,3)))
plot(y)

3 条评论:

  1. 图像处理就留给PS之类的吧,在R上花时间不值得

    回复删除
    回复
    1. R的乐趣么。。。。哥们。。。这就叫乐趣,我们都把R当工具,它也可以是玩具,锻炼智力的玩具

      删除
  2. 这个可以用来做图像识别的批量预处理,然后直接就能拿去做学习了。

    回复删除