图像的DCT

时间:2015-04-09 08:57:19

标签: matlab image-processing dct

我在Matlab中使用一个函数来计算图像的DCT(离散余弦变换)。我不知道我的代码中有什么不起作用,用于图像压缩。请帮助我。 请任何想法。

   clc;close all;clear all;
   image=('cameraman.tif');
    [h w] = size(image);
    image = double(image) - 128;
    b=8;
    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

1 个答案:

答案 0 :(得分:1)

我假设你为DCT实现了以下公式:

dct

c(x)

我想你需要将图像划分为8x8的块并在每个块上进行DCT。

  1. 请评论您的代码!它可以帮助您和其他人更好地理解它!
  2. 当您通过if u == 0if v == 0进行for u for for循环时,您永远无法访问v1:b内的部分。基本问题是MATLAB开始索引为1,而DCT中的频率从0开始。我的提示:使用uv作为公式中的频率,而不是索引,即{{ 1}}并在编制索引时使用for u=0:b-1
  3. u+1x相同。
  4. y应该只包含当前块(因此我将其重命名为image_t)而不是整个图像。那是current_block
  5. 在第current_block = image(k:k+b-1,l:l+b-1);行中,它不应该是dct= (1/4)*Cu*Cv*Res_sum;,而是1/4,其中1/sqrt(2*N)是您的块大小(您称之为N),因此b。对于1/sqrt(2*b)的块大小,如您的示例所示,这当然是8
  6. 1/4是MATLAB函数的名称。建议不要将其用作函数名称。考虑更改它,例如到image
  7. 我不确定你为什么从输入图像中减去input_image,请理解为什么要这样做。
  8. 这导致下面的代码。我不知道这是否解决了所有你的问题,但你现在应该更接近它了; - )

    PS:考虑代码的矢量化以提高性能。

    128