Скольжение операций окружения

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

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

Блоки окружения в 6 5 матрице

Определите центральный пиксель

Центральный пиксель является фактическим пикселем во входном изображении, обрабатываемом операцией. Если окружение имеет нечетное число строк и столбцов, центральный пиксель находится на самом деле в центре окружения. Если одна из размерностей имеет даже длину, центральный пиксель только слева от центра или чуть выше центра. Например, в окружении 2 на 2, центральный пиксель является верхним левым.

Для любого m-by-n окружение, центральный пиксель

floor(([m n]+1)/2)

В 2 3 блоке, показанном в предыдущей фигуре, центральный пиксель (1,2), или пиксель во втором столбце верхней строки окружения.

Общий алгоритм скользящих операций окружения

Выполнять скользящую операцию окружения,

  1. Выберите один пиксель.

  2. Определите окружение пикселя.

  3. Примените функцию к значениям пикселей в окружении. Эта функция должна возвратить скаляр.

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

  5. Повторите шаги 1 - 4 для каждого пикселя во входном изображении.

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

Ограничьте дополнительное поведение в скользящих операциях окружения

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

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

Реализация линейной и нелинейной фильтрации как скользящие операции окружения

Можно использовать скользящие операции окружения, чтобы реализовать много видов фильтрации операций. Одним примером скользящей соседней операции является свертка, которая используется, чтобы реализовать линейную фильтрацию. MATLAB® обеспечивает conv и функции filter2 для выполнения свертки, и тулбокс обеспечивает функцию imfilter. Смотрите то, Что Изображение, Просачивающееся Пространственная Область? для получения дополнительной информации об этих функциях.

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

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

Примечание

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

Например, этот код вычисляет каждый выходной пиксель путем взятия стандартного отклонения значений 3х3 окружения входного пикселя (то есть, сам пиксель и его восемь непрерывных соседей).

I = imread('tire.tif');
I2 = nlfilter(I,[3 3],'std2');

Можно также записать код, чтобы реализовать определенную функцию, и затем использовать эту функцию с nlfilter. Например, эта команда обрабатывает матричный I в 2 3 окружениях с функцией под названием myfun.m. Синтаксис @myfun является примером указателя на функцию.

I2 = nlfilter(I,[2 3],@myfun);

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

I = im2double(imread('tire.tif'));
f = @(x) sqrt(min(x(:)));
I2 = nlfilter(I,[2 2],f);

(Для получения дополнительной информации об указателях на функцию см. Создание указателя на функцию (MATLAB). Для получения дополнительной информации об анонимных функциях, см. Анонимные функции (MATLAB).)

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

Примечание

Этот пример только предназначается, чтобы проиллюстрировать использование nlfilter. Для более быстрого способа выполнить эту локальную максимальную операцию, используйте imdilate.

I = imread('tire.tif');
f = @(x) max(x(:));
I2 = nlfilter(I,[3 3],f);
imshow(I);
figure, imshow(I2);

Каждый набор выходного пикселя к максимальному входному значению окружения