Какие бывают алгоритмы нечеткой заливки?

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

Во многих случаях области моего изображения будут иметь области, которые в основном одноцветные, но которые окаймлены пикселями, которые немного светлее или темнее. Я хотел бы знать алгоритм для "нечеткой" заливки, которая не покидает эти пограничные пиксели. Я попытался заполнить все пиксели двумя разными простыми метриками расстояния исходного пикселя:

  1. Манхэттенское расстояние для всех трех цветовых компонентов: красного, зеленого и синего.
  2. максимальное расстояние между компонентами цвета.

Ни один из них не работает, часто оставляя границы и иногда заполняя соседние области визуально отличным, но «близким» цветом.

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


person Edward    schedule 02.02.2011    source источник
comment
Вы пытаетесь сделать границу с альфа-каналом, чтобы похожие пиксели не изменились на цвет заливки, а на средневзвешенное значение между их существующим цветом, предыдущим цветом области и цветом заливки?   -  person Peter Taylor    schedule 03.02.2011
comment
Похоже, вы хотите сделать сглаживание по границам. Я подозреваю, что RGB - неподходящее место для работы, так как это может привести к довольно странным эффектам. Вместо этого вы можете использовать HSV.   -  person Jim Mischel    schedule 03.02.2011
comment
Питер Тейлор: Эта конкретная стратегия мне не приходила в голову, но я, возможно, захочу ее попробовать. Спасибо. Джим Мишель - Я мог бы перевести это на HSV, но я не уверен, что буду делать после этого. Надеюсь, это уменьшит заполнение смежных областей, но даже с различными метриками расстояния я не уверен, что это поможет удалить сильно у меня границы с альфа-d (где я перемещаюсь на 3 пикселя или около того от RGB 0xFFFFFF до 0x808080 до 0x000000, оставляя некрасивую серую границу после заливки). Я бы не смог просто проигнорировать такую ​​большую разницу в стоимости. Спасибо за предложение.   -  person Edward    schedule 03.02.2011


Ответы (3)


Использование фактического расстояния кажется естественным: D = Sqrt (R ^ 2 + G ^ 2 + B ^ 2)

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

Измените допуск от 0 до Sqrt (255 ^ 2 + 255 ^ 2 + 255 ^ 2), пока не увидите желаемый эффект.

person Fantius    schedule 04.02.2011

Может быть, вы могли бы попробовать использовать качества локальных пикселей, а не исходных пикселей. Вы можете создать эффект, очень похожий на анизотропный диффузионный фильтр. Поставить соседа в очередь, если градиент между текущим пикселем (в заливке) и соседним пикселем достаточно низкий.

person tkerwin    schedule 04.02.2011

Допуск следует устанавливать не одним числом, а диапазоном. Скажем, от 20% до 50% будет означать, что когда разница в цвете составляет 20%, вы полностью меняете цвет этого пикселя. Когда он больше 50%, вы не заполняете этот пиксель. И когда разница лежит в диапазоне от 20% до 50%, вы смешиваете старый цвет с новым цветом с соотношением (d-t_min) / (t_max-t_min), где d - разница в цвете, а t_max и t_min - ваш диапазон допуска. (выражается в 0 ... 1). Я никогда не видел, чтобы такой алгоритм реализовывался; может я просто это придумал.

person Juribiyan    schedule 01.07.2013