Заменить / перекрасить все пиксели одним цветом в изображении с интерполяцией из соседних пикселей - PullRequest
2 голосов
/ 23 мая 2019

У меня есть изображение GIF, сгенерированное программой, где каждое выходное значение представлено своим цветом через прикрепленную цветовую палитру.Мне нужно заменить одно значение, то есть цвет изображения с интерполяцией из соседних пикселей.Так как у меня нет возможности изменить вывод программ, мне нужно изменить выходное изображение.Полученное изображение будет сохранено в формате PNG или GIF.

Я могу легко извлечь (замаскировать) все пиксели, которые необходимо перекрасить, поскольку они имеют фиксированный цвет, но я не смог найти решение о том, как заменитьцвет одного / всех пикселей в imagemagick с интерполированным цветом из соседних пикселей.Есть ли способ сделать это в imagemagick?

Необработанные значения пикселей пропорциональны физическим значениям, поэтому было бы хорошо, если бы интерполяция могла быть выполнена для необработанных значений, которые затем впоследствии преобразовывались в цвет с помощью предоставленной цветовой палитры.

Прикрепленное изображение показывает оригинал (слева) и обработанный вручную в GIMP (справа).

Original and processed image

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Один из методов заключается в замене нарушающего цвета на фон, а затем для устранения контуров используется комбинация эрозии и расширения морфологии.

С учетом ...

input.png

convert input.png \
        -fill white -fuzz 10% -opaque black \
        -morphology Erode Diamond \
        -morphology Dilate Diamond \
        output.png

output.png

Это не настоящая интерполяция от ближайших соседей, но близко. Также обратите внимание на ошибки округления по краям.

edge rounding errors


Обновлено

Или, как указал Фред в комментариях, просто используйте -morphology Smooth Diamond вместо Erode + Dilet

convert input.png \
        -fill white -fuzz 10% -opaque black \
        -morphology Smooth Diamond \
        output.png
2 голосов
/ 24 мая 2019

Добавляя немного к предложению ксеноида, вы хотите создать изображение маски и использовать его для объединения медианного фильтра с оригиналом, так что изменяется только область вокруг линии. Использование изображения emcconville и ImageMagick:

enter image description here

convert img.png \
\( -clone 0 -statistic median 3x3 \) \
\( -clone 0 -fuzz 10% -fill white +opaque black -fill black +opaque white -negate \) \
-compose over -composite \
result.png


enter image description here

Альтернативный, но немного более длительный подход - поместить маску в альфа-канал отфильтрованного изображения, а затем объединить ее с оригиналом, что дает точно такой же результат:

convert img.png \
\( -clone 0 -statistic median 3x3 \) \
\( -clone 0 -fuzz 10% -fill white +opaque black -fill black +opaque white -negate \) \
\( -clone 1 -clone 2 -alpha off -compose copy_opacity -composite \) \
-delete 1,2 \
-compose over -composite \
result.png


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...