【问题标题】:how to divide an image to blocks and take dct of those如何将图像划分为块并获取这些块的 dct
【发布时间】:2017-05-24 07:17:01
【问题描述】:

我想将图像划分为 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

【问题讨论】:

  • 您可以尝试使用 blockproc 代替繁重的循环...
  • 我不能使用blockproc。我的教授不让我(:

标签: matlab block dct


【解决方案1】:

您可以查看以下代码,了解如何将给定的图像/矩阵划分为所需数量的块。使用 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} 访问一个块。我想你知道下一步该做什么了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多