Как разделить изображение на блоки в MATLAB? - PullRequest
13 голосов
/ 28 октября 2009

У меня есть изображение 256x256, и я хочу разделить его на 4 блока по 128x128 каждый и адресовать их от A1 до A4. Теперь я хочу вызвать их отдельно и выполнить некоторые операции над ними. Я знаю, что это можно сделать с помощью функции blkproc, но как именно?

Как мне позвонить blkproc?

B=blkproc(I,[4 4],?)

Что я должен поставить вместо "?" И как я могу адресовать 4 созданных блока?

Ответы [ 4 ]

12 голосов
/ 28 октября 2009

Поскольку blockproc (и устаревший blkproc) являются обеими функциями Toolbox для обработки изображений , я решил добавить базовое решение 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 , содержащий результаты выполнения операция на каждой подматрице.

7 голосов
/ 28 октября 2009

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

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

3 голосов
/ 28 октября 2009

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

1 голос
/ 26 августа 2015

Лучше, чтобы ваша программа работала для изображений любого размера, а не только для 256 * 256.

[row, col]=size(your_image); mr = round(row/2); % median of rows mc = round(col/2); % median of columns % Now divide your image and call each of them separately and do what ever you want top_left = your_image(1:mr , 1:mc); top_right = your_image(1:mr , (mc+1):col); bot_left = your_image((mr+1):row , 1:mc); bot_right = your_image((mr+1):row , (mc+1):col); % final stage is to combining these parts again to return to its original shape Back_to_original = [top_left,top_right ; bot_left,bot_right];

% надеюсь, что это будет полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...