加载中…

加载中...

用R语言实现图像素描效果(Just for fun)

转载 2016-05-12 03:51:42
标签: r语言图像处理 图层 素描画 铅笔画

       忙碌的生活中总要找些乐趣,近来学习用R语言处理图像,搜索资料时发现大牛们发的一些很有意思的博客,于是就整理学习了下。另外,对于咱们技术宅(虽然咱现在属于初级的^_^),向喜欢的人表达感情的方式中有一招就是用代码表达出滔滔不绝的情愫。没错,你猜对了,整理好后我就尝试着将我喜欢的人的图片处理了下,哈哈,效果还不错,不过在这里就不展示了,嘿嘿。如果你觉得有意思,也可以尝试下,如果不感冒,那就直接绕过吧~~(建了个群,交流学习: 553621380。

也可到楼主自己编写的网站上去查看更多内容,网址:http://www.omicsolution.org/wu-kong-beta-linux/main/

       在这里我们使用教材中经常使用的一张图片做下展示,如下图:

       没错,又是她,一位漂亮的瑞典模特,这张图已经成为一张标准的测试图(关于这张图你可以自行Google一下,全世界的人都在用这张图片测试,你难道不好奇~~)。此外,再强调一下,本笔记中主要是使用rimage包读取图像,这个包大概在2011年就删除掉了,所以建议使用2010年左右的R版本(可以到这里下载:http://mirror.bjtu.edu.cn/cran/),要不然很可能不能使用这个包。此外,在这里你可以了解到高斯模糊,图层等概念。好了废话不多说,直接上代码:

>library(rimage)

>library(grid) #这个包可以帮助咱们分图层

>library(colorspace)#提供颜色的

>blur <-function(x, grid, kernelf, ...)

{

  if(grid < 3) stop("grid should begreat than or equal to 3!");

  if(grid %% 2 == 0) stop("grid should beodd number!");

  v <- sapply(1:grid - (grid + 1) / 2,kernelf, ...);

  v <- v / sum(v);

  r <- (grid - 1) / 2;

  newx <- tmp <- x;

  for(i in (r + 1):(nrow(x) - r))

  {

    tmp[i, ] <- colSums(x[(i - r):(i + r), ]* v);

  }

  for(j in (r + 1):(ncol(x) - r))

  {

    newx[, j] <- colSums(t(tmp[, (j - r):(j+ r)]) * v);

  }

  return(newx);

}

>kernel.gauss<- function(x, sigma) dnorm(x, 0, sigma)

>blur.gauss<- function(x, grid, sigma) blur(x, grid, kernel.gauss,sigma = sigma)

>heart <-function(lcolor){ #这个函数是为了画心形

  t=seq(0, 2*pi, by=0.01)

  x=16*sin(t)^3

  y=13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)

  a=(x-min(x))/(max(x)-min(x))

  b=(y-min(y))/(max(y)-min(y))

  grid.lines(a,b,gp=gpar(col=lcolor,lty ="solid",lwd = 3))

}

 

#

>grid.newpage()#建一个新图层

>image1 <-read.jpeg("lenna.jpg")

>image1 <-rgb2grey(image1)

>m1 <-blur.gauss(1 - image1, 17, 7) #你可以更改17,7这两个参数,#实现不同强度的模糊效果

>pencil1 <-pmin(image1 + m1, 1)^5 #你可以修改指数5这个参数,辅助实现不同强度的模糊效果

>plot(imagematrix(pencil1))#画出素描图

 

>vp1 <-viewport(.25, .75, w=.1, h=.1,angle=15) #设置位置,长宽,以及图像旋转的角度

>pushViewport(vp1)

>heart(diverge_hcl(7,h = c(180, 330), c = 59, l = c(75, 95))[1]) #画第一个心形,括号内是一个取颜色的函数,你也可以自己取其他颜色尝试

>vp2 <-viewport(0.85, .4, w=.7, h=.7,angle=-30)

>pushViewport(vp2)

>heart(diverge_hcl(7,h = c(180, 330), c = 59, l = c(75, 95))[7])

>grid.text("LennaModel",x=-0.5,y =1.35, just = c("top"),rot=25,

          gp =gpar(fontsize=10,col="Violet")) #在图层上写上你要表

#达的文字

运行上面代码,实现的效果如下:

看着效果还不错,是不是觉得很容易?!那就赶紧尝试下吧^_^

 

大牛们的博客,去看看,能学到不少东西,在这里向大牛们致敬:

http://yixuan.cos.name/cn/2010/05/processing-pictures-with-a-pencil-sketch-effect-using-r/

http://cos.name/2013/09/cos-series-use-r-for-fun-image/

http://cos.name/2012/02/valentines-gift-by-using-r/


阅读(0) 评论(0) 收藏(0) 转载(0) 举报/Report

评论

重要提示:警惕虚假中奖信息
0条评论展开
相关阅读
加载中,请稍后
璇楃洓
  • 博客等级:
  • 博客积分:0
  • 博客访问:61,714
  • 关注人气:0
  • 荣誉徽章:

相关博文

推荐博文

新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有