Свертка изображения с предварительно умноженным альфа - PullRequest
1 голос
/ 19 февраля 2011

Я пытаюсь реализовать свертку изображения с матрицей 3х3, где мои цветовые компоненты (каждый в диапазоне от 0 до 255) хранятся с использованием предварительно умноженной альфа. Все учебные пособия (например, http://www.codeproject.com/KB/GDI-plus/csharpfilters.aspx), которые я могу найти, описывают только выполнение сверточных вычислений для компонентов RGB, и ничего не упоминается об альфа-компоненте.

Мой текущий код оставляет альфа-компонент как есть. Фильтры, которые я пробовал, выглядят хорошо при работе с изображениями, где каждый пиксель уже имеет полный набор альфа. Когда у меня есть частично прозрачные пиксели, например Фильтр boxblur выглядит странно, потому что цвета пикселей не распространяются в прозрачные области, когда происходит размытие.

Какие вычисления я выполняю для альфа-компонента при запуске алгоритма свертки и как мне обращаться с предварительно умноженными альфа-значениями при установке конечного значения пикселя? Кроме того, нужно ли добавить смещение фильтра к альфа-компонент?

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

Спасибо.

1 Ответ

2 голосов
/ 19 февраля 2011

Я думаю, что правильный путь - это сначала вычислить только альфа свертки, используя стандартные формулы

alpha = a1*m1 + a2*m2 + a3*m3 +
        a4*m4 + a5*m5 + a6*m6 +
        a7*m7 + a8*m8 + a9*m9;

, затем вы должны вычислить свертку исходного (без предварительного умножения) r / g /b и затем умножить на альфа

red = (r1/a1*m1 + r2/a2*m2 + r3/a3*m3 +
       r4/a4*m4 + r5/a5*m5 + r6/a6*m6 +
       r7/a7*m7 + r8/a8*m8 + r9/a9*m9) * alpha;

с аналогичной формулой для зеленого и синего.

Более эффективным способом было бы сначала удалить предварительное умножение (т. е. заменить r на r / a, gс g / a и b с b / a) выполнение свертки всех компонентов с использованием стандартных формул, а затем повторное умножение (замена r на r * a, g на g * a и b на b * a).

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