Операции скользящего соседства

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

Следующий рисунок показывает соседские блоки для некоторых элементов в матрице 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);

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

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

Примечание

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

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

Каждый выходной пиксель имеет максимальное входное значение соседства