Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的逆DCT图像重建问题_Matlab_Image Processing_Dct - Fatal编程技术网

Matlab中的逆DCT图像重建问题

Matlab中的逆DCT图像重建问题,matlab,image-processing,dct,Matlab,Image Processing,Dct,我使用1DCT和IDCT实现了自己的2D DCT。我的DCT结果和Matlab的实现相匹配,但IDCT给出了不同的结果。从重建图像中可以看出,差异并没有完全消失。我对此有点怀疑——我觉得你的DCT/IDCT方程不太正确。我使用了SciPy文档中的DCT-2和DCT-3公式 更具体地说,您的代码中引起我注意的问题是DCT/IDCT方程的索引。MATLAB是1索引的,但DCT/IDCT通常写为0索引。你的代码需要考虑到这一点。 original_img = imread('nggyu.jpeg')

我使用1DCT和IDCT实现了自己的2D DCT。我的DCT结果和Matlab的实现相匹配,但IDCT给出了不同的结果。从重建图像中可以看出,差异并没有完全消失。

我对此有点怀疑——我觉得你的DCT/IDCT方程不太正确。我使用了SciPy文档中的DCT-2和DCT-3公式


更具体地说,您的代码中引起我注意的问题是DCT/IDCT方程的索引。MATLAB是1索引的,但DCT/IDCT通常写为0索引。你的代码需要考虑到这一点。
original_img  = imread('nggyu.jpeg');
transformed_img = permute(dct1d(permute( ...
                      dct1d(double(original_img)), ...
                          [2,1,3])), [2,1,3]);
recovered_img = uint8(permute(idct1d(permute( ...
                    idct1d(transformed_img), ...
                        [2,1,3])), [2,1,3]));

figure('position', [0, 0, 600, 200])
subplot(1,3,1), imshow(original_img), title 'Original'
subplot(1,3,2), imshow(log(abs(transformed_img)),[]), title 'DCT'
subplot(1,3,3), imshow(recovered_img), title 'IDCT'

function y = dct1d(x)
  % Compute normalized DCT-2 over the first dimension of the input.

  N = size(x, 1);
  y = zeros(size(x));
  n = (1:N)';
  
  for k = 1:N
    if k == 1
      scale = sqrt(1/(4*N));
    else
      scale = sqrt(1/(2*N));
    end
    
    y(k,:,:) = scale * 2 * sum(x(n,:,:) .* cos((pi/(2*N)) * (2*n-1) * (k-1)), 1);
  end
  
end

function x = idct1d(y)
  % Compute normalized DCT-3 over the first dimension of the input.

  N = size(y, 1);
  x = zeros(size(y));
  k = (2:N)';
  
  for n = 1:N
    x(n,:,:) = y(1,:,:)/sqrt(N) + sqrt(2/N) * sum(y(k,:,:) .* cos((pi/(2*N)) * (2*n-1) * (k-1)), 1);
  end
  
end