摄影马赛克是一种将现有图像重新生成为缩略图马赛克的技术。原始像素的颜色应该大致类似于覆盖图块的颜色。
此图像的源代码在 github 上共享,但它非常适合特定的世界地图任务。
是否有将现有图像重新生成为一组给定缩略图的拼贴/马赛克的通用解决方案?
摄影马赛克是一种将现有图像重新生成为缩略图马赛克的技术。原始像素的颜色应该大致类似于覆盖图块的颜色。
此图像的源代码在 github 上共享,但它非常适合特定的世界地图任务。
是否有将现有图像重新生成为一组给定缩略图的拼贴/马赛克的通用解决方案?
下面是概念证明,作为一个简单的bash
脚本,使用 ImageMagick 来完成图像处理工作。
#!/bin/bash
# Take all JPEGS in current directory and get their average RGB color and name in "tiles.txt"
for f in *.jpg; do convert $f -depth 8 -resize 1x1! -format "%[fx:int(mean.r*255)] %[fx:int(mean.g*255)] %[fx:int(mean.b*255)] $f\n" info: ; done > tiles.txt
# Create empty black output canvas same size as original map
convert map.png -threshold 100% result.png
# Split map into tiles of 10x10 and get x,y coordinates of each tile and the average RGB colour
convert map.png -depth 8 -crop 10x10 -format "%X %Y %[fx:int(mean.r*255)] %[fx:int(mean.g*255)] %[fx:int(mean.b*255)]\n" info: |
while read x y r g b; do
thumb=$(awk -v R=$r -v G=$g -v B=$b '
NR==1{nearest=3*255*255*255;tile=$4}
{
tr=$1;tg=$2;tb=$3
# Calculate distance (squared actually but sqrt is slow)
d=((R-tr)*(R-tr))+((G-tg)*(G-tg))+((B-tb)*(B-tb))
if(d<nearest){nearest=d;tile=$4}
}
END{print tile}
' tiles.txt)
echo $x $y $r $g $b $thumb
convert result.png -draw "image copy $x,$y 10,10 \"$thumb\"" result.png
done
我没有无穷无尽的缩略图,但这个概念似乎有效。颜色之间距离的数学计算已经完成awk
,显然可以在感知上更均匀的色彩空间中完成,并且可以大大加快速度。另一个想法,为了避免重复,可能是将瓷砖分成相似的颜色,然后从最近的箱子中随机取一个,而不是绝对最近的一个。
该文件tiles.txt
如下所示:
111 116 109 0.jpg
82 88 81 1.jpg
112 110 95 10.jpg
178 154 150 100.jpg
190 169 163 101.jpg
187 166 163 102.jpg
...
...