7.1 OpenGL - создание и применение графических фильтров. Введение.

Как известно, существует множество способов изменения и редактирования изображений с помощью цифровых методов. Результат обработки изображений при этом зависит от того, какие операции вы можете произвести с изображением после того, как оно попало на ваш компьютер: вы можете редактировать RGB-компоненты цветов с целью получения наилучшего цветового баланса. Вы можете увеличить или уменьшить яркость изображения, редактировать его резкость или размывать отдельные элементы с помощью различных графических фильтров. Мы рассмотрим крайне популярные эффекты, повсеместно используемые в компьютерной графике:
  • Инверсия цветов.
  • Размытие.
  • Увеличение резкости.
  • Тиснение.
  • Акварельный эффект.

Матрица – ядро свертки

Если мы рассмотрим данные эффекты с алгоритмической точки зрения, то не увидим ничего сложного: данные эффекты создаются с помощью матрицы чисел. Эта матрица называется ядром свертки.

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

От коэффициентов ядра зависит то, как изменится редактируемое изображение. Для достижения некоторых эффектов необходимо последовательно применить к изображению не одну, а несколько матриц.

Инверсия цветов

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

Алгоритм размытия

Для того, чтобы размыть изображение, нам потребуется считать в память значения RGB-составляющих цвета каждого пикселя. После чего ядро размывания будет применено ко всем составляющим компонентам цвета всех пикселей редактируемого изображения:
Уроки OpenGL + C#: Матрица для фильтра Рисунок 1. Матрица для фильтра "Размытие".
Для того чтобы определить цвет пикселя, находящегося под центром ядра, необходимо провести умножение весовых коэффициентов ядра с соответствующими значениями цвета редактируемого изображения. После этого результаты суммируются.

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

Чтобы увеличить ядро размытия, вы можете:
  • использовать ядро большего размера (так цвет будет распределяться среди большего количества соседних пикселей);
  • изменять коэффициенты таким образом, чтобы уменьшить влияние центрального коэффициента;
  • выполнить фильтрацию изображения не однократно;

Алгоритм увеличения резкости

Создавая эффект увеличения резкости, мы выполняем все тот же алгоритм, но используем другое ядро, так как теперь нашей целью является увеличение резкости изображения. Ядро G для увеличения резкости:
Уроки OpenGL + C#: Матрица для фильтра Рисунок 2. Матрица для фильтра "Увеличение резкости".
Как и в предыдущем случае, мы по отдельности обрабатываем RGB-составляющие, после чего формируем значения цвета обрабатываемого пикселя. Для увеличения контраста между центральным пикселем и соседями используются отрицательные весовые коэффициенты.

Таким образом, результирующее изображение стало более четким, чем оригинал. По сути дополнительные детали возникли из ничего -  это просто увеличенный контраст между цветами пикселей.

Алгоритм тиснения

Тиснение выполняется аналогично, но в данном случае мы используем не одну матрицу, а несколько.
Уроки OpenGL + C#: Матрица для фильтра Рисунок 3.1 Матрица для фильтра "Тиснение": шаг первый.
В то время как ядра размытия и резкости имели сумму коэффициентов равную единице, в данном случае сумма весов в ядре тиснения равна 0. Если сумма коэффициентов не будет равна 0, мы получим отклонение к какому-то конкретному цвету.

Полученное значение цвета будет дополнительно обработано (усреднено) и приведено к диапазону 0-255 (подробнее вы сможете увидеть при реализации данного фильтра). Меняя значения позиций 1 и -1, мы можем получить измененное направление подсветки.
Уроки OpenGL + C#: Матрица для фильтра Рисунок 3.2. Матрица для фильтра "Тиснение": шаг второй.

Алгоритм акварелизации

Название акварельного фильтра говорит само за себя: результирующее изображение будет выглядеть так, как будто его нарисовали акварелью. На первом этапе применения данного фильтра мы сгладим цвета редактируемого изображения.
Уроки OpenGL + C#: Матрица для фильтра Рисунок 4.1. Матрица для фильтра "Акварельный эффект": шаг первый.
На следующем этапе мы увеличим резкость переходов для завершения создания эффекта акварели.
Уроки OpenGL + C#: Матрица для фильтра Рисунок 4.2. Матрица для фильтра "Акварельный эффект": шаг второй.
Вот и все. Немного подкорректировав параметры матрицы, мы можем получать как более резкий, так и более плавный эффект акварелизации. br />

Нет доступа к просмотру комментариев.

^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×