Выполнение операций скольжения по соседству и отдельных блоков по возможности столбцово может сократить время выполнения, необходимое для обработки изображения.
Например, предположим, что операция, которую вы выполняете, включает в себя вычисление среднего значения каждого блока. Этот расчет намного быстрее, если вы сначала переставите блоки в столбцы, потому что можно вычислить среднее значение каждого столбца с одним вызовом mean
функция, а не вызов mean
для каждого блока индивидуально.
Чтобы использовать обработку столбцов, используйте colfilt
функция. Эта функция
Изменение формы каждого скользящего или отдельного блока матрицы изображения в столбец во временной матрице
Передает временную матрицу в функцию, которую вы задаете
Переставляет получившуюся матрицу назад в исходную форму
Для операции скольжения по соседству, colfilt
создает временную матрицу, которая имеет отдельный столбец для каждого пикселя в оригинальном изображении. Столбец, соответствующий данному пикселю, содержит значения окрестности этого пикселя от оригинального изображения.
Следующий рисунок иллюстрирует этот процесс. На этом рисунке матрица изображений 6 на 5 обрабатывается в окрестностях 2 на 3. colfilt
создает по одному столбцу для каждого пикселя на изображении, поэтому во временной матрице в общей сложности 30 столбцов. Каждый столбец пикселя содержит значение пикселей в его окрестности, поэтому существует шесть строк. colfilt
zero-заполняет вход изображение при необходимости. Для примера окрестность верхнего левого пикселя на рисунке имеет два соседних значения с нулем из-за нулевого заполнения.
colfilt создает временную матрицу для скользящего соседства
Временная матрица передается в функцию, которая должна вернуть одно значение для каждого столбца. (Многие MATLAB® функции работают таким образом, например mean
, median
, std
, sum
, и т.д.) Получившиеся значения затем присваиваются соответствующим пикселям на выходном изображении.
colfilt
может привести к тем же результатам, что и nlfilter
с более быстрым временем выполнения; однако может потребоваться больше памяти. Приведенный ниже пример устанавливает каждый пиксель выхода на максимальное значение в окрестности входа пикселя, получая тот же результат, что и nlfilter
пример показан в реализации линейной и нелинейной фильтрации как операций скользящего соседства.
I2 = colfilt(I,[3 3],'sliding',@max);
Для отдельной операции блока colfilt
создает временную матрицу путем перестройки каждого блока в изображении в столбец. colfilt
при необходимости дополняет оригинальное изображение 0 перед созданием временной матрицы.
Следующий рисунок иллюстрирует этот процесс. Матрица изображений 6 на 16 обрабатывается в блоках 4 на 6. colfilt
сначала обнуляет изображение, чтобы сделать размер 8 на 18 (шесть блоков 4 на 6), а затем переставляет блоки в шесть столбцов по 24 элемента каждый.
colfilt создает временную матрицу для операции с отдельными блоками
После реорганизации изображения во временную матрицу, colfilt
передает эту матрицу в функцию. Функция должна вернуть матрицу того же размера, что и временная матрица. Если размер блока m
-by- n
, и изображение mm
-by- nn
, размер временной матрицы (m*n)
-by- (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
.