首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像的DCT

图像的DCT
EN

Stack Overflow用户
提问于 2015-04-09 08:57:18
回答 1查看 1.3K关注 0票数 0

我在Matlab中开发了一个计算图像DCT (离散余弦变换)的函数。我不知道在我的代码中不起作用的是什么,它是用于图像compression.please帮助我的。请给我任何想法。

代码语言:javascript
复制
   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
EN

回答 1

Stack Overflow用户

发布于 2015-04-09 11:33:30

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

使用

我想你需要把图像分割成8x8块,然后对每个块做离散余弦变换。

  1. 请评论你的代码!它帮助你和其他人更好地理解它!
  2. 您永远无法到达if u == 0if v == 0中的部分,因为您在通过1:b的for循环中遍历uv。根本的问题是MATLAB从1开始索引,而DCT中的频率从0开始。我的提示是:使用uv作为频率,就像公式中的频率一样,而不是像索引那样,即for u=0:b-1u+1
  3. xy也是如此。
  4. image_t应该只包含当前块(因此我将它重命名为current_block),而不是整个映像。那是current_block = image(k:k+b-1,l:l+b-1);
  5. 在行dct= (1/4)*Cu*Cv*Res_sum;中,不应该是1/4,而应该是1/sqrt(2*N),其中N是块大小(您称之为b),因此是1/sqrt(2*b)。对于8的块大小,如您的示例所示,这当然是1/4
  6. image是MATLAB函数的名称。最好不要将它用作函数名。考虑将其更改为input_image
  7. 我不知道为什么您从输入图像中减去128,请考虑一下为什么要这样做。

这将导致下面的代码。我不知道这是否解决了你所有的问题,但你现在应该离这更近些;-)

PS:考虑将代码向量化以提高性能。

代码语言:javascript
复制
function image_comp = dctII(input_image, b)
    [h, w] = size(input_image);
    input_image = double(input_image);
    block_dct = zeros(b);

    % Loop through all blocks
    for k=1:b:h
      for l=1:b:w

        % Save true image of block
        current_block = input_image(k:k+b-1,l:l+b-1);

        % Loop through all cos frequencies (u,v)
        for u=0:b-1
          for v=0:b-1
            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;

            % Loop through all pixel values
            for x=0:b-1
              for y=0:b-1
                Res_sum = Res_sum + ((current_block(x+1,y+1))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b)));  
              end
            end

            % Calculate DCT value at frequency (u,v)
            dct = 1/sqrt(2*b) * Cu * Cv * Res_sum;
            block_dct(u+1,v+1) = dct;
          end
        end

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

      end
    end
end         % of function
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29534039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档