Вы находитесь на странице: 1из 45

Содержание

Введение 5
1 Методы обработки цветных изображений 6
1.1 Понятие свёртки и её роль в цифровой обработке изображений 7
1.2 Сглаживающие фильтры. Медианный фильтр 9
1.3 Пространственные фильтры повышения резкости 12
2 Описание программы 14
2.1 Диаграммы вариантов использования 15
2.2 Общее описание принципов работы функции программы 16
2.3 Алгоритм работы медианного фильтра 17
2.4 Алгоритм работы монохромного фильтра 19
2.5 Алгоритм работы размытия 21
2.6 Алгоритм работы резкости 23
2.7 Описание интерфейса программы 24
3 Тестирование 30
Заключение 39
Список литературы 41
Приложение А Исходный код класса ColorWork 43

4
Введение

Повышение качества изображения является одним из основных областей


обработки информации. Изображение, полученное с помощью той или иной
оптической системы, чаще всего оказывается искажённым. Например, если
система находится в движении относительно запечатленного на изображении
объекта, то такое изображение будет смазанным. В данном случае изображение
получается нечётким и это усложняет восприятие человеческим глазом
информации на изображении.
Довольно часто бывает только одна возможность получить изображение
какого-либо явления и при этом получить чёткое изображение могут помешать
внешние факторы. Подбор правильного метода по восстановлению фокуса
может исправить ситуацию в таких случаях.
Рассмотренные примеры – это лишь один из аспектов применения
обширной области информатики и математики – цифровой обработки
изображений. К другим применениям можно отнести: размытие изображений,
распознавание объектов на них, коррекция цвета.
В настоящей курсовой работе рассматриваются теоретические основы
цифровой обработки изображений и приводятся примеры алгоритмов с
реализацией на языке C#.
Курсовая работа состоит из введения, трёх глав, заключения, списка
использованной литературы и приложения.
В первой главе рассматриваются основные методы обработки
изображений.
Во второй главе описываются алгоритмы работы методов.
В третьей главе осуществляется тестирование.
Приложение А содержит код, который был написан для каждого
алгоритма.

5
1 Методы обработки изображений

Предварительный анализ изображений позволяет сделать вывод о том,


что:
Во-первых, большинство изображений, в процессе их формирования
(фотографирования, сканирования), подвергаются влиянию ряда негативных
факторов (вибрация фотокамеры, неравномерность движения сканирующего
элемента), приводящих к появлению смаза, малоконтрастных и зашумленных
участков.
Во-вторых, подавляющее большинство методов основано на выделении
объектов, на изображении и дальнейшем их анализе [5].
Таким образом, прежде чем переходить к анализу, изображение должно
пройти этап препарирования, который состоит в выполнении операций
улучшения визуального качества (повышение контраста, устранение
размытости, фильтрация) и операций формирования графического препарата
изображения. [1]

6
1.1 Понятие свёртки и её роль в цифровой обработке изображений

Процесс улучшения изображений сводится к выполнению набора


действий с целью усовершенствования зрительного восприятия.
Операция вычисления значения выбранного пикселя, которая учитывает
значения окружающих его пикселей, называется свёрткой [3]. Для определения
значения нового пикселя используется квадратное ядро свёртки. В процессе
вычисления значения выбранного пикселя, ядро свёртки совмещается со своим
центром к данному пикселю. Результат эффекта зависит от выбранного ядра
[4].
В данном случае мы рассматриваем свёртку двух непрерывных функций
f ( t ) и h ( t ). Свёртка этих двух функций, обозначается оператором ¿, определяется

как:


(1)
f ( t )∗h(t)≡ ∫ f ( τ ) h ( t−τ ) dτ ,
−∞

где знак минус учитывает смещение, необходимое для сдвига одной функции за
другую, τ −¿ постоянная переменная интегрирования [11].
Найдем преобразование Фурье для уравнения 1.

