Отдельная обработка блоков

При отдельной обработке блоков вы делите матрицу изображения на прямоугольные блоки и выполняете операции обработки изображения на отдельных блоках. Блоки начинаются в верхнем левом углу и полностью закрывают изображение без перекрытия. Если блоки не помещаются точно над изображением, то любые неполные блоки считаются частичными блоками. Рисунок показывает изображение 15 на 30 пикселей, разделенное на блоки 4 на 8 пикселей. Правые и нижние ребра имеют частичные блоки.

Изображение, разделенное на отдельные блоки

Можно обрабатывать частичные блоки как есть, или можно добавить заполнение к изображению так, чтобы размер изображения был кратен размеру блока. Для получения дополнительной информации см. раздел «Применение заполнения».

Реализуйте обработку блоков с помощью функции blockproc

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

Например, команды ниже обрабатывают изображение I в блоках 25 на 25 с функцией myfun. В этом случае myfun функция изменяет размер блоков, чтобы создать миниатюру. (Дополнительные сведения о указателях на функцию см. в разделе «Создание указателя на функцию». Для получения дополнительной информации об анонимных функциях см. «Анонимные функции».)

myfun = @(block_struct) imresize(block_struct.data,0.15);
I = imread('tire.tif');
I2 = blockproc(I,[25 25],myfun);

Примечание

Из-за эффектов ребра блока изменение размера изображения с помощью blockproc не приводит к таким же результатам, как изменение размера всего изображения сразу.

В приведенном ниже примере используются blockproc функция для установки каждого пикселя в каждом 32 на 32 блоке изображения в среднее значение элементов в этом блоке. Анонимная функция вычисляет среднее значение блока, а затем умножает результат на матрицу таковых, так что выходной блок имеет тот же размер, что и входной блок. В результате выходное изображение имеет тот же размер, что и входное изображение. The blockproc функция не требует, чтобы изображения имели одинаковый размер. Если это результат, который вы хотите, убедитесь, что функция, которую вы задаете, возвращает блоки соответствующего размера:

myfun = @(block_struct) ...
   uint8(mean2(block_struct.data)*...
   ones(size(block_struct.data)));
I2 = blockproc('moon.tif',[32 32],myfun);

Примечание

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

Применение заполнения

При обработке изображения в блоках вы можете добавить заполнение по двум причинам:

  • Адресовать частичные блоки, когда размер изображения не кратен размеру блока.

  • Чтобы создать перекрывающиеся границы для каждого блока.

По умолчанию частичные блоки обрабатываются как есть, без дополнительного заполнения. Установите 'PadPartialBlocks' аргумент в true чтобы дополнить правые или нижние ребра изображения и сделать блоки полноразмерными.

Используйте 'BorderSize' аргумент для задания дополнительных строк и столбцов пикселей вне блока, значения которых учитываются при обработке блока. Когда есть граница, blockproc передает расширенный блок, включая границу, в указанную функцию.

Для примера эта команда обрабатывает изображение A в блоках 4 на 8 пикселей добавление границы 1 на 2 пикселя вокруг каждого блока и заполнение нулями частичных блоков к полному размеру блока. Эта граница пикселя расширяет каждый блок на один дополнительный пиксель на верхних и нижних ребрах и на два пикселя вдоль левых и правых ребер во время обработки. Рисунок изображает образец изображения A и обозначает серым цветом границу пикселя, добавленную к трем блокам выборки.

B = blockproc(A,[4 8],myfun,'BorderSize',[1 2], ...
   'PadPartialBlocks',true)

Графическое A Разделение на отдельные блоки с заданными границами

И заполнение частичных блоков, и границы блоков добавляют к общему размеру изображения A, как изображено на рисунке. Поскольку частичные блоки заполнены, исходное изображение размером 15 на 30 пикселей увеличивается в следующем кратном размере блока, в этом случае - 16 на 32 пикселя. Поскольку к каждому блоку добавляется граница 1 на 2 пикселя, блоки вдоль ребер изображения включают пиксели, которые выходят за пределы оригинального изображения. Пограничные пиксели вдоль изображения ребер увеличить эффективный размер входа матрицы до 18 на 36 пикселей. Крайний прямоугольник на рисунке определяет новые контуры изображения после добавления заполнения.

По умолчанию, blockproc заполняет изображение нулями. Если вам нужен другой тип заполнения, используйте 'PadMethod' параметр blockproc функция.

Похожие темы