Конвертировать изображение в CSV - PullRequest
0 голосов
/ 26 января 2019

Что нужно, чтобы разбить изображение на сетку из квадратных ячеек, закрасить каждую ячейку средним цветом, который она содержит, и экспортировать полученные средние значения в виде файла CSV?

Поскольку ppms - это простые форматы изображенийпреобразование в формат ppm может быть хорошим началом, но что дальше?

Мотивация: Я делаю карту игрового мира и хочу преобразовать карту с цветовой кодировкой (цвета указывают на тип биома) в файл данных (такой как csv), который читается другими файлами исходного кода.

Поскольку карта игры будет обновляться по мере ее разработки, я надеюсь автоматизировать этот процесс, поэтому я считаю, что решение на основе кода будет оптимальным;это написано в C #.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вот небольшой цикл скриптов bash, использующий Imagemagick для получения средних цветов блоков изображения и записи в файл csv

Ввод (256x256):

enter image description here

Чтобы получить правильное среднее значение для блоков изображения, следует использовать -scale вместо -resize. Итак, здесь я получаю набор средних значений размером 4x4 из 64x64 блоков цветов из изображения (256/4 = 64). Затем я перебираю каждый блок в строках, затем в столбцах и получаю цвета Я храню цвета для каждой строки в строке «rowlist» с запятыми между ними. Собрав каждый ряд цветов, я записываю его в текстовый файл. Повторите для следующего ряда.

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


Использование% [hex:] является новым для Imagemagick с 2017-06-01 версий Imagemagick 6 и 7.

0 голосов
/ 26 января 2019

Вы можете использовать ImageMagick , который установлен на большинстве дистрибутивов Linux и доступен для macOS и Windows.

Только в терминале (или командной строке в Windows), начиная с этого образа 500x256:

enter image description here

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

enter image description here


В зависимости от того, что вам нравится при разборе, вы можете выдавать одну и ту же информацию в несколько ином формате:

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)
...