本文已参加「新人创作礼」活动,一起开启掘金创作之路。
这次带来的是通过 RStudio 进行可视化处理。
大家感兴趣的可以通过各种搜索引擎来搜索以下案例进行观赏:
案例展示
- 可视化案例:他山之石
- 可视化的艺术:设计原则
- 可视化的技术:实现手段
- The Fallen of World War II
- [TED] Hans Rosling 2006
案例研究: 婚礼照片的处理
上面的图片是我自己制作的对于婚礼照片的数据分析和可视化,其中通过提取照片的主色彩和时间戳信息,得到了整个婚礼进行过程中拍摄的照片的时间变化和色调变化。
其中提取每张照片的主色调是一个关键环节,在这里,我们要更进一步的学习对图片的马赛克化处理。
目标
下面是我们需要了解学习的内容,以及提出了几个问题,当然在最后也会给出相应的代码。
- 图像的读取和保存
- 图像的马赛克化
代码
# 图像的读取
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. 马赛克块的大小调整(通过函数的一个参数调整)
原图和马赛克化后的效果
# 将马赛克程序包装成一个函数:
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控制)
# 函数内部能自动处理各种图片尺寸, 并且处理好图片边缘
大家都学会了嘛!快去自己试试吧!