∞ ∞ ∞ ∞
F { f ( t )∗h(t) }=∫
−∞ −∞
[∫ ]
f ( τ ) h ( t−τ ) dτ e
− j2 πφt
dt =∫ f ( τ )
−∞
[∫
−∞
h ( t−τ ) e
− j 2 πφt
]
dt dτ , (2)

где произведение в скобках (формула 2) является преобразованием Фурье h ( t −τ )


. В итоге мы получаем:


F { f ( t )∗h(t) }=∫ f ( τ ) [ H (φ) e− j 2 πφt ] dτ=H ( φ ) F( φ) (3)
−∞

7
Из формулы 3 следует, что преобразование Фурье двух функций в
пространственной области эквивалентен произведению в частной области [8].

8
1.2 Сглаживающие фильтры. Медианный фильтр.

Изображения на этапе оцифровки подвергаются воздействию


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

I ( u , v ) ← med ian { I ( u+i , v + j )|( i , j ) ∈ R } (4)

Медиана последовательности 2 k +1 значений pi , определяется как


центральное значение pk после сортировки последовательности P( p0 , … , p k ),

median ( p0 , p 1 , … , pk−1 , pk , p k+1 , … , p 2k ) = pk , (5)

где pi ≤ pi +1 для 0 ≤ i<2 k .


Рассмотренный метод эффективно устраняет аддитивный и импульсный
шум в каждом элементе изображения.

Существенным недостатком, рассмотренного выше метода, является смаз


изображения (снижение четкости контурных элементов), при этом величина
смаза пропорциональна размеру маски, используемой для сглаживания [10].
9
Медианная фильтрация относится к нелинейным методам обработки
изображений и имеет следующие преимущества перед линейной фильтрацией
(классической процедуры сглаживания): сохраняет резкие перепады (границы);
эффективно сглаживает импульсный шум; не изменяет яркость фона [7].
Медианная фильтрация осуществляется путем движения некоторой
апертуры (маски) вдоль дискретного изображения и замены значения
центрального элемента маски медианным значением (среднее значение
упорядоченной последовательности) исходных элементов внутри ядра. В
общем случае, ядро может иметь различную форму, но на практике чаще всего
применяется квадратное ядро [24].
На рисунке 1 показано вычисление медиана области фильтра размером
3×3 пикселя.

Рисунок 1 – Вычисление медианы фильтра

Уравнение 5 определяет медиану набора значений нечетного размера [5],


однако, если количество элементов четное (2 k для k >0), то медиана

10
отсортированной последовательности P=( p0 , … , p2 k−1 ) определяется как среднее
арифметическое двух средних значений pk−i и pk ,

1 (6)
median ( p0 , … , p k−1 , pk , … , p2 k−1 ) = ( pk−1 + pk ),
2

На рисунке 2 показаны эффекты медианного фильтра 3×3 пикселя на


выбранных участках изображения. В частности, очень маленькие участки
устраняются, но все остальные участки остаются неизменными.

Рисунок 2 – Эффекты медианного фильтра 3×3 пикселя. Выделены


изолированные точки (а), края остаются неизменными (б) и (в), угол закруглён
(г)

11
1.3 Пространственные фильтры повышения резкости

Фильтрация изображений – это процедура, которая в результате имеет


изображение такого же размера, как полученное из исходного изображения
согласно определенным правилам [12]. Как правило, цвет любого пикселя
конечного изображения определён цветами пикселей, находящихся в
определенной его области в исходном изображении [13].
Пространственная фильтрация изображений заключается в последующих
операциях:
1) Установление центральной точки области;
2) Осуществление операции, которая использует только значения
пикселей в области вокруг центральной точки;
3) Повтор процесса для любой точки изображения.
Вследствие перемещения центральной точки возникают новые
окрестности, соответствующие любому пикселю изображения. Для описанной
процедуры принято использовать термин «пространственная фильтрация» [17].
Фильтры повышения резкости основаны на первой и второй производных
[15]. Первая производная f ( x ) функции определяется, как разность соседних
элементов:

