Рассмотрите использование с потерями сжатие вейвлета и сравнение самых высоких элементов уместности изображений.
Поскольку blockproc
(и устаревший blkproc
) являются обеими функциями в панели инструментов обработки изображений , я решил, что добавить базовое решение MATLAB, которое не требует дополнительных наборов инструментов ...
Если вы хотите разделить матрицу на подматрицы, один из способов - использовать mat2cell
, чтобы разбить матрицу и сохранить каждую подматрицу в ячейке массива ячеек. В вашем случае синтаксис будет выглядеть следующим образом:
C = mat2cell(I, [128 128], [128 128]);
C
теперь представляет собой массив ячеек 2 на 2, где каждая ячейка хранит подматрицу 128 на 128 I
. Если вы хотите выполнить операцию с каждой ячейкой, вы можете использовать функцию cellfun
. Например, если вы хотите взять среднее значение в каждой подматрице, вы должны сделать следующее:
meanValues = cellfun(@(x) mean(x(:)), C);
Первый аргумент - это дескриптор функции для анонимной функции , которая сначала преобразует каждую подматрицу в вектор-столбец, а затем принимает среднее значение. На выходе получается матрица средних значений для каждой подматрицы размером 2 на 2. Если функция, которую вы передаете в cellfun
, создает выходные данные разных размеров или типов для каждой ячейки, тогда у cellfun
возникнет проблема с объединением их и будет выдана ошибка:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Если вы добавите ..., 'UniformOutput', false);
до конца вашего вызова cellfun
, тогда вывод в приведенном выше случае вместо этого будет 2 на 2 массив ячеек , содержащий результаты выполнения операции над каждой подматрицей.
blockproc
- это новое имя для blkproc
(устарело). Его можно использовать для применения функции к каждому блоку изображения. Например, если вы хотите разделить матрицу I на блоки 8x8 и вычислить среднее значение каждого блока, вы должны сделать следующее:
B=blockproc(I, [8 8], @(x) mean(x.data(:)));
B - это матрица, содержащая средние значения блоков.
Здесь следует отметить две вещи. :
Спецификатор [8 8]
указывает размер блоков, а не число блоков.
Вы не получаете доступа к самим блокам вне функции, которую вы передаете в blockproc
. Если вам нужны сами блоки, вы должны сделать, как предложил Адриан:
A1 = I (1: 128, 1: 128);
A2 = I (129: 256, 1: 128);
A3 = I (1: 128, 129: 256);
A4 = I (129: 256, 129: 256);
Конечно, в реальной программе вам, вероятно, следует сделать это с помощью цикла.
Если myImage
- ваше изображение размером 256x256, разве это не будет
image_top_left = myImage(1:128,1:128);
image_top_right = myImage(1:128,129:256);
image_bottom_left = myImage(129:256,1:128);
image_bottom_right = myImage(129:256,129:256);
?