使用MATLAB提取图像的子图像而不重复

时间:2015-02-23 19:02:18

标签: matlab

给定图像A,我想将其细分为给定大小的块(例如维度3-by-3的子图像)并删除重复的块。 (类似于unique对向量的作用,但对于块。) 我确实尝试使用如下循环:

function [ Ref_M ] = Sub_Div_f( M,C_W )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
Sub_I=0;
Ref_M=0;
[L_M H_M ]=size(M); %deffine the size of d IMG
for i=1:C_W:L_M

    for j=1:C_W:H_M
        [L_Ref_M H_Ref_M ]=size(Ref_M);
        Sub_I=M(i:i+C_W-1,j:j+C_W-1);% Subimage
        if (i==1 && j==1)
           Ref_M=Sub_I;
        else
            nn=0;
            for k=1:C_W:H_Ref_M
                if ( Sub_I == Ref_M(1:C_W,k:k+C_W-1 ))
                    break;
                else
                    nn=nn+1;
                    if (nn==(H_Ref_M/C_W))
                       Ref_M(1:C_W, H_Ref_M+1:H_Ref_M+C_W)=Sub_I;
                    end
                end
            end       

        end
    end
end 

但这需要很多时间。我可以使用unique来获取它吗?喜欢:S = unique(A,'3,3')或其他东西。或unique仅适用于单个像素?如果不使用unique,是否有任何功能可以做到这一点?

1 个答案:

答案 0 :(得分:1)

首先将所有大小为blockSize=[3,3]的块重新整形为行。

如果安装了图像处理工具箱,则可以使用im2col执行此操作。

im2row = @(A,blockSize) im2col(A,blockSize,'distinct').';

或者如果你不这样做,你可以使用:

im2row = @(A,blockSize) ...
         reshape(permute(reshape(A, blockSize(1), size(A,1)/blockSize(1),...
                                    blockSize(2), size(A,2)/blockSize(2)),...
                         [2,4,1,3]),...
                 [], prod(blockSize));

然后我们使用unique(.,'rows')过滤掉唯一的块:

uniqueBlocks = unique(im2row(A,blockSize), 'rows');

然后,您需要将值转置并重新整形为其块形式:

reshape(uniqueBlocks.',blockSize(1),blockSize(2),[])