Фильтрация изображений на C#

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

Теоретические сведения

Фильтр «Яркость/контрастность»
Для изменения яркости на N процентов используется следующая формула:
I = I + N • 128 / 100 (1)
где I – соответственно R, G, B каналы каждой точки изображения.
Уменьшение контрастности на N процентов:
I = (I • (100 – N) + 128 • N) / 100 (2)
Увеличение контрастности на N процентов:
I = (I • 100 – 128 • N) / (100 – N) (3)
Если новое I не попадает в диапазон 0..255 – то его следует урезать.

Фильтр «Цветовой баланс»
Для изменения цветового баланса по одному из каналов R, G, B на N процентов следует вычислить новое значение цветового канала по формуле:
I = I + N • 128 / 100, где I – это R, G или B каждой точки изображения. (4)
Если новое I не попадает в диапазон 0..255 – то его следует урезать.

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

Применение ядра свертки - vscode.ru

Ядро свертки представляет собой матрицу размером 3х3, 5х5, 7х7 и т.д., на которой определена некоторая функция. Ядро свертки называется окном, а заданная на нем функция – весовой или функцией окна. Каждому элементу окна соответствует число, называемое весовым множителем. Совокупность всех весовых множителей и составляет весовую функцию. Нечетные размеры окна необходимы для однозначного определения центрального элемента.

По сути, ядро свертки является фильтром, который позволяет усилить или ослабить компоненты изображения. Фильтрация осуществляется перемещением окна фильтра по изображению. Весовая функция в процессе перемещения остается неизменной. В каждом положении окна происходит операция свертки – линейная комбинация значений элементов изображения:

Операция свертки – линейная комбинация значений элементов изображения - vscode.ru

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

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

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

matrixBorder

Для решения этой проблемы требуется создание промежуточного изображения. Идея в том, чтобы создавать временное изображение с размерами (width + 2 • gap / 2, height + 2 • gap / 2, где width и height – ширина и высота фильтруемого изображения, а gap – размерность матрицы свертки). В центр изображения копируется входная картинка, а края заполняются крайними пикселями изображения. Размытие применяется к промежуточному буферу, а потом из него извлекается результат.

Решение проблемы отсутствия «соседей» у крайних пикселей

При использовании алгоритма увеличения резкости подчеркиваются различия между цветами смежных пикселей и выделяются незаметные детали. В ядре резкости центральный коэффициент больше 1, а окружен он отрицательными числами, сумма которых на единицу меньше центрального коэффициента. Таким образом, увеличивается любой существующий контраст между цветом пикселя и цветами его соседей. При обработке каждого пикселя в изображении используется ядро резкости размерами 3×3:

theconvolutionmatrix1

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

theconvolutionmatrix2

Описание алгоритмов

Изменение яркости
В функцию изменения яркости передается значение цвета текущего пикселя, текущее положение ползунка (poz) изменения яркости и максимальное значение, которое он может принимать (length).

1) Вычисляется количество процентов N = (100 / lenght) * poz.
2) По формуле (1) для каждого цветового канала рассчитывается новое значение.
3) Контролируем переполнение переменных:
ЕСЛИ I < 0, ТО I = 0,
ЕСЛИ I > 255, ТО I = 255,
где I – соответственно R, G, B пикселя.
4) return значения цвета пикселя.

Изменение контрастности

В функцию изменения контрастности передается значение цвета текущего пикселя, текущее положение ползунка (poz) изменения контрастности и максимальное значение, которое он может принимать (length).
1) Вычисляется количество процентов N = (100 / lenght) * poz.
2) ЕСЛИ N < 0, то новое значение цвета каждого канала рассчитывается (N берется по модулю) по формуле (2)
ИНАЧЕ по формуле (3).
3) Контролируем переполнение переменных:
ЕСЛИ I < 0, ТО I = 0,
ЕСЛИ I > 255, ТО I = 255,
где I – соответственно R, G, B пикселя.
4) return значения цвета пикселя.

Изменение цветового баланса

В функцию изменения цветового баланса по соответствующему каналу передается значение цвета текущего пикселя, текущее положение ползунка (poz) изменения цветового баланса и максимальное значение, которое он может принимать (length).
1) Вычисляется количество процентов N = (100 / lenght) * poz.
2) По формуле (4) для соответствующего цветового канала рассчитывается новое значение.
3) Контролируем переполнение переменных:
ЕСЛИ I < 0, ТО I = 0,
ЕСЛИ I > 255, ТО I = 255,
где I – соответствующий (R, G или B) канал цвета пикселя.
4) return значения цвета пикселя.

Повышение резкости и размытие

В функцию передаются значения ширины и высоты редактируемого изображения, матрица пикселей этого изображения, размерность матрицы свертки и сама матрица.
1) Создание временной матрицы расширенного изображения и ее заполнение.
2) Применение ядра свертки для каждого пикселя, при этом контролируем переполнение переменных (0…255 для каждого канала). Новые значения цветов пикселей заносятся в отдельную матрицу (newpixel)
3) Возвращение функцией матрицы newpixel.

Описание структуры ПО

Для построения пользовательского интерфейса применяется графиче-ская подсистема Windows Forms. Во время выполнения программы используются классы Form1, Form2, Form3, BrightnessContrast, ColorBalance, Filter, которые включают следующие методы:
Brightness – метод, изменяющий яркость текущей точки.
Contrast – метод, изменяющий контрастность текущей точки.
ColorBalance_R – метод, изменяющий цветовой баланс точки по каналу R.
ColorBalance_G – метод, изменяющий цветовой баланс точки по каналу G.
ColorBalance_B – метод, изменяющий цветовой баланс точки по каналу B.
matrix_filtration – метод, выполняющий фильтрацию изображения на основе ядра свертки.

Описание структуры пользовательского интерфейса

Интерфейс программы для фильтрации изображений 1 - vscode.ruИнтерфейс программы для фильтрации изображений 2 - vscode.ru

На рисунках выше представлено главное меню программы. Во вкладке «Файл» находятся кнопки для открытия и сохранения изображения. Во вкладке «Фильтры» представлены инструменты для фильтрации загруженного изображения: «Яркость/контрастность», «Цветовой баланс», «Повысить резкость», «Размыть». При вызове первых двух открываются новые окна, в которых находятся слайдеры для изменения соответствующих компонентов фильтруемого изображения и кнопки «Применить», для сохранения изменений:

Окно программы для простой фильтрации изображений 3 - vscode.ru

Окно программы для простой фильтрации изображений 4 - vscode.ru

Демонстрация работы программы

Исходное изображение:

Фильтрация изображений на C# - vscode.ru

Изменение яркости:

Фильтрация изображений на C# - vscode.ru

Изменение контрастности:

Фильтрация изображений на C# - vscode.ru

Изменение цветового баланса:

Фильтрация изображений на C# - vscode.ru

Повышение резкости:

Фильтрация изображений на C# - vscode.ru

Размытие изображения:

Фильтрация изображений на C# - vscode.ru

Скачать исходник программы можно, нажав на кнопку ниже:

Скачать исходник

 

 

Фильтрация изображений на C#
5 (100%) 6 votes

Поделиться в соц. сетях:

6 комментария(ев) к статье “Фильтрация изображений на C#

Добавить комментарий для Дима Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">