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

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

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

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

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

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

  3. Переставляет получившуюся матрицу назад в исходную форму

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

Для операции скольжения по соседству, 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.

Для просмотра документации необходимо авторизоваться на сайте