2013-07-18 4 views
2

Я пытаюсь написать m-файл в matlab, который выполняет jpeg-сжатие в изображении с размерами 256x256, в приведенном ниже коде я разбил изображение на 8-кратные подблоки и выполнил преобразование dct и после квантования. Моя проблема заключается в том, что я хочу также после квантования сохранить в матрице новые сгенерированные значения, чтобы иметь матрицу 256x256 с также значениями 0, а затем выполнить операцию zig zag. Мой код ниже:Матрица сжатия Jpeg после квантования

clc; 
clear all; 
data=imread('cameraman.tif'); 
x=double(data); 

%length of image with no compression 
len=256*256; 
data1=uint8(zeros(size(data))); 

%quantization weigting table 

    qv1= [ 16 11 10 16 24 40 51 61 
      12 12 14 19 26 58 60 55 
      14 13 16 24 40 57 69 56 
      14 17 22 29 51 87 80 62 
      18 22 37 56 68 109 103 77 
      24 35 55 64 81 104 113 92 
      49 64 78 87 103 121 120 101 
      72 92 95 98 112 100 103 99]; 

     final=zeros(256,256); 

     count1=0; 
     for row=1:8:256 
      for column = 1:8:256 
      %shift down pixel 
      x=double(data(row:row+7,column:column+7))-128; 
      %8x8 dct transform 
      xf=dct2(x); 
      %quantization 
      xf=round(xf./qv1).*qv1; 
      final(row+7,column+7)=xf; 
      count1=count1+sum(xf(:)~=0); 
      %inverse dct transformation, 
      data1(row:row+7,column:column+7)=idct2(xf)+128; 
      end 
     end 

«Конечная» переменная Я хочу сделать матрицу, описанную выше. Я принимаю ошибку, как и у меня. Я не знаю, как изменить код, чтобы быть правильным.

ответ

0

кажется, что вместо final(row+7,column+7) вы должны иметь final(row:row+7,column:column+7), в противном случае у вас есть несоответствие назначения. Кроме того, преобразование double в цикле кажется ненужным, поскольку вы уже конвертируете в double перед его вводом.

Смежные вопросы