#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