∂f
=f ( x +1 ) −f (x ) (7)
∂x

Вторая производная определяется, как разность соседних значений


первой производной (формула 8).

∂2 f
=f ( x +1 ) + f ( x−1 ) −2 f ( x ) (8)
∂ x2

Исходя из практики, при применении фильтрации изображение


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

13
2 Описание программы

В данной работе исходными данными для программы являются


фотоизображения с разрешением 900×400 с различными дефектами.
Программа была разработана на языке C# с использованием Microsoft
Visual Studio 2017. Данный язык был выбран, поскольку в нём имеются
встроенные классы для загрузки, обработки и сохранения изображения [18, 19,
23].

14
2.1 Диаграммы вариантов использования

15
2.2 Общее описание принципов работы функции программы

В данной работе был реализован медианный фильтр, который является


одним из методов подавления шума. Размер ядра выбирается пользователем,
при этом выбор ограничен (3×3, 5×5, 7×7, 9×9). Данный метод реализован в
ColorWork.MedianFilter() и его алгоритм описан в пункте 2.3.
Так же пользователь имеет возможность использовать монохромный
фильтр для создания черно-белого изображения. Его реализация описана в
пункте 2.4.
Функция размытия и повышения резкости реализована на основе свертки,
и их алгоритм описан в пунктах 2.5 и 2.6, соответственно.
Для повышения резкости использовалось ядро размером 3×3 (рисунок 4),

Рисунок 4 – Ядро повышения резкости

Для размытия использовались ядра различных размеров (3×3, 5×5, 7×7,


9×9), заполняемыми значениями ядра гауссово распределения. Ядро
формируется автоматически для различных размеров ядер.
Гауссово распределение – это усреднение по закону Гаусса пикселей
вокруг точки [2]. Ядро Гаусса вычисляется по формуле (9).

2 2
−x + y
1 2σ
2
(9)
Gσ = e ,
2 π σ2

где σ 2−¿ дисперсия.


Алгоритм работы данного модуля описан в пункте 2.6.

16
2.3 Алгоритм работы медианного фильтра

В платформе .NET и в Windows Forms для работы с изображениями


используется пространство имен System.Drawing.Image.
Класс Bitmap позволяет работать прямо с пикселями растрового
изображения. Он является потомком абстрактного класса Image,
представляющего изображения в C#.
При создании экземпляра Bitmap можно указать как размеры
создаваемого изображения, так и имя файла, который нужно открыть.
Основные методы Bitmap, использованные в курсовой работе:
1) GetPixel (x,у) –возвращает цвет точки с координатами (x,у);
2) SetPixel –эта функция устанавливает цвет пикселя в заданных нами
координатах в заданном цвете.
Параметр, задающий цвет должен быть типа Color. Этот тип позволяет,
как указать цвет по имени, так и задать его в формате RGB.
Алгоритм использования медианного фильтра:
1) для начала работы с данным фильтром пользователь должен загрузить
изображение;
2) в программе происходит загрузка изображения с исходными данными;
3) Пользователь выбирает во вкладке «Фильтр» «Удаление шума» и
степень подавления шума;
4) программа производит вычисления, заменяет исходные значения
пикселя на полученные значения фильтрации и применяет к исходному
изображению;
При увеличении размеров ядра происходит размытие крутых изменений
изображений. Недостатком этого фильтра является высокая продолжительность
обработки изображений с высоким разрешением.
Алгоритм работы данного метода показан на рисунке 5.

17
Рисунок 5 – Алгоритм работы медианного фильтра

18
2.4 Описание алгоритма работы монохромного фильтра

Для преобразования цветного изображения в монохромное, значения


интенсивностей по каждому из каналов заменяются на значение яркости,
вычисляемое по формуле 10:

Y =0,299∗R+ 0,587∗G+ 0,144∗B (10)

