可视化:RStudio马赛克处理

968 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

这次带来的是通过 RStudio 进行可视化处理。

大家感兴趣的可以通过各种搜索引擎来搜索以下案例进行观赏:

案例展示

  • 可视化案例:他山之石
  • 可视化的艺术:设计原则
  • 可视化的技术:实现手段
  • The Fallen of World War II
  • [TED] Hans Rosling 2006

案例研究: 婚礼照片的处理

image.png

上面的图片是我自己制作的对于婚礼照片的数据分析和可视化,其中通过提取照片的主色彩和时间戳信息,得到了整个婚礼进行过程中拍摄的照片的时间变化和色调变化。

其中提取每张照片的主色调是一个关键环节,在这里,我们要更进一步的学习对图片的马赛克化处理。

目标

下面是我们需要了解学习的内容,以及提出了几个问题,当然在最后也会给出相应的代码。

  • 图像的读取和保存
  • 图像的马赛克化

image.png

代码

# 图像的读取
library(jpeg)
imgRaw = readJPEG("./img/九品芝麻官0.jpg")

# 在R绘图窗口中画出图片
plot(NA, type = "n", xlab = "", ylab = "", asp = 1, 
     xlim = c(1,dim(imgRaw)[2]), ylim = c(1,dim(imgRaw)[1]) )
rasterImage(imgRaw, xleft = 1, xright = dim(imgRaw)[2], 
            ybottom = 1, ytop = dim(imgRaw)[1])

# 图像的保存
writeJPEG(imgRaw,"imgRaw.jpeg")

# 马赛克化
imgNew = array(1, dim=dim(imgRaw))
for(k in 1:3){
  for(i in 0:20){
    for(j in 0:39){
      rangeX = (i*10) + 1:10 # 找到块状区域的XY坐标范围
      rangeY = (j*10) + 1:10
      imgNew[rangeX,rangeY,k] = mean(imgRaw[rangeX,rangeY,k])
    }
  }
}

plot(NA, type = "n", xlab = "", ylab = "", asp = 1, 
     xlim = c(1,dim(imgRaw)[2]), ylim = c(1,dim(imgRaw)[1]) )
rasterImage(imgNew, xleft = 1, xright = dim(imgRaw)[2], 
            ybottom = 1, ytop = dim(imgRaw)[1])

writeJPEG(imgNew,"imgNew.jpeg")

# 待解决的问题:
# 1. 将马赛克程序包装成一个函数, 方便调用
# 2. 能自动处理各种尺寸的图片
# 3. 能处理好图片边缘(不能整除的部分)
# 4. 马赛克块的大小调整(通过函数的一个参数调整)

原图和马赛克化后的效果

image.png image.png

# 将马赛克程序包装成一个函数:
setwd("C:/Users/15799/Desktop")
img=readJPEG("C:/Users/15799/Desktop/1.jpg")
img_to_Mosaic = function(img, gridSize){
  x=dim(img)[2] 
  y=dim(img)[1] 
  imgNew = img
  k=gridSize
  b=0:(floor(x/k)-1)
  a=0:(floor(y/k)-1)
  for(j in a){
    for(i in b){
      xrange=k*i+1:k
      yrange=k*j+1:k
      if(i == max(b))
        xrange=k*i+1:(x-(k*i))
      if(j == max(a))
        yrange=k*j+1:(y-(k*j))
      imgNew[yrange,xrange,1]=mean(img[yrange,xrange,1])
      imgNew[yrange,xrange,2]=mean(img[yrange,xrange,2])
      imgNew[yrange,xrange,3]=mean(img[yrange,xrange,3])
    }
  }
  writeJPEG(imgNew,target="new.jpg")
}
img_to_Mosaic(img,9)
# 这个函数可以将指定图片转换成马赛克化的图片(马赛克的大小由gridSize控制)
# 函数内部能自动处理各种图片尺寸, 并且处理好图片边缘

大家都学会了嘛!快去自己试试吧!