Инвертировать дискретное косинусное преобразование (DCT) изображения

Я работаю над функцией в Matlab, которая вычисляет обратный DCT для изображения. Я не знаю, что работает в моем коде. После того, как я выполню, я получаю черное изображение, я уже сделал функцию DCT, и она работает, все, что мне нужно сейчас обратный DCT

какие идеи плз....

вот моя основная программа:

I=imread('illustration.JPG');
I=rgb2gray(I);
figure,
imshow(I);title('limage original en niveau de gris');
I=I(1:1600,1:1600);
figure,
imshow(I);title('coupure de limage utilisé pour que ces dimensions   sont    multiple de 8');
figure,
DCT=dct(I);
imshow(DCT);title('DCT1');%calcule de DCT avec la function predifinie dct
DCT2=DCTlocal(I);
figure,
imshow(DCT2);title('DCT2');%calcule de DCT avec l'algorithme données

figure,
Irec=idct(DCT);
imshow(Irec/255);title('Irec ');

figure,
Irec2=InvDCTLocale(DCT2);
imshow(Irec2);title('Irec2');

и вот моя функция DCT:

   function image_comp = DCTlocal( I )
   N=8;
   [n1,n2]=size(I);
    I=double(I)-128;
    block_dct = zeros(N);

    %loop true block
     for k=1:N:n1
     for l=1:N:n2
      %save true image
      current_block = I(k:k+N-1,l:l+N-1);
      %loop true cos(u,v)
       for u=0:N-1
        for v=0:N-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 true pixel values
         for x=0:N-1
          for y=0:N-1
            Res_sum = Res_sum +      ((current_block(x+1,y+1))*cos(((2*x)+1)*u*pi/(2*N))*cos(((2*y)+1)*v*pi/(2*N)));  
          end
         end
         dct = 1/sqrt(2*N) * Cu * Cv * Res_sum; %calculate DCT
        block_dct(u+1,v+1) = dct;
      end
     end
     image_comp(k:k+N-1,l:l+N-1) = block_dct(u+1,v+1);
    end
     end
    end

и теперь вот моя функция iverse DCT, где проблема:

      function image_decomp = InvDCTLocale( DCT )

      N=8;
      [n1,n2]=size(DCT);
      block_idct = zeros(N);

      %loop true block
       for k=1:N:n1
      for l=1:N:n2
      %save true image
      current_block = DCT(k:k+N-1,l:l+N-1);
      %loop true cos(u,v)
      for u=0:N-1
      for v=0:N-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 true pixel values
         for x=0:N-1
          for y=0:N-1
            Res_sum = Res_sum +Cu* Cv *   ((current_block(x+1,y+1))*cos(((2*x)+1)*u*pi/(2*N))*cos(((2*y)+1)*v*pi/(2*N)));  
          end
         end
         I = 1/sqrt(2*N)*Res_sum; 
        block_idct(u+1,v+1) = I;
      end
     end
     image_decomp(k:k+N-1,l:l+N-1) = block_idct(u+1,v+1);
 end
 end
 end

person Imad Kby    schedule 21.12.2016    source источник
comment
что является выходом вашего DCT/IDCT? держу пари, что вы что-то усекаете/округляете до целых чисел и/или вводите масштабирование цветов для преобразования изображения после DCT и не масштабируете до IDCT. (лень проверять свой код), но если это поможет, вы можете вычислить (I)DCT из DFT для сравнения, см. мой 1D FDCT и IFDCT по БПФ с той же длиной   -  person Spektre    schedule 21.12.2016
comment
спасибо, за мой вывод в функции DCT я получаю аналогичный результат, как и в функции сборки dct2, но в функции idct я получаю черное изображение   -  person Imad Kby    schedule 21.12.2016
comment
могу ли я получить код в матлабе, пожалуйста ...   -  person Imad Kby    schedule 21.12.2016
comment
не от меня, так как я вообще не использую Matlab...   -  person Spektre    schedule 22.12.2016
comment
Каковы выходные значения? Черный просто означает, что это достаточно маленькое число. например, если выход IDCT находится в диапазоне <0.0,1.0> после преобразования в RGB или оттенки серого без какого-либо масштабирования, вы получили пиксели от 0x00000000 до 0x00010101 (24-битный RGB), которые все еще черные ... попробуйте масштабировать результат перед усечением с помощью x'=(x-min)*255/(max-min), где x - исходная ячейка вывода. значение и x' масштабируется на единицу, а min,max является минимальным и максимальным значением из всего вывода.   -  person Spektre    schedule 22.12.2016