exponenta event banner

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

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

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

Для использования обработки столбцов используйте colfilt функция. Эта функция

  1. Изменение формы каждого скользящего или отдельного блока матрицы изображения в столбец временной матрицы

  2. Передача временной матрицы указанной функции

  3. Перестановка результирующей матрицы в исходную форму

Использование обработки столбцов с операциями скользящего соседства

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

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

colfilt создает временную матрицу для скользящего соседства

Временная матрица передается функции, которая должна возвращать одно значение для каждого столбца. (Многие функции MATLAB ® работают таким образом, например :mean, median, std, sumи т.д.) Результирующие значения затем присваиваются соответствующим пикселям в выходном изображении.

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

I2 = colfilt(I,[3 3],'sliding',@max);

Использование обработки столбцов с различными операциями блока

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

Следующий рисунок иллюстрирует этот процесс. Матрица изображения 6 на 16 обрабатывается в блоках 4 на 6. colfilt сначала ноль-накладывает изображение, чтобы сделать размер 8-на-18 (шесть 4-на-6 блоков), а затем переставляет блоки в шесть столбцов по 24 элемента каждый.

colfilt создает временную матрицу для операции с отдельным блоком

После перегруппировки изображения во временную матрицу, colfilt передает эту матрицу функции. Функция должна возвращать матрицу того же размера, что и временная матрица. Если размер блока равен mоколо-n, и изображение mmоколо-nn, размер временной матрицы (m*n)около-(ceil(mm/m)*ceil(nn/n)). После обработки временной матрицы выходные данные преобразуются в форму исходной матрицы изображения.

В этом примере для всех пикселей в каждом блоке 8 на 8 изображения устанавливается среднее значение пикселя для блока.

I = im2double(imread('tire.tif'));
f = @(x) ones(64,1)*mean(x);
I2 = colfilt(I,[8 8],'distinct',f);

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

Ограничения

Вы можете использовать colfilt для реализации многих из тех же различных операций блоков, которые blockproc выполняет. Однако colfilt имеет определенные ограничения, которые blockproc не:

  • Размер выходного изображения должен совпадать с размером входного изображения.

  • Блоки не могут перекрываться.

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