将图像分解成正方形单元格的网格,用其包含的平均颜色为每个单元格着色以及将所得的平均值导出为csv文件的方法是什么?
由于ppm是简单的图像格式,因此转换为ppm格式可能是一个不错的起点,但是接下来呢?
动机:我正在制作游戏世界地图,并希望将颜色编码的地图(颜色表示生物群系类型)转换为其他源代码文件可以读取的数据文件(例如csv)。
由于游戏地图会随着游戏的开发而更新,因此我希望可以自动执行此过程,因此我认为基于代码的解决方案将是最佳选择。它是用C#编写的。
答案 0 :(得分:2)
您可以使用 ImageMagick ,它已安装在大多数Linux发行版中,并且可用于macOS和Windows。
仅在终端(或Windows中的命令提示符)中,从此500x256图像开始:
magick start.png -resize 3x2\! -depth 8 -compress none ppm:
P3
3 2
255
189 0 66 189 0 66 189 0 66
66 0 189 66 0 189 66 0 189
已经调整了图像的大小,并将颜色平均为3x2图像(如果需要,可以选择其他尺寸),然后将输出打印为文本PPM文件。
大小为3x2,第一行是3个像素,其中rgb(189,0,66)主要是红色,第二行是3个像素,其rgb(66,0,189)主要是蓝色。
我会让您格式化为CSV格式:-)
您可以在此处调整大小,然后再放大以查看平均超过8x3块的效果:
magick start.png -resize 8x3\! -depth 8 -scale 400x result.png
根据您喜欢的解析方式,可以以略有不同的格式产生相同的信息:
magick start.png -resize 8x3\! -depth 8 txt:
# ImageMagick pixel enumeration: 8,3,65535,srgb
0,0: (54998,0,10537) #D60029 srgb(214,0,41)
1,0: (54998,0,10537) #D60029 srgb(214,0,41)
2,0: (54998,0,10537) #D60029 srgb(214,0,41)
3,0: (54998,0,10537) #D60029 srgb(214,0,41)
4,0: (54998,0,10537) #D60029 srgb(214,0,41)
5,0: (54998,0,10537) #D60029 srgb(214,0,41)
...
...
3,1: (32896,0,32896) #800080 purple
4,1: (32896,0,32896) #800080 purple
5,1: (32896,0,32896) #800080 purple
6,1: (32896,0,32896) #800080 purple
7,1: (32896,0,32896) #800080 purple
0,2: (10537,0,54998) #2900D6 srgb(41,0,214)
5,2: (10537,0,54998) #2900D6 srgb(41,0,214)
6,2: (10537,0,54998) #2900D6 srgb(41,0,214)
7,2: (10537,0,54998) #2900D6 srgb(41,0,214)
答案 1 :(得分:2)
这里是一个使用Imagemagick的bash脚本循环,以获取图像块的平均颜色并写入csv文件
输入(256x256):
要获得图像块的适当平均值,应使用-scale而不是-resize。因此,在这里,我从图像中得到了64x64色块的4x4平均值集(256/4 = 64)。然后,我依次遍历行和列,然后获取颜色。我将每行的颜色存储在字符串“行列表”中,之间用逗号隔开。收集每行颜色后,我将其写入文本文件。重复下一行。
convert image.png -scale 4x4! image2.png
for ((j=0; j<4; j++)); do
for ((i=0; i<4; i++)); do
rowcolor=`convert image2.png -crop 1x1+$i+$j +repage -format "rgb(%[fx:round(255*u.r)]_%[fx:round(255*u.g)]_%[fx:round(255*u.b)])" info:`
if [ $i -eq 0 ]; then
rowlist="$rowcolor"
else
rowlist="$rowlist,$rowcolor"
fi
done
echo "$rowlist" >> image_colors.txt
done
结果文本文件中的数据如下:
rgb(8_0_247),rgb(50_0_205),rgb(50_0_205),rgb(8_0_247)
rgb(50_0_205),rgb(157_0_98),rgb(157_0_98),rgb(50_0_205)
rgb(50_0_205),rgb(157_0_98),rgb(157_0_98),rgb(50_0_205)
rgb(8_0_247),rgb(50_0_205),rgb(50_0_205),rgb(8_0_247)
您可以根据需要删除rgb(),只需保留颜色值即可。我使用_来分隔值,以便逗号只能在rgb(...)颜色之间使用。但是,您可能更喜欢使用制表符或空格作为文件分隔符,以便颜色值为r,g,b而不是r_g_b。
为了避免逗号混淆,最好将一个颜色写为十六进制值。为此,请使用:
convert image.png -scale 4x4! image2.png
for ((j=0; j<4; j++)); do
for ((i=0; i<4; i++)); do
rowcolor=`convert image2.png -depth 8 -crop 1x1+$i+$j +repage -format "#%[hex:u.p]" info:`
if [ $i -eq 0 ]; then
rowlist="$rowcolor"
else
rowlist="$rowlist,$rowcolor"
fi
done
echo "$rowlist" >> image_colors.txt
done
会在文本文件中产生以下值。
#0800F7,#3200CD,#3200CD,#0800F7
#3200CD,#9D0062,#9D0062,#3200CD
#3200CD,#9D0062,#9D0062,#3200CD
#0800F7,#3200CD,#3200CD,#0800F7
截至2017年6月1日版本的Imagemagick 6和7,Imagemagick才开始使用%[hex:]。