Найдите цветное поле на изображении и создайте файл маски

#imagemagick #image-masking

Вопрос:

Я хотел бы создать горячую папку для моей камеры движения, в которую я могу помещать изображения, помечающие области, которые должны быть исключены при распознавании движения с помощью маски *pgm. На этих изображениях есть небольшая область, отмеченная прозрачной рамкой с контуром пурпурного цвета. Моя цель состоит в том, чтобы заменить эту рамку и контур черным сплошным прямоугольником, а остальную часть изображения белым. (Пытался разместить образцы здесь, но для этого недостаточно репутации.)

Я знаю, как сделать это «пешком» с помощью gimp, но я не могу придумать умный и простой способ добиться этого с помощью imagemagick.

Я попытался поискать в гугле решения с-обрезкой и-виртуальным-пикселем, но безуспешно. Любая помощь будет признательна.

Комментарии:

1. Было бы полезно получить репрезентативное изображение и ожидаемый результат…

2. i.postimg.cc/bY2P2y7j/source.jpg

3. i.postimg.cc/WzrPR8G4/result.jpg

4. Пожалуйста, найдите ссылки на источник и желаемый результат выше.

5. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.

Ответ №1:

Я сделаю это шаг за шагом, чтобы вы могли видеть промежуточные части на случай, если вы находитесь в Windows и bash не работаете.

Во-первых, давайте превратим все, что не соответствует 10% вашего пурпурного цвета , а именно rgb(225,75,130) в зеленый лайм:

 magick source.jpg -fill lime -fuzz 10%  opaque "rgb(225,75,130)" result.png   

введите описание изображения здесь

Хорошо, теперь давайте получим поле обрезки — то есть весь постоянный мусор, который ImageMagick мог бы обрезать, чтобы сосредоточиться на пурпурном бите.

 magick source.jpg -fill black -fuzz 10%  opaque "rgb(225,75,130)" -format '%@' info: 14x66 426 118  

Таким образом, ваш пурпурный прямоугольник имеет размер 14×66 пикселей и расположен со смещением 426,118 от верхнего левого края. Теперь мы хотим получить их в bash переменных w,h,x,y. Нам нужно измениться x и в пространстве, используя tr :

 read w h x y lt; lt;(magick source.jpg -fill black -fuzz 10%  opaque "rgb(225,75,130)" -format '%@' info: | tr 'x ' ' ')  

Если мы напечатаем это, то получим:

 echo $w, $h, $x, $y 14, 66, 426, 118  

Теперь мы хотим нарисовать прямоугольник, но для этого нужны левый верхний и правый нижний, поэтому нам нужно немного посчитать:

 ((x1=x w)) ((y1=y h))  

Хорошо, теперь мы можем загрузить исходное изображение, сделать его полностью белым, а затем нарисовать наш черный прямоугольник:

 magick source.jpg -threshold -1 -fill black -draw "rectangle $x,$y $x1,$y1" -depth 8 mask.pgm  

Итак, все это сводится к:

 #!/bin/bash  read w h x y lt; lt;(magick source.jpg -fill black -fuzz 10%  opaque "rgb(225,75,130)" -format '%@' info: | tr 'x ' ' ') echo $w, $h, $x, $y ((x1=x w)) ((y1=y h)) magick source.jpg -threshold -1 -fill black -draw "rectangle $x,$y $x1,$y1" -depth 8 mask.pgm  

Есть и другие (возможно, более элегантные) способы сделать это, используя заливку и/или подключенные компоненты, но я не хотел, чтобы это зависело от того, что ваша пурпурная коробка «водонепроницаема», т. Е. Не полагалась на непрерывность и полноту сторон.

Кроме того, если размер ваших изображений известен и постоянен, вы можете избежать перезагрузки оригинала и сделать его белым, установив пороговое значение, как я делаю в последней строке, и просто создать холст известных размеров, т. Е.:

 magick -size ${W}x${H} xc:white -fill black -draw "rectangle $x,$y $x1,$y1" -depth 8 mask.pgm