给定图像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
,是否有任何功能可以做到这一点?
答案 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),[])