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

#graphics #image-processing #antialiasing #alphablending #flood-fill

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

Вопрос:

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

Моя проблема в том, что если вы нарисуете что-то вроде сглаженной красной линии на прозрачном фоне, мой алгоритм заливки заливкой не заполнит большинство полупрозрачных пикселей, оставляя полосы вокруг объектов. Конкретно для этого примера центр линии выделен сплошным красным цветом (т. Е. (255, 255, 0, 0) в формате ARGB), и границы линии также сплошные красные, но альфа этих пикселей варьируется до 1% альфа (т.Е. (1, 255, 0, 0)). В общем, я хочу иметь возможность рисовать, скажем, контур сглаженного круга, заливать заливкой в центре и не оставлять полос.

Какую функцию я использую для сравнения цветов и / или как мне адаптировать алгоритм заливки заливкой, чтобы такие полосы не оставались вокруг объектов?

Я пытался указать алгоритму всегда заполнять пиксель, если его альфа <90%, и это иногда выглядит нормально, но это слишком агрессивно при заполнении слабых линий.

Редактировать: Чтобы уточнить, как это выглядит, где 0-5 представляет красные пиксели с 0, 20, 40, 60, 80 и 100% альфа, изображение сглаженной красной линии может выглядеть следующим образом:

0 0 0 0 0 0 0

0 0 0 3 0 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 0 3 0 0 0

0 0 0 0 0 0 0

Мой текущий алгоритм заливки потоком, заполняющий красным цветом верхний левый угол, заменит все 0 на 5. Оставшиеся 3 точки образуют уродливый ореол вокруг линии.

Ответ №1:

Ваша заливка заливкой должна заменить части цветов RGB, но оставить исходную альфа-версию. Таким образом, вы получаете новый цвет без изменения коэффициента смешивания.

(Если в вашем растровом изображении используется предварительно умноженная альфа-величина, то вам следует масштабировать заменяющий RGB на существующую альфа-величину, но в ваших примерах вы не используете предварительно умноженные альфа-величины.)

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

1. Не могли бы вы объяснить, как это дает приятные результаты? В моем примере с кругом и линией, вы все равно получите полосы вокруг центра линий при таком подходе, насколько я могу видеть, например, если вы замените цвет пикселя, но оставите альфа-значение равным 1%, это все равно будет выглядеть как пустой пиксель.