Представляем вашему вниманию исходник программы для простой фильтрации растровых изображений, позволяющей изменять яркость, контрастность, цветовой баланс картинки, а также повышать резкость и размывать изображения. Кроме того, будут описаны алгоритмы для работы с графикой, используемые в программе.
Теоретические сведения
Фильтр «Яркость/контрастность»
Для изменения яркости на 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 — то его следует урезать.
Фильтры «Повысить резкость» и «Размыть»
Эти фильтры реализуются на основе ядра свертки. Элемент изображения получает новое значение на основе группы элементов, примыкающих к данному. Область примыкания есть квадратная матрица, размерность которой совпадает с размером выбранного ядра свертки, и центром в обрабатываемом элементе.
Ядро свертки представляет собой матрицу размером 3х3, 5х5, 7х7 и т.д., на которой определена некоторая функция. Ядро свертки называется окном, а заданная на нем функция – весовой или функцией окна. Каждому элементу окна соответствует число, называемое весовым множителем. Совокупность всех весовых множителей и составляет весовую функцию. Нечетные размеры окна необходимы для однозначного определения центрального элемента.
По сути, ядро свертки является фильтром, который позволяет усилить или ослабить компоненты изображения. Фильтрация осуществляется перемещением окна фильтра по изображению. Весовая функция в процессе перемещения остается неизменной. В каждом положении окна происходит операция свертки – линейная комбинация значений элементов изображения:
При каждом положении окна весовая функция поэлементно умножается на значение соответствующих пикселей исходного изображения и произведения суммируются. Полученная сумма называется откликом фильтра и присваивается тому пикселю нового изображения, который соответствует положению центра окна.
Результат обработки пикселя записывается в соответствующую ячейку временной матрицы такого же размера, как и исходное изображение. Запись в отдельную временную матрицу необходима для того, чтобы исключить влияние уже обработанных пикселей на еще не обработанные.
Обязательно следует упомянуть о граничных условиях. Например, у верхнего левого пикселя не существует «соседей» слева и сверху, следовательно, нам не на что умножать коэффициенты матрицы.
Для решения этой проблемы требуется создание промежуточного изображения. Идея в том, чтобы создавать временное изображение с размерами (width + 2 • gap / 2, height + 2 • gap / 2, где width и height – ширина и высота фильтруемого изображения, а gap – размерность матрицы свертки). В центр изображения копируется входная картинка, а края заполняются крайними пикселями изображения. Размытие применяется к промежуточному буферу, а потом из него извлекается результат.
При использовании алгоритма увеличения резкости подчеркиваются различия между цветами смежных пикселей и выделяются незаметные детали. В ядре резкости центральный коэффициент больше 1, а окружен он отрицательными числами, сумма которых на единицу меньше центрального коэффициента. Таким образом, увеличивается любой существующий контраст между цветом пикселя и цветами его соседей. При обработке каждого пикселя в изображении используется ядро резкости размерами 3×3:
При использовании алгоритма размытия в изображении перераспределяются цвета и смягчаются резкие границы. Ядро сглаживания состоит из совокупности коэффициентов, каждый из которых меньше 1, а их сумма составляет 1. Это означает, что после фильтрации каждый пиксель поглотит что-то из цветов соседей, но полная яркость изображения останется неизменной. При обработке изображения используется следующее ядро свертки:
Описание алгоритмов
Изменение яркости
В функцию изменения яркости передается значение цвета текущего пикселя, текущее положение ползунка (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 – метод, выполняющий фильтрацию изображения на основе ядра свертки.
Описание структуры пользовательского интерфейса
На рисунках выше представлено главное меню программы. Во вкладке «Файл» находятся кнопки для открытия и сохранения изображения. Во вкладке «Фильтры» представлены инструменты для фильтрации загруженного изображения: «Яркость/контрастность», «Цветовой баланс», «Повысить резкость», «Размыть». При вызове первых двух открываются новые окна, в которых находятся слайдеры для изменения соответствующих компонентов фильтруемого изображения и кнопки «Применить», для сохранения изменений:
Демонстрация работы программы
Исходное изображение:
Изменение яркости:
Изменение контрастности:
Изменение цветового баланса:
Повышение резкости:
Размытие изображения:
Скачать исходник программы можно, нажав на кнопку ниже:
Скачать исходник
Поделиться в соц. сетях:
Исходник программы перезалейте, удален
Ссылка работает. Может Яндекс Диск глючил
снова не работает(
Попробуйте скачать еще раз. Заработало.
Спасибо большое!
Спасибо большое за исходник!