2013-09-29 169 views
5

Tôi làm việc trên một hàm trong Matlab tính toán DCT (biến đổi cosin rời rạc) của một hình ảnh. Tôi không biết những gì không làm việc trong mã của tôi, nhưng tôi có một hình ảnh đầu ra với cùng một số. Tôi muốn sử dụng công thức này cho DCT của tôi.Biến đổi cosin rời rạc (DCT) của hình ảnh

Bất kỳ ý tưởng nào vui lòng.

function image_comp = dctII(image, b) 
    [h w] = size(image); 
    image = double(image) - 128; 
    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 
+0

Bạn mã hoạt động với chỉnh sửa được đề cập bên dưới. Nhưng tôi khuyên bạn nên đọc các vòng lặp, nếu không bạn sẽ gặp khó khăn khi làm việc với rất nhiều dữ liệu. –

Trả lời

3

Trong vòng lặp trong x và y, bạn không đọc đúng vị trí trong image_t. Bạn đã sao chép khối cục bộ vào một vị trí với k, l làm góc trên bên trái để sử dụng trong quá trình xử lý, nhưng trong vòng lặp bên trong, bạn luôn đọc từ cùng một khối bắt đầu ở 1,1 như góc trên bên trái trong image_t.

+0

Cảm ơn bạn rằng công việc. Tôi có một câu hỏi khác xin vui lòng. Nếu tôi muốn làm idct bây giờ sửa đổi mà tôi nên làm là gì. Ở đây mã của tôi để giá vé. – user2827482

+0

DCT nghịch đảo cho loại DCT loại II của bạn là loại DCT loại III. Đó là một vấn đề đơn giản của việc thay đổi toán học một chút. Xem các phần DCT-II và DCT-III từ: http://en.wikipedia.org/wiki/Discrete_cosine_transform – mikeTronix

Các vấn đề liên quan