На каждое изображение наложена цветовая модель RGB [16]. Значение


каждого оттенка занимает байт, а значит лежит в диапазоне от 0 до 255 [20].
Алгоритм использования монохромного фильтра:
1) пользователь должен загрузить изображение;
2) в программе происходит загрузка изображения с исходными данными;
3) пользователь выбирает во вкладке «Фильтр» «Монохромный фильтр»;
4) программа увеличивает яркость пикселя в 255 раз, создаёт новый
пиксель с параметром яркости;
5) происходит формирование нового изображения с применением
монохромного фильтра;
Алгоритм работы данного метода показан на рисунке 6.

19
Рисунок 6 – Алгоритм работы монохромного фильтра

20
2.5 Описание алгоритма работы размытия

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


То есть, для каждого пикселя находится окрестность – квадрат с центром в этом
пикселе и фиксированным размером стороны. Затем значение интенсивности
цвета в канале заменяется арифметическим средним. Чем больше радиус
окрестности, тем сильнее размытие изображения.
Размытие может применяться для удаления шума или для создания
художественного эффекта.
1) пользователь должен загрузить изображение;
2) в программе происходит загрузка изображения с исходными данными;
3) пользователь выбирает во вкладке «Фильтр» «Размытие»;
4) программа вычисляет среднее значение каналов цветов всех соседних
пикселей. Степень размытия регулируется значением радиуса;
5) происходит формирование нового изображения с применением
размытия;
Алгоритм работы данного метода показан на рисунке 7.

21
Рисунок 7 – Алгоритм работы размытия

22
2.6 Описание алгоритма работы резкости

1) пользователь должен загрузить изображение;


2) в программе происходит загрузка изображения с исходными данными;
3) пользователь выбирает во вкладке фильтр «Резкость»;
4) программа вычисляет среднее значение каналов цветов всех соседних
пикселей. Степень размытия регулируется значением радиуса;
5) происходит формирование нового изображения с повышенной
чёткостью;
Алгоритм повышения резкости показан на рисунке 8.

Рисунок 8 – Алгоритм повышения резкости

23
2.7 Описание интерфейса программы

Рассмотрим форму PhotoCorrection. На рисунке 9 показано главное окно


программы.

Рисунок 9 – Главное окно программы

В меню «Файл», как показано на рисунке 10, пользователь может


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

24
Рисунок 10 – Меню «Файл»

В случае если пользователь не загрузил изображение, появится окно «Ошибка»,


как показано на рисунке 11.

Рисунок 11 – Окно «Ошибка»

В меню «Правка», рисунок 12, пользователь может отменить действие,


нажав «Отменить», а так же скопировать изображение, нажав «Копирование».

25
Рисунок 12 – Меню «Правка»

В меню «Фильтр» (рисунок 13) пользователю предлагается


использование таких фильтров, как «Удаление шума», «Монохромный
фильтр», «Размытие...», «Резкость».

26
Рисунок 13 – Меню «Фильтр»

После загрузки изображения пользователь может приступить к работе.


Для применения фильтра «Удаление шума», пользователь должен нажать
«Удаление шума», в появившемся окне пользователь может регулировать
степень подавления шума с помощью trackbar, как показано на рисунке 14, а
затем нажать кнопку «Применить».

27
Рисунок 14 – «Удаление шума»

Порядок действий аналогичен с шумом, рисунок 15.

28
Рисунок 15 – «Размытие...»

Для работы с монохромным фильтром и повышением резкости,


пользователю необходимо просто выбрать в меню «Фильтр» «Монохромный
фильтр» или «Резкость». Данные фильтры применяются автоматически после
нажатия.
При нажатии на крестик в окне фильтров, появится окно с сообщением
«Сохранить изменения?», как показано на рисунке 16.

Рисунок 16 – Окно подтверждения действий

29
3 Тестирование

Для тестирования программы были выбраны изображения, показанные на


рисунках 17 – 20.

Рисунок 17 – Изображение 1

30
Рисунок 18 – Изображение 2

Рисунок 19 – Изображение 3

31
Рисунок 20 – Изображение 4

Фильтр «Удаление шума» применялся на изображении 3. На рисунке 21


проиллюстрирован результат работы фильтра.

32
Рисунок 21 – «Удаление шума» для ядра 5×5

Рисунок 22 – «Удаление шума» для ядра 7×7

33
Рисунок 23 – «Удаление шума» для ядра 9×9

Результат эффекта данного метода во многом зависит от выбранного


ядра. На рисунке 21, мы наблюдаем цветной шум, после применения ядра 5×5,
шум еще присутствует, 7×7 – менее заметен, 9×9 – почти удален.
«Монохромный фильтр» и «Резкость» применялись на изображении 2.
Результаты работы фильтров проиллюстрированы на рисунках 24 и 25.

34
Рисунок 24 – Монохромный фильтр

Рисунок 25 – Повышение резкости изображения

35
Фильтр «Размытие» применялся на изображении 1. На рисунках 26 – 28
проиллюстрированы результаты работы фильтра.

Рисунок 26 – Размытие с размером ядра 5×5

36
Рисунок 27 – Размытие с размером ядра 7×7

Рисунок 28 – Размытие с размером ядра 9×9

37
Одним из недостатков данной программы является неспособность
удаления таких дефектов, как смаз (рисунки 29 и 30). Ни «Удаление шума», ни
«Резкость» не справляются с данной задачей.

Рисунок 29 – Использование фильтра в качестве способа восстановления


изображения

38
Рисунок 30 – Использование повышение резкости для восстановления
смазанного изображения

39
Заключение

В ходе работы были, подготовлены исходные фотоизображения,


содержащие дефекты, реализованы алгоритмы, реализующие основные
фильтры. К изображениям были применены разработанные фильтры и
проанализированы возможности их применения для восстановления
фотоизображений, содержащих дефекты.
В данной программе пользователь имеет возможность выбрать
изображение для обработки, сохранения и копирования. Наглядно увидеть
работу данного фильтра и отменить действия. Это позволяет не открывать
каждый раз изображение и не повторять предыдущие шаги.
Недостатки программы:
1) обработка фотоизображений большого формата занимает долгое время;
2) фильтр «Удаление шума» недостаточно хорошо справляется со своей
задачей;
3) данная программа неспособна восстанавливать изображения
содержащие такой дефект, как смаз.

40
Список литературы

1. Анисимов, Б. В., Курганов, В. Д., Злобин, В. К. Распознавание и


цифровая обработка изображений. – М. : Высшая Школа, 1983. – 295 с.
2. Вентцель, Е. С. Теория вероятностей. – М. : Academia, 2005. – 576 с.
3. Гонсалес, Р. Цифровая обработка изображений / Р. Гонсалес, Р. Вудс. –
М. : Техносфера, 2005. – 1072 с.
4. Гонсалес, Р. Цифровая обработка изображений / Р. Гонсалес, Р. Вудс,
С. Эддинс. – М. : Техносфера, 2006. – 616 с.
5. Гришенцев, А. Ю., Коробейников, А. Г. Методы и модели цифровой
обработки изображений. – СПб. : Изд-во Политехн. ун-та, 2014. – 191 с.
6. Грузман, И. С., Киричук, В. С., Косых, В. П., Перетягин, Г. И., Спектор
А. А. Цифровая обработка изображений в информационных системах. –
Новосибирск : Издательствово НГТУ, 2002. – 352 c.
7. Даджион, Д., Мерсеро, Р. Цифровая обработка изображений. Кн. 1. –
М. : Мир, 1998. – 240 с.
8. Зорич, В. А. Математический анализ. – М. : Физматлит, 1984. – 544 с.
9. Иванов, Д. В., Хропов, А. А., Кузьмин, Е. П., Карпов, А. С.,
Лемпицкий, В. С. Алгоритмические основы растровой графики [Электронный
ресурс]. URL: http://www.intuit.ru/department/graphics/rastrgraph/8/1.html.
10. Лурье, И. К., Косиков, А. Г. Теория и практика цифровой обработки
изображений. – М. : Научный мир, 2003. – 180 с.
11. Нуссбаумер, Г. Быстрое преобразование Фурье и алгоритмы
вычисления сверток : Пер. с англ. – М. : Радио и связь, 1985. – 248 с.
12. Потапов, А. А., Пахомов, А. А., Никитин, С. А., Гуляев, Ю. В.,
Новейшие методы обработки изображений. – M. : Физматлит, 2008. – 496 с.
13. Приоров, А. Л., Апальков, И. В., Хрящев, В. В. Цифровая обработка
изображений. – Ярославль : ЯрГУ, 2007. – 235 с.
14. Прэтт, У. К. Цифровая обработка изображений : Пер. с англ. – М. :
Мир, 1982. – Кн. 1. – 312 с.
41
15. Прэтт, У. К. Цифровая обработка изображений : Пер. с англ. – М. :
Мир, 1982. – Кн. 2. – 480 с.
16. Солоницын, Ю. А. Коррекция цифровых фотографий : учеб. пособие /
Ю. А. Солоницын. – СПб. : Питер, 2006. – 219 с.
17. Сойфер, В. А. Методы компьютерной обработки изображений / В. А.
Сойфер. – М. : ФИЗМАТЛИТ, 200. – 784 с.
18. Стиллмен, Э., Гринн, Д. Изучаем C#. [Текст] : Питер. – 2017. – 816 с.
19. Шилдт, Г. С# 4.0 : полное руководство. : Пер. с англ. / Г. С. Шилдт. –
М. : ООО «И. Д. Вильямс», 2011. – 1056 c.
20. Фершильд, М. Д. Модели цветового восприятия : учеб. пособие / М.
Д. Фершильд. – 2–е изд. – СПб. : Питер, 2006. – 439 с.
21. Фриман, М. Взгляд фотографа. – М. : Добрая книга, 2012. – 192 с.
22. Фриман, М. Дао цифровой фотографии: искусство создавать удачные
фотоснимки. – М. : Добрая книга, 2008. – 188 с.
23. Хейлсберг, А., Торгерсен, М., Голд, П. Язык программирования С#.
Классика Computers Science. [Текст] : Питер. – 2011. – 784 с.
24. Хуанг, Т. С. (ред.) Быстрые алгоритмы в цифровой обработке
изображений. Преобразования и медианные фильтры. – М. : Радио и связь,
1984. – 224 с.
25. Ярославский, Л. П. Введение в цифровую обработку изображений. –
М. : Советское радио, 197. – 312 с.

42
Приложение А
(Рекомендуемое)
Исходный код класса ColorWork

public static class ColorWork


{
private static List<Bitmap> backup = new List<Bitmap>();
public static Bitmap Image { get; set; }
public static void Save()
{
backup.Add((Bitmap)Image.Clone());
}
public static void Load()
{
if (backup.Count == 0)
return;
backup.RemoveAt(backup.Count - 1);
Image = backup[backup.Count - 1];
}
public static Bitmap MedianFilter(Bitmap image, int radius)
{
int widthSred = (radius - 1) / 2;
int heighSred = (radius - 1) / 2;
BufferedBitmap bbImage = new BufferedBitmap(new
Bitmap(Image));
BufferedBitmap bbNewImage = new BufferedBitmap(new
Bitmap(Image.Width, Image.Height));
for(int y = 0; y < bbImage.Height; y++)
for (int x = 0; x < bbImage.Width; x++)
{
int[] tmp = new int[radius * radius];
int[] tmp1 = new int[radius * radius];
int[] tmp2 = new int[radius * radius];
for (int a = 0; a < radius; a++)

43
for (int b = 0; b < radius; b++)
{
int cx = x - widthSred + a;
int cy = y - heighSred + b;
if (cx < 0) cx = 0;
if (cx >= bbImage.Width) cx =
bbImage.Width - 1;
if (cy < 0) cy = 0;
if (cy >= bbImage.Height) cy =
bbImage.Height - 1;
Color pixColor =
bbImage.GetPixel(cx, cy);
float h = pixColor.GetHue();
float s =
pixColor.GetSaturation();
float l =
pixColor.GetBrightness();
pixColor = HSLtoRGB(h, s, l);
tmp[b * radius + a] =
pixColor.R;
tmp1[b * radius + a] =
pixColor.G;
tmp2[b * radius + a] =
pixColor.B;
}
int sredniyIndex = (radius * radius +
1) / 2;
Array.Sort(tmp);
Array.Sort(tmp1);
Array.Sort(tmp2);
bbNewImage.SetPixel(x, y,
Color.FromArgb(tmp[sredniyIndex],
tmp1[sredniyIndex],
tmp2[sredniyIndex]));
}

44
bbImage.Unlock();
bbNewImage.Unlock();
return bbNewImage.Bitmap;
}
public static void MakeGray() // BW
{
BufferedBitmap bbImage = new BufferedBitmap(new
Bitmap(Image));
for (int x = 0; x < Image.Width; x++)
{
Color pixColor = bbImage.GetPixel(x, y);
int brightness = (int)(255 *
pixColor.GetBrightness());
bbImage.SetPixel(x, y, Color.FromArgb(brightness,
brightness, brightness
}
bbImage.Unlock();
Image = bbImage.Bitmap;
}
public static void Harshness()
{
int xx = 3;
int yy = 3;
double[,] yadro1 = new double[xx, yy];
for (int y = 0; y < yy; y++)
{
for (int x = 0; x < xx; x++)
{
yadro1[x, y] = -1;
}
}
yadro1[1, 1] = xx * yy;
Image = ColorWork.ConvolutionRGB(ColorWork.Image,
yadro1);
}

45
public static void ConvolutionRGB(double[,] yadro)
{
Image = ConvolutionRGB(Image, yadro);
}
public static Bitmap ConvolutionRGB(Bitmap image, double[,]
yadro)
{
Bitmap newImage = new Bitmap(image);
BufferedBitmap bbImage = new BufferedBitmap(new
Bitmap(image));
BufferedBitmap bbNewImage = new BufferedBitmap(newImage);
int yadroWidth = yadro.GetLength(0);
int yadroHeight = yadro.GetLength(1);
int anchorX = (int)(yadroWidth / 2);
int anchorY = (int)(yadroHeight / 2);
double div = 0;
for (int y = 0; y < yadroHeight; y++)
for (int x = 0; x < yadroWidth; x++)
{
div += yadro[x, y];
}
for (int y = anchorY; y < bbImage.Height - anchorY;
y++)
for (int x = anchorX; x < bbImage.Width -
anchorX; x++)
{
double sumR = 0;
double sumG = 0;
double sumB = 0;
for (int ky = 0; ky < yadroHeight; ky++)
for (int kx = 0; kx < yadroWidth;
kx++)
{

46
Color pixColor =
bbImage.GetPixel(x + kx -
anchorX, y + ky - anchorY);

sumR += yadro[kx, ky] *


pixColor.R;
sumG += yadro[kx, ky] *
pixColor.G;
sumB += yadro[kx, ky] *
pixColor.B;
}
int r = (int)(sumR / div);
int g = (int)(sumG / div);
int b = (int)(sumB / div);
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
bbNewImage.SetPixel(x, y,
Color.FromArgb(r, g, b));
}
bbImage.Unlock();
bbNewImage.Unlock();
image = newImage;
return image;
public enum Filter
{
Median,
Convolution,
BW,
Blur,
Harshness
}

47
}

48