我想将图像划分为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
答案 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}访问一个块。我想你知道下一步该做什么。