exponenta event banner

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

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

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

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

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

Для выполнения отдельных операций с блоками используйте 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 изображения среднего значения элементов в этом блоке. Анонимная функция вычисляет среднее значение блока, а затем умножает результат на матрицу единиц, так что выходной блок имеет тот же размер, что и входной блок. В результате выходное изображение имеет тот же размер, что и входное изображение. 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 функция.

Связанные темы