Заменить цвет области на высоту - PullRequest
0 голосов
/ 22 октября 2018

С помощью команды «конвертировать» я знаю, как заменить цвет области, имеющей координаты и размер, но есть ли способ заменить внутри изображения все области, которые имеют, например, высоту 40 пикселей?Спасибо

Это будет пример входного изображения, где есть 4 зеленых прямоугольника высотой 40 пикселей.

Input.png

И это будетбыть выходом, где эти 4 зеленых прямоугольника были заменены на черные, зная их высоту, но не их координаты, если это возможно.

Out.png

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я постараюсь помочь Марку закончить.Я использую ImageMagick и некоторый код Unix, как указано ниже, с маркировкой подключенных компонентов Imagemagick (-connected-components).

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

convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null:

Objects (id: bounding-box centroid area mean-color):
  0: 256x256+0+0 133.6,134.1 50820 srgb(255,255,255)
  1: 86x40+23+30 65.5,49.5 3440 srgb(0,127,70)
  6: 60x40+42+126 71.5,145.5 2400 srgb(0,127,70)
  4: 86x27+22+80 64.5,93.0 2322 srgb(0,38,255)
  5: 86x27+121+121 163.5,134.0 2322 srgb(0,127,70)
  2: 37x40+127+59 145.0,78.5 1480 srgb(0,127,70)
  3: 36x40+177+59 194.5,78.5 1440 srgb(0,127,70)
  7: 41x32+89+186 109.0,201.5 1312 srgb(255,106,0)


Обратите внимание, что ни один из ваших зеленых, т. Е. Srgb (0,127,70), не имеет высоты выше 40. Все 40 и один - 27. Итак, чтобы продемонстрировать, давайте получим все поля больше 30.

ДляВ приведенном выше коде я сначала выбираю все зеленые объекты, удаляю начальное пространство, извлекаю ограничивающий прямоугольник, который является полем 2, а затем изменяю x на +.

Затем я зацикливаюсь на каждом ограничивающем прямоугольнике и извлекаюзначения ht и левый верхний угол xx и yy.Я проверяю ht против htval = 30, и если он проходит, я заливаю зеленый цвет черным.

htval=30
convert in-1.png in-1_result.png
bboxArr=(`convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null: | grep "srgb(0,127,70)" | sed 's/^[ ]*//' | cut -d\  -f2 | tr "x" "+"`)
num=${#bboxArr[*]}
for ((i=0; i<num; i++)); do
ht=`echo ${bboxArr[$i]} | cut -d+ -f2`
xx=`echo ${bboxArr[$i]} | cut -d+ -f3`
yy=`echo ${bboxArr[$i]} | cut -d+ -f4`
if [ $ht -gt $htval ]; then
convert in-1_result.png -fill black -draw "color $xx,$yy floodfill" -alpha off in-1_result.png
fi
done


enter image description here

Примечаниев приведенном выше примере строку

null: | grep "srgb(0,127,70)" | sed 's/^[ ]*//' | cut -d\  -f2 | tr "x" "+"`)


можно заменить на

null: | awk '/srgb\(0,127,70\)/ && sub(/x/, "+") {print $2}'

ДОПОЛНЕНИЕ:

Вот более компактный метод, использующий awk для выполнения всех операций.фильтрация и сохранение вывода в виде цвета x, y заливки.Затем для обработки требуется только одна команда рисования.

convert in-1.png in-1_result.png
floodfill_arr=(`convert in-1.png \
-define connected-components:verbose=true \
-connected-components 4 \
null: | awk '/srgb\(0,127,70\)/ && sub(/[x]/, "+") && split($2, arr, "+") {if (arr[4]>30) {print " color " arr[3] "," arr[4] " floodfill"}}'`)
echo "${floofill_arr[*]}"

color 42,126 floodfill color 121,121 floodfill color 127,59 floodfill color 177,59 floodfill

convert in-1_result.png -fill black -draw "${floodfill_arr[*]}" -alpha off in-1_result.png


awk сначала находит все строки зеленого цвета, затем заменяет любые x на +, затем разбивает поле $ 2на части массива (arr), используя разделитель полей +, затем проверяет, больше ли поле 4-го arr (ht) больше 30, и если да, то печатает команду -draw для каждого ограничивающего прямоугольника, который проходит тест.

0 голосов
/ 23 октября 2018

Вы можете использовать ImageMagick s "Анализ подключенных компонентов: , чтобы найти все капли в вашем изображении, например:

convert blobs.png -define connected-components:verbose=true  -connected-components 4 null:

ОбразецВыходные данные

Objects (id: bounding-box centroid area mean-color):
  0: 256x256+0+0 133.6,134.1 50820 srgb(255,255,255)
  1: 86x40+23+30 65.5,49.5 3440 srgb(0,127,70)
  6: 60x40+42+126 71.5,145.5 2400 srgb(0,127,70)
  4: 86x27+22+80 64.5,93.0 2322 srgb(0,38,255)
  5: 86x27+121+121 163.5,134.0 2322 srgb(0,127,70)
  2: 37x40+127+59 145.0,78.5 1480 srgb(0,127,70)
  3: 36x40+177+59 194.5,78.5 1440 srgb(0,127,70)
  7: 41x32+89+186 109.0,201.5 1312 srgb(255,106,0)

Существует строка заголовка, которая сообщает, что представляют собой все поля, а затем по одной строке на каждый найденный BLOB-объект. Не обращайте внимания на первую строку без заголовка, поскольку это белый фон - см. Последнийполе имеет вид srgb(255,255,255).

Посмотрите на вторую и последнюю строку, она имеет ширину 36 пикселей и высоту 40 пикселей, а средний цвет равен srgb(0,127,70).заполните или измените цвет.

Если вы хотите найти капли высотой 40 пикселей, пропустите их через grep следующим образом:

convert blobs.png \
   -define connected-components:verbose=true \
   -connected-components 4 null: | grep "x40+"

, и вы получите все40 больших объектов:

  1: 86x40+23+30 65.5,49.5 3440 srgb(0,127,70)
  6: 60x40+42+126 71.5,145.5 2400 srgb(0,127,70)
  2: 37x40+127+59 145.0,78.5 1480 srgb(0,127,70)
  3: 36x40+177+59 194.5,78.5 1440 srgb(0,127,70)

Я добавлю еще немного завтра, если вы не видите, как это закончить - уже поздно.

...