Как разделить изображение на блоки в MATLAB?

Рассмотрите использование с потерями сжатие вейвлета и сравнение самых высоких элементов уместности изображений.

13
задан niton 16 April 2015 в 02:45
поделиться

3 ответа

Поскольку 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 массив ячеек , содержащий результаты выполнения операции над каждой подматрицей.

12
ответ дан 1 December 2019 в 22:07
поделиться

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);
    

    Конечно, в реальной программе вам, вероятно, следует сделать это с помощью цикла.

7
ответ дан 1 December 2019 в 22:07
поделиться

Если 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);

?

3
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: