如何计算逆dct(IDCT)?

时间:2015-04-08 12:28:17

标签: matlab image-processing dct

我正在开展一个项目,我必须在图像上使用DCT和逆DCT进行jpeg压缩。我在程序下面发布了我无法找到DCT和IDCT中的错误。

clc;close all;clear all;
image=imread('cameraman.tif');
    [h w] = size(image);
    image = double(image) - 128;
    block = zeros(b,b);
    b=8;
 image_t=zeros(size(image));
 for k=1:b:h
     for l=1:b:w
        image_t(k:k+b-1,l:l+b-1)= image(k:k+b-1,l:l+b-1);
        for u=1:b
            for v=1:b
                if u == 0
                    Cu = 1/sqrt(2);
                else
                    Cu = 1;
                end
                if v == 0
                    Cv = 1/sqrt(2);
                else
                    Cv = 1;
                end
                Res_sum=0;
                for x=1:b;
                    for y=1:b
                        Res_sum = Res_sum + ((image_t(x,y))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b)));  
                    end
                end
                dct= (1/4)*Cu*Cv*Res_sum;
                block(u,v) = dct;

            end
        end
        image_comp(k:k+b-1,l:l+b-1)=block(u,v);
     end
 end
end

逆DCT计划

for k=1:b:h
    for l=1:b:w
        for x=1:b
            for y=1:b
                Res_sum=0;
                for u=1:b
                    for v=1:b
                        if k==1
                             temp=double(sqrt(1/2)*qz(u,v)*cos(pi*(k-1)*(2*i-1)/(2*b))*cos(pi*(l-1)*(2*j-1)/(2*b));
                        else
                            temp=double(qz(u,v)*cos(pi*(k-1)*(2*i-1)/(2*b))*cos(pi*(l-1)*(2*j-1)/(2*b));
                        end
                        if l==1
                            temp=temp*sqrt(1/2);
                        end
                       Res_sum=Res_sum+temp;
                    end
                end
                Res_sum=Res_sum*(2/sqrt(b*b));
                image_t((k-1)*b+i,(l-1)*b+j)=Res_sum;
            end
        end
    end
end

其中qz在量化之后。 提前谢谢。

0 个答案:

没有答案