разделить изображение на 3 * 3 блока - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть матрица, которая не имеет измерений, кратных 3, или это может произойти. Как мы можем разделить все изображение на блоки 3 * 3 матриц. (Может игнорировать последние, которые не входят в 3 * 3 кратных. Кроме того, матрицы 3 * 3 могут быть сохранены в массивах.

a=3; b=3; %window size
x=size(f,1)/a; y=size(f,2)/b; %f is the original image
m=a*ones(1,x); n=b*ones(1,y);
I=mat2cell(f,m,n);

1 Ответ

5 голосов
/ 02 апреля 2012

Я никогда не использовал mat2cell для разделения матриц, и, думая об этом сейчас, это кажется действительно хорошей идеей.Поскольку у меня на этом компьютере нет MATLAB, я опишу способ, которым я это делаю, который не использует mat2cell.

Игнорировать последние столбцы и строки очень просто:

d = 3; % the dimension of the sub matrix
[x,y] = size(f);

% perform integer division by three
m = floor(x/d);
n = floor(y/d);

% find out how many cols and rows have to be left out
m_rest = mod(x,d);
n_rest = mod(y,d);

% remove the rows and columns that won't fit
new_f = f(1:(end-m_rest), 1:(end-n_rest));

%  this steps you won't have to perform if you use mat2cell
% creates the matrix with (m,n) pages 
new_f = reshape( new_f, [ d m d n ] );
new_f = permute( new_f, [ 1 3 2 4 ] );

Теперь вы можете получить доступ к подматрицам следующим образом:

new_f(:,:,1,1) % returns the 1st one

new_f(:,:,3,2) % returns the one at position [3,2]

Если вы хотите использовать mat2cell для этого, вы можете сделать что-то вроде следующего:

% after creating new_f, instead of the reshape, permute
cells_f = mat2cell(new_f, d*ones(1,m), d*ones(1,n));

Тогда вы могли бы получить к нему доступ другим способом:

cells_f{1,1}
cells_f{3,2}

Ячеистый подход, который я не могу проверить, потому что у меня нет MATLAB на этом ПК, но если я могу правильно вспомнить использование mat2cell, он долженотлично работает.

Надеюсь, это поможет:)

...