Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кгизображение.doc
Скачиваний:
13
Добавлен:
11.11.2019
Размер:
2.45 Mб
Скачать

Масочная фильтрация

В практике цифровой обработки изображений широко используется некаузальная масочная фильтрация. Ее линейная разновидность является одним из вариантов двумерной КИХ-фильтрации. В этом случае функцию называют маской, которая представляет собой весовых коэффициентов, заданных во всех точках окрестности, обычно симметрично окружающих рабочую точку кадра. Распространенным видом окрестности, часто применяемым на практике, является квадрат размером 3 на 3 элемента с рабочим элементом в центре. Применяют различные разновидности масок, одним из эвристических вариантов является равномерная маска, когда все девять весовых коэффициентов которой равны 1/9. Такой выбор коэффициентов отвечает условию сохранения средней яркости и центрировать изображение в процессе обработки не требуется.

Для выполнения такой процедуры фильтрации библиотека IPL предоставляет функцию iplBlur, которая имеет следующий прототип.

void iplBlur(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат. Остальные параметры используются для формирования маски: nCols - количество столбцов, nRows – количество строк в окрестности рабочей точки (в маске), anchorX и anchorY – координата центра маски. В системе координат маски ее верхнему левому углу соответствует точка с координатами (0,0), а её правому нижнему углу соответствует точка с координатами (nCols-1, nRows-1). Таким образом для маски размером 3 на 3 должна быть координата центра (1,1). Действие этой функции подобно размытию или усреднению интенсивности изображения.

Но основная функция библиотеки IPL, с помощью которой можно выполнять фильтрацию с произвольными масками называется iplConvolve2D, так как выполняет непосредственно процедуру свертки изображения с маской. Для выполнения свертки необходимо выполнить подготовку маски (или ядра свертки) с помощью функции iplCreateConvKernel. Получить ядро сверки, которое будет использоваться при выполнений свертки можно с помощью функции iplGetConvKernel. А после выполнения свертки ядро должно быть удалено с помощью функции iplDeleteConvKernel. Перечисленные выше функции имеют следующие прототипы:

IplConvKernel* iplCreateConvKernel(int nCols, int nRows, int anchorX, int anchorY, int* values, int nShiftR); void iplGetConvKernel(IplConvKernel* kernel, int* nCols, int* nRows, int* anchorX, int* anchorY, int** values, int* nShiftR); void iplDeleteConvKernel(IplConvKernel* kernel);

Аргументы nCols и nRows определяют соответственно количество столбцов и строк в окрестности рабочей точки (в маске), anchorX и anchorY – координата центра маски. Аргумент values – представляет собой ссылку на массив, в элементах которого сохранены значения весовых коэффициентов маски. Аргумент nShiftR определяет количество бит для сдвига вправо каждого значения изображения-результата. Аргумент типа IplConvKernel представляет собой структуру, в которой хранятся все параметры необходимые для выполнения фильтрации.

Функция для выполнения свертки (и соответственно масочной фильтрации) имеет следующий прототип:

void iplConvolve2D(IplImage* srcImage, IplImage* dstImage, IplConvKernel** kernel, int nKernels, int combineMethod);

где srcImage – как всегда указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат. Аргумент kernel – указатель на массив указателей ядер свертки. Количество элементов в этом массиве определяется следующим аргументом nKernels, а то как они будут использоваться определяется последним аргументом combineMethod, который может быть равен одному из следующих значений:

IPL_SUM // результат сверток суммируется IPL_SUMSQ // суммируются квадраты результатов IPL_SUMSQROOT // суммируются квадраты результатов а затем вычисляется корень квадратный IPL_MAX // Выбирается максимальный результат IPL_MIN // Выбирается минимальный результат

Если аргумент nKernels=1, то аргумент combineMethod игнорируется, так как выполняется одна свертка, результат которой записывается в dstImage. Используя всевозможные ядра фильтрации можно решать не только задачу фильтрации, но и многие другие задачи обработки изображений. Итак, процедура выполнения масочной фильтрации по месту может быть реализована следующим образом:

void MaskFiltering(IplImage* img) { // Скопировать исходное изображение во временное     IplImage* tmp = iplCloneImage(img); // Подготовить массив ядра свертки     int one[9] = {1,-1,1,-1,1,-1,1,-1,1}; // Создать ядро свертки     IplConvKernel* kernel=iplCreateConvKernel(3, 3, 1, 1, one, 0); // Выполнить свертку     iplConvolve2D(img, tmp, &kernel, 1, IPL_SUM); // Удалить ядро свертки     iplDeleteConvKernel(kernel); // Освободить память исходного изображения     iplDeallocate(img, IPL_IMAGE_ALL); // Скопировать результат в исходное изображение     img=iplCloneImage(tmp); // Освободить память временного изображения     iplDeallocate(tmp, IPL_IMAGE_ALL); }

Библиотека IPL предоставляет возможность выполнить раздельную свертку по строкам и столбцам с помощью функции, которая имеет прототип:

void iplConvolveSep2D (IplImage* srcImage, IplImage* dstImage, IplConvKernel* xKernel, IplConvKernel* xKernel);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат. Аргументы xKernel и yKernel принимают ядра для выполнения свертки по строкам и столбцам соответственно. Один из этих аргументов может быть равен NULL.

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

int iplFixedFilter(IplImage* srcImage, IplImage* dstImage, IplFilter filter);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат. Аргумент filter определяет ядро свертки и может принимать следующие значения:

IPL_PREWITT_3x3_V

Градиентный фильтр Превитта (вертикальный)

-1 0 1 -1 0 1 -1 0 1

IPL_PREWITT_3x3_H

Градиентный фильтр Превитта (горизонтальный)

1 1 1 0 0 0 -1 -1 -1

IPL_SOBEL_3x3_V

Градиентный фильтр Собеля (вертикальный)

-1 0 1 -2 0 2 -1 0 1

IPL_SOBEL_3x3_H

Градиентный фильтр Собеля (горизонтальный)

1 2 1 0 0 0 -1 -2 -1

IPL_LAPLACIAN_3x3

Фильтр высоких частот Лапласа (3X3)

-1 -1 -1 -1 8 -1 -1 -1 -1

IPL_LAPLACIAN_5x5

Фильтр высоких частот Лапласа (5X5)

-1 -3 -4 -3 -1 -3 0 6 0 -3 -4 6 20 6 -4 -3 0 6 0 -3 -1 -3 -4 -3 -1

IPL_GAUSSIAN_3x3

Фильтр низких частот Гаусса (3X3)

1 2 1 2 4 2 1 2 1

IPL_GAUSSIAN_5x5

Фильтр низких частот Гаусса (5X5)

2 7 12 7 2 7 31 52 31 7 12 52 127 52 12 7 31 52 31 7 2 7 12 7 2

IPL_HIPASS_3x3

Фильтр высоких частот (3X3)

-1 -1 -1 -1 8 -1 -1 -1 -1

IPL_HIPASS_5x5

Фильтр высоких частот (5X5)

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 24 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

IPL_SHARPEN_3x3

Фильтр повышения резкости

-1 -1 -1 -1 16 -1 -1 -1 -1

Процедура выполнения фильтрации по месту с заранее определенным ядром может быть реализована следующим образом:

void FixedFilter(IplImage* img, IplFilter filter) { // Скопировать исходное изображение во временное     IplImage* tmp = iplCloneImage(img); // Выполнить фильтрацию     iplFixedFilter(img, tmp, filter); // Освободить память исходного изображения     iplDeallocate(img, IPL_IMAGE_ALL); // Скопировать результат в исходное изображение     img = iplCloneImage(tmp); // Освободить память временного изображения     iplDeallocate(tmp, IPL_IMAGE_ALL); }Нелинейная фильтрация

Все линейные алгоритмы фильтрации приводят к сглаживанию резких перепадов яркости изображений, прошедших обработку. Линейные процедуры являются оптимальными при гауссовском распределении сигналов, помех и наблюдаемых данных. Обычно этому условию отвечают шумовые помехи на изображениях, поэтому при их подавлении линейные алгоритмы имеют высокие показатели. А если, например, задача обработки изображения состоит в выявлении границ объекта, то линейная фильтрация не подходит для ее решения.

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

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

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

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

Рассмотрим пример. Предположим, что выборка имеет вид: {136, 110, 99, 45, 250, 55, 158, 104, 75}, а элемент 250, расположенный в ее центре, соответствует текущей точке фильтрации . Упорядоченная по возрастанию выборка имеет при этом вид: {45, 55, 75, 99, 104, 110, 136, 158, 250}, следовательно, получаем . Как видим, влияние соседей на результат фильтрации в текущей точке привело к игнорированию импульсного выброса яркости, что следует рассматривать как эффект фильтрации. Если импульсная помеха не является точечной, а покрывает некоторую локальную область, то она также может быть подавлена. Это произойдет, если размер этой локальной области будет меньше, чем половина размера окна. Поэтому для подавления импульсных помех, поражающих локальные участки изображения, следует увеличивать размеры окна.

Аналогично, строятся фильтры максимумов и минимумов.

Для выполнения медианной фильтрации библиотека IPL предоставляет функцию iplMedianFilter, которая имеет следующий прототип:

void iplMedianFilter(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат, nCols – размер окна по горизонтали, nRows – размер окна по вертикали, anchorX и anchorY  – координата рабочей точки в системе координат окна.

Для выполнения нелинейной фильтрации максимумов и минимумов библиотека IPL предоставляет функции, которые имеют следующие прототипы:

void iplMaxFilter(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY); void iplMinFilter(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат, nCols – размер окна по горизонтали, nRows – размер окна по вертикали, anchorX и anchorY – координата рабочей точки в системе координат окна.

void NonlinearFilter(IplImage* img, int filter) { // Скопировать исходное изображение во временное     IplImage* tmp = iplCloneImage (img);     switch(filter)     {     case -1:         {         // Выполнить нелинейную фильтрацию минимумов             iplMinFilter(m_img, tmp, 3, 3, 1, 1);             break;         }     case 0:         {         // Выполнить нелинейную медианную фильтрацию             iplMedianFilter(m_img, tmp, 3, 3, 1, 1);             break;         }     case 1:         {         // Выполнить нелинейную фильтрацию максимумов             iplMaxFilter(m_img, tmp, 3, 3, 1, 1);             break;         }     } // Освободить память исходного изображения     iplDeallocate(img, IPL_IMAGE_ALL ); // Скопировать результат в исходное изображение     img=iplCloneImage(tmp); // Освободить память временного изображения     iplDeallocate(tmp, IPL_IMAGE_ALL ); }

Для медианной фильтрации цветных изображений в библиотеке IPL предусмотрена специальная функция:

void iplColorMedianFilter(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY);

где srcImage – указатель на исходное изображение, а dstImage – указатель на изображение, в котором будет сохраняться результат, nCols – размер окна по горизонтали, nRows – размер окна по вертикали, anchorX и anchorY – координата рабочей точки в системе координат окна.

Функция iplMedianFilter обрабатывет цветовые плоскости изображения отдельно, вследствие чего цветовая корреляция изображения до и после фильтрации отсутствует. Функция iplColorMedianFilter вычисляет медиану используя следующее значение (цветовое расстояние): abs(R(i) - R(j)) + abs(G(i) - G(j)) + abs(B(i) - B(j)), где i – координата рабочей точки в окне, а j – координата соседней точки. После сканирования всего окна функция устанавливает значение цвета в рабочей точке такое же как у пиксела с минимальным цветовым расстоянием.