Удаление артефактов черной кромки с прозрачного изображения

У меня есть набор прозрачных изображений PNG с черными артефактами по краям, например:

Пример изображения

Я ищу способ автоматически очищать границы. Я попытался просто замаскировать пиксели с определенным значением RGB, но сами изображения также могут содержать черные пиксели, которые затем отфильтровываются. Я использую Python3 и opencv3 / PIL.

Мой вопрос: Как избавиться от черных краев, сохранив при этом черные пиксели, которые не являются частью края?

РЕДАКТИРОВАТЬ: Как указано ниже в usr2564301, очень немногие (если таковые имеются) краевые пиксели являются чисто черными. Мне все еще нужно удалить их, поэтому я хотел бы использовать какое-то пороговое значение и удалить пиксели, которые являются соседями с прозрачным пикселем и либо:

  • Темнее, чем порог, или
  • Темнее как минимум на пороговое значение, чем любой соседний непрозрачный пиксель.

person Nee    schedule 31.01.2018    source источник
comment
Не все края черные, только некоторые пиксели. Очень, очень на самом деле. Щелкая здесь и там, я даже не могу найти один. Что вы хотите сделать с пикселями на границе, которые не являются черными, темными или даже средними, но все же «темнее, чем случайный смежный пиксель»?   -  person Jongware    schedule 31.01.2018
comment
Хороший улов! В этом случае, я думаю, имеет смысл рассмотреть какое-то пороговое значение и удалить пиксели, которые 1) граничат с прозрачным пикселем и 2) по крайней мере на threshold темнее, чем любой из окружающих непрозрачных пикселей, или, по крайней мере, threshold светлее чистого черного.   -  person Nee    schedule 31.01.2018
comment
Как правило, вы не можете получить настоящую косую черту в двоичном режиме.   -  person Kinght 金    schedule 31.01.2018
comment
использовать канал прозрачности, чтобы найти все пиксели объекта (создать из него маску). Затем удалите эту маску или удалите все точки маски, где есть резкие изменения цвета на границе со значением пикселя, близким к черному.   -  person Micka    schedule 31.01.2018
comment
Как мне найти изменения цвета? Это единственное, что я не смог найти объяснения, как это сделать, и повторение по всем пикселям (а затем проверка четырех или более соседей) кажется ненужным.   -  person Nee    schedule 31.01.2018


Ответы (2)


Попробуйте взять альфа-канал и размыть его на пару пикселей. Я иллюстрирую эту технику с помощью ImageMagick, потому что это проще, но вы можете сделать то же самое с OpenCV:

convert pinkboythingwithcathead.png \( +clone -alpha extract -morphology erode disk:2 \) -compose copy-alpha -composite result.png

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

person Mark Setchell    schedule 31.01.2018
comment
Это хорошая идея, но при этом удаляются не только абсолютные краевые пиксели, не так ли? - person Nee; 31.01.2018
comment
О, я вижу, что это то, что Мика предлагала в комментариях - более или менее. - person Mark Setchell; 31.01.2018
comment
Это скорее концептуальный ответ - я не уверен, как он должен выглядеть. - person Mark Setchell; 31.01.2018

Вы можете сглаживать края альфа-канала в ImageMagick следующим образом:

Вход:

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

convert image.png -channel a -blur 0x2 -level 50x100% +channel result.png

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

Отрегулируйте 2, используя меньшие значения, чем 2, если черная рамка тоньше, и больше 2, если черная рамка более широкая.

person fmw42    schedule 31.01.2018