将图像块分成两个块

时间:2015-07-13 01:36:36

标签: image matlab image-processing svd

我正在处理一个图像而且我分成了不重叠的块,我接下来要做的是对相同块的每两个相邻块应用一些更改。例如,我有一个块B1,我把它分成B11和B12。

这里的目标是在B11和B12上应用SVD并比较它们的奇异值:S11(2,2)S12(2,2),依此类推其他每个块。但我不知道如何处理相邻的每两个子块我只能对块Bi应用SVD。

似乎我需要一个循环for来处理每两个子块,或者函数mat2tiles可以这样做吗?

这是一个解释我所说的内容的例子。

image divided into blocks

1 个答案:

答案 0 :(得分:0)

我终于找到了如何实现目标的方式,并且在有人需要时我也会分享:

%First this a function that help me to divide my image into non overlapping block

function B=Block(IM,p,q)  
p=p    %% number of rows
q=q    %% number of cols
[m,n] = size(IM);
IJ = zeros(p,q);
z = 1;
for m1 = 1:m/p   
for n1 = 1:n/q  
   if m1*p <= m;
    if n1*q <= n;

      for i = (m1-1)*p+1:m1*p
         for j = (n1-1)*q+1:n1*q
             IJ(i-(m1-1)*p,j-(n1-1)*q) = IM(i,j);
           if (i-(m1-1)*p)==p&&(j-(n1-1)*q)==q;
               OUT = IJ;
              B{1,z} = OUT;
              z = z+1;
           end
         end
      end
    end
   end
end 
end

现在我将每个块分成子块并应用SVD

Block_Num = (m*n)/(p*q) % To get how many blocks we have
fun= @svd % the function we use is SVD
for i=1:Block_Num
sv=blkproc(B{i},[4 4],fun) % in my case I wanted to apply SVD 
                                  of every sub-block of 4*4
 end

这就完成了工作。希望它对你也有用