Извлечение матрицы 3x3 из изображения

Мне нужно извлечь матрицу 3x3 из изображения и сохранить ее отдельно, и так должно продолжаться до конца изображения. Например, мое изображение представляет собой следующую матрицу:

p = [ 1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9 ]

Вывод должен быть таким:

p1 = [1 2 3; 1 2 3; 1 2 3]
p2 = [4 5 6; 4 5 6; 4 5 6]
p3 = [7 8 9; 7 8 9; 7 8 9]

и так далее....

Не могли бы вы предложить мне код или встроенную функцию для этого?


person Prakruthi Alosri    schedule 17.06.2013    source источник
comment
@ZoranPlesivčak MATLAB прекрасно интерпретирует определения матриц без эллипсов. В данном случае они лишние.   -  person Eitan T    schedule 17.06.2013
comment
@EitanT Я этого не знал ... Может быть, вам стоит отменить мое изменение.   -  person plesiv    schedule 17.06.2013
comment
@ZoranPlesivčak Это не имеет большого значения. Вы тоже можете это сделать, если хотите.   -  person Eitan T    schedule 17.06.2013
comment
-1: Я не согласен с первоначальным голосованием. Не могли бы вы предложить мне код или встроенную функцию? показывает отсутствие усилий по исследованию. В дополнение: зачем вам извлекать матрицу и генерировать дополнительные матрицы? Почему нельзя индексировать и выполнять вычисления на месте?   -  person Schorsch    schedule 17.06.2013
comment
возможный дубликат Как разделить матрицу на равные части?, разделить изображение на блоки 3*3, разделить матрицу на подматрицы в MATLAB и многие другие более...   -  person Eitan T    schedule 17.06.2013


Ответы (2)


Самый простой способ извлечь подматрицы:

p1 = img(1:3, 1:3);
p2 = img(4:6, 4:6);
p3 = img(7:9, 7:9);

Функция для нарезки.

function imgsl = img_slice( img, ry, rx )
    [ Y X ] = meshgrid(ry, rx);
    imgsl = reshape(img(sub2ind(size(img),Y(:),X(:))),[length(rx) length(ry)]).';

Используйте его следующим образом:

p1 = img_slice( p, 1:3, 1:3 );
p2 = img_slice( p, 4:6, 4:6 );
p3 = img_slice( p, 7:9, 7:9 );
person plesiv    schedule 17.06.2013

В наборе инструментов для обработки изображений есть im2col функция (link).

B = im2col(p, [3 3], 'distinct');

Тогда каждый столбец B представляет собой блок 3x3, преобразованный в вектор, и вы можете использовать reshape(B(:, i), 3, 3) для восстановления i-го блока 3x3. Обратите внимание, что p дополнены нулями.

person Da Kuang    schedule 17.06.2013