как разделить изображение на блоки и взять из них 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

person maryam    schedule 24.05.2017    source источник
comment
Вы можете попробовать использовать blockproc вместо тяжелых циклов...   -  person Siva Srinivas Kolukula    schedule 24.05.2017
comment
Я не могу использовать blockproc. Мой Профессор не пускает меня(:   -  person maryam    schedule 24.05.2017


Ответы (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}. Думаю, ты знаешь, что делать дальше.

person Siva Srinivas Kolukula    schedule 24.05.2017