如何将图像划分为块并采用其中的dct

时间:2017-05-24 07:17:02

标签: matlab block dct

我想将图像划分为k * k个块然后取每个块的dct。我向图像添加零填充,因此图像的大小是块大小的整数倍。我编写了这段代码,但我不知道如何获取dct块并将结果放入具有相同图像大小的矩阵中。

[m,n]=size(I);
m1=floor(m/K);
n2=floor(n/K);
if(m1~=m/K)
  row=m1*K+K;
else
  row=m;
end
if(n2~=n/K)
  col=n2*K+K;
else
    col=n;
end
I_pad=zeros(row,col);
% copy image I to I_pad
for i=1:m
    for j=1:n
        I_pad(i,j)=I(i,j);
    end
end
% this loop move on blocks of image
for i=1:K:row
    for j=1:K:col
        for i2=i:i+K-1
            for j2=j:j+K-1
               % this for move of one block
            end
        end
   end
end

1 个答案:

答案 0 :(得分:0)

您可以在下面的代码中看到如何将给定的图像/矩阵划分为所需的块数。使用mat2cell来完成任务。在mat2cell之前,我沿着行和列填充了零,以便给定的矩阵被精确地划分为相等的块。

I = imread('peppers.png') ;
I = rgb2gray(I) ;
[nx,ny] = size(I) ;
%% to split into kx*ky blocks 
kx = 5 ; ky = 5 ;
%% Chnage dimensions of image so that exactly divisible 
nx0 = nx+(kx-mod(nx,kx)) ;
ny0 = ny+(ky-mod(ny,ky)) ;
%%
I1 = uint8(zeros(nx0,ny0)) ;
I1(1:nx,1:ny) = I ;
%% Divide into blocks 
kx0 = nx0/kx ; % rows in block
ky0 = ny0/ky ; % columns in block 
Y = mat2cell(I1, repmat(kx0,[1 size(I1,1)/kx0]), repmat(ky0,[1 size(I1,2)/ky0]));

你可以使用Y {i,j}访问一个块。我想你知道下一步该做什么。