2013-10-24 1 views
0

교수의 설명에 따라 이미지 압축 코드를 작성했습니다. 그것은 잘 작동하지만, 일부 이미지는 다음과 같은 오류 보여MATLAB- 매트릭스 치수가 일치해야합니다.

**Error using + 
Matrix dimensions must agree. 

Error in idwt2 (line 90) 
x = upsconv2(a,{Lo_R,Lo_R},sx,dwtEXTM,shift)+ ... % Approximation. 

Error in nw (line 56) 
DeCompImg=idwt2(cA1,c,cV1,cD1,'haar');** 

코드는 몇 이미지 잘 작동을하고 몇 가지 이미지에 대한 오류 위에서 보여줍니다. 작업 공간을 확인했습니다. 원본 이미지 크기가 홀수 (255x255) 인 경우에만이 오류가 발생합니다. 이미지 크기가 짝수 인 경우 (256x256)이 코드는 정상적으로 작동합니다. 이 문제를 해결하는 방법 without using imresize 명령? 도와주세요.

내 압축 코드 :

%Reading an Image 
I=imread('mandrill.jpg'); 
G=rgb2gray(I); 
%Applying Haar Wavelet 

[cA1,cH1,cV1,cD1] = dwt2(G,'haar'); 

%Applying 2x2 window averaing 

CompImgH=blockproc(cH1, [2 2], @(x) mean(x.data(:))); 
CompImgV=blockproc(cV1, [2 2], @(x) mean(x.data(:))); 
CompImgD=blockproc(cD1, [2 2], @(x) mean(x.data(:))); 

figure(1), 
subplot(2,2,1); 
imshow(G); 
title('Original Image'); 
subplot(2,2,2); 
imshow(CompImgH); 
title('Horizontal Component'); 
subplot(2,2,3); 
imshow(CompImgV); 
title('Vertical Component'); 
subplot(2,2,4); 
imshow(CompImgD); 
title('Diagonal Component'); 

%DECOMPRESSION 


%Inverse process for 2x2 window averaging 
b=CompImgH; 
[m,n,colormap]=size(b); 

k=1; %Counter for Row and 
l=1; %Column replication 
%f=input('enter replication factor: '); 
f=2; % replication factor 

for i=1:m %Loop for reading row and 
    for t=1:f %Row replication 

     for j=1:n %Loop for reading column and 
      for t=1:f %Column replication 

           c(k,l)=b(i,j); 
           l=l+1; 
      end 
     end 
     l=1; 
     k=k+1; 

    end 
end 

DeCompImg=idwt2(cA1,c,cV1,cD1,'haar'); 

DecompressedImage=uint8(DeCompImg); 

Orig_Image = im2double(G);%---Convert image to double class 
    Reconstructed_Image = im2double(DecompressedImage);%---Convert image to double class 
    [M N] = size(Orig_Image);%---Size of Original Image 
    err = Orig_Image - Reconstructed_Image;%---Difference between two images 
    MSE = (sum(sum(err .* err)))/(M * N); 
+0

'dwtmode ('status')'는 무엇을 반환합니까? 또한 루프 이후,'idwt2 '이전에'size (c)'는 무엇입니까? – chappjc

+0

'idwt2'에서 오류가 발생했습니다. 아마도 반올림/바닥재 (어쩌면 2로 나눈 값) 일 수 있으므로 홀수 일 때 문제가 발생합니다. 또는 나누기가 반올림/마루가 될 수 없으며 그렇게해야합니다. 어떤 부서라도 찾아보고 이상한 숫자가 발생하면 올바른 일을하는지 확인하십시오. – Frederick

+0

나는 아래의 명령을 사용하여이 오류를 없애려고했다. M = N 일 때만 작동하지만 N과 같지 않은 경우에는 작동한다. % [p q] = size (G); mod (p, 2) && mod (q, 2) % G = padarray (G, [1 1], 'pre') 인 경우 % % else –

답변

1

은 라인 (90)에 대한 기능 idwt2에 크기가 다른 두 개의 배열을 추가하려는 것으로 보인다. 이 문제를 해결할 수있는 유일한 방법은 그 원인을 추적하는 것입니다. 먼저 90 행에 중단 점을 설정하고, 코드를 실행하고, 변수의 크기를 조사해야합니다.

또는 dbstop if error을 사용하십시오. 그러면 오류가 발생했을 때 자동으로 디버거가 호출됩니다.

+0

고맙습니다. 제가 확인하겠습니다.. –