图像的离散余弦变换(DCT)

5
我正在Matlab上编写一个函数,用于计算图像的离散余弦变换(DCT)。我不知道我的代码哪里出了问题,但是我得到了一个与原始图像相同的输出图像。我想使用这个公式来计算DCT。
请给予任何建议。
    function image_comp = dctII(image, b)
    [h w] = size(image);
    image = double(image) - 128;
    block = zeros(b,b);

 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

你的代码在下面提到的更正后可以运行。但是我建议你放弃使用循环,否则在处理大量数据时会遇到麻烦。 - Mykola Servetnyk
1个回答

3
在x和y的内部循环中,你没有从正确的位置读取image_t中的内容。你已经将本地块复制到以k,l为左上角的位置以进行处理,但在内部循环中,你总是从以1,1作为左上角开始的相同块中读取image_t的内容。

谢谢,那个很有效。我还有一个问题,请问如果我现在想要进行IDCT,我应该做哪些修改?这是我的代码。 - user2827482
你的类型II DCT的逆DCT是类型III DCT。这只需要稍微改变一下数学公式即可。请参考以下链接中的DCT-II和DCT-III部分:http://en.wikipedia.org/wiki/Discrete_cosine_transform - mikeTronix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接