几年前我也写过一类似的程序,没有用到ImageMagick,就是比较长,可用于彩色图像.
library(biOps)
# image bricks;
Pics = list.files('D:/Xunlei/')
Pics = Pics[grep('.jpg',Pics)]
Pics.ls = as.list(rep(NA,length(Pics)))
for(i in 1:length(Pics)){
img= readJpeg(paste('D:/Xunlei/',Pics,sep = ''))
w = 30;h = 30
x.scale = w/dim(img)[2]
y.scale = h/dim(img)[1]
img= imgAverageShrink(img,x.scale,y.scale)
Pics.ls[] = img
}
# main image
Img = readJpeg('D:/Xunlei/000(324).jpg')
W = 80;H = 60
X.scale = W/dim(Img)[2]
Y.scale = H/dim(Img)[1]
Img= imgAverageShrink(Img,X.scale,Y.scale)
plot(Img)
# RGB channels of main image
RGB.tar = matrix(NA,nrow = 3,ncol = W*H)
RGB.tar[1,] = as.vector(Img[,,1])
RGB.tar[2,] = as.vector(Img[,,2])
RGB.tar[3,] = as.vector(Img[,,3])
RGB.pics = matrix(NA,nrow = 3,ncol = length(Pics))
for(i in 1:length(Pics)) RGB.pics[,i] = c(mean((Pics.ls[][,,1])),mean((Pics.ls[][,,2])),mean((Pics.ls[][,,3])))
Pics.order = rep(NA,W*H)
for(i in 1:length(Pics.order))
Pics.order = which.min(sqrt(
(RGB.pics[1,]-RGB.tar[1,i])^2+
(RGB.pics[2,]-RGB.tar[2,i])^2+
(RGB.pics[3,]-RGB.tar[3,i])^2 ))
M = array(NA,c(H*h,W*w,3));i = 0
for(m in 1:W){
for(n in 1:H){i = i+1
M[((n-1)*h+1):(n*h),((m-1)*w+1):(m*w),]= Pics.ls[[Pics.order]]
}}
M = imagedata(M)
plot(M)
writeJpeg('Xinhai.jpeg',M)