exponenta event banner

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

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

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

Блоки соседства в матрице 6 на 5

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

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

Для любого mоколо-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);

Для каждого выходного пикселя установлено максимальное входное значение соседства