Отчёт по лабораторной работе №1. Обработка изображений.
Интерфейс программы:
Полоса снизу отображает, насколько выполнена работа. Кнопка отмены позволяет мгновенно отменить применение фильтра и остановить расчёты. Иерархия меню выглядит так:
- Файл
- Открыть (открывает растровое изображение из файла и выводит его на экран)
- Выбрать структурный элемент (открывает растровое изображение из файла и сохраняет его внутри в качестве структурного элемента)
- Сохранить изображение (сохраняет растровое изображение с экрана в выбранный файл в формате
.png
)
- Фильтры
- Точечные (фильтры, вычисляющие новый цвет пикселя отдельно для каждого)
- Инверсия
- Серый мир
- Идеальный отражатель
- Линейная коррекция
- Поворот
- Стекло
- Медианный фильтр
- Матричные (фильтры, где новый цвет пикселя вычисляется с помощью умножения области пикселей вокруг на специально заданную матрицу)
- Размытие
- Размытие по Гауссу
- Тиснение
- Светящиеся края
- Математическая морфология (операции математической морфологии; перед применением изображения приводятся к бинарным; на выходе синий = 1, белый = 0)
- Наращивание
- Эрозия
- Замыкание
- Размыкание
- Морфологический градиент
- Точечные (фильтры, вычисляющие новый цвет пикселя отдельно для каждого)
Был создан абстрактный класс Filter
, реализующий применение фильтра к изображению и содержащий:
- Функцию
protected virtual void DoPreprocessing(FastBitmap bmp)
, выполняющую предварительные расчеты перед проходом по изображению - Функцию
protected abstract Color CalculateNewPixelColor(FastBitmap bmp, int x, int y)
, вызываемую в каждой точке изображения.
На основе этого класса были реализованы несколько точечных фильтров, а именно
- Инверсия цветов:
- "Серый мир":
- Линейная коррекция:
- Поворот на 45 градусов против часовой стрелки:
- "Стекло":
- Медианный фильтр. Для создания изображения берутся значения только из красного канала, для каждого пикселя берутся все значения в заданном радиусе и выбирается (за O(n)) медиана. Затем медианное значение записывается во все каналы:
Также на основе класса Filter
был реализован класс MatrixFilter
, с возможностью задания матрицы (в конструкторе) для расчёта нового пикселя. Были реализованы следующие матричные фильтры:
- Размытие. Эффект практически незаметен на большом изображении:
- Размытие по Гауссу. Эффект намного более заметен:
- Тиснение (для более чёткой видимости к данной картинке применён фильтр линейного растяжения после тиснения):
- Светящиеся края (выделение контуров + фильтр максимума; реализованы одним фильтром):
- Медианный фильтр + светящиеся края. На изображении намного меньше шума, но теряются 2 других цветовых канала:
На основе класса Filter
также реализован класс MorphologyFilter
, применяющий к изображению операции морфологии (наращивание, эрозию и их комбинации). Для этого сначала изображение приводится к бинарному с помощью такой команды binaryImage[x, y] = col.R <= 127 && col.G <= 127 && col.B > 127
, затем выполняется операция морфологии и в результате выводится изображение, где белый цвет означает false
, а синий - true
. Тут структурный элемент - это прямоугольник
- Наращивание:
- Эрозия:
- Размыкание (эрозия + наращивание):
- Замыкание (наращивание + эрозия):
- Морфологический градиент:
Также присутствует возможность выбрать структурный элемент для операций морфологии. Для этого необходимо подать на вход программе изображение в любом формате, высота и ширина которого не превышают 7 пикселей. Оно будет преобразовано к бинарному по следующему условию structElement[x, y] = color.R == 0
. Лучше всего различия в структурном элементе видно при применении операции морфологического градиента:
- Структурный элемент - прямоугольник
$3 \times 3$ , размеры фигуры -$3 \times 3$ :
- Структурный элемент - прямоугольник
$1 \times 3$ , но размеры фигуры -$3 \times 3$ :
- Структурный элемент - прямоугольник
$1 \times 2$ (центральный и нижний пиксели), но размеры фигуры -$3 \times 3$ :
И, напоследок, картинка, получившаяся в результате экспериментов (фильтр светящихся границ, чередующийся с тиснением). Что-то похожее на неоновую вывеску: