【问题标题】:Divide a matrix into submatrices in MATLAB在 MATLAB 中将矩阵划分为子矩阵
【发布时间】:2012-09-23 17:27:36
【问题描述】:

我有一个大小为412x550 的RGB 图像。我想把它分成大小为2x2 的子矩阵。我曾尝试使用 mat2cell 函数,但它给出了错误。错误是:

输入参数,D1 到 D2,必须对每个维度求和 输入矩阵大小,[412 550]。

如何解决此错误以获得所需的子矩阵?

【问题讨论】:

  • 您必须展示您实际尝试过的内容(代码本身),因为您可能只是语法有点错误。
  • 你也可以试试im2col
  • @Maurits:前提是 OP 有图像处理工具箱(这似乎是合理的,但你永远不知道)

标签: matlab


【解决方案1】:

你的语法可能有点不对劲。适合您情况的正确语法是

>> A = rand(412,550);
>> B = mat2cell(A, 2*ones(size(A,1)/2,1), 2*ones(size(A,2)/2,1))

ans = 
    [2x2 double]    [2x2 double]    ... 
    [2x2 double]    [2x2 double]    ...
    ...

【讨论】:

    【解决方案2】:

    您应该使用函数im2col。这正是您所需要的。

    A = rand(412,550);
    B = im2col(A,[2 2]);
    

    文档在那里:

    http://www.mathworks.fr/help/images/ref/im2col.html;jsessionid=4d24325613716d84d4635b4fc636

    【讨论】:

    • 其实毛里茨已经在cmets上讲过了。
    【解决方案3】:

    一般来说,你可以使用下面的代码将图像分成块(用于压缩过程或其他)

        A=imread('image.bmp'); % i assume 8-bit gray scale image
        [m,n,k]=size(A); % and m=n with 1 channel k=1
        ImageSize=m*n;
        BlockD=2; % i assume 2x2 block
        BlockSize=BlockD*BlockD;
        NoOfBlock=ImageSize/BlockSize;
        SubB=zeros(BlockD,BlockD,NoOfBlock); %arrays of blocks.
        B=double(A); important to convert uint8 to double when dialing with image.
        % thats what ru asking for.
        k=1;
        for i=1:BlockD:m
        for j=1:BlockD:n
            SubB(:,:,k)=B(i:i+BlockD-1,j:j+BlockD-1); k=k+1;
        end
        end
        %compare between first submatrix A with first block.. its the same elements.
        B(1:2,1:2)
        SubB(:,:,1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多