0

教授の説明に従って、画像圧縮コードを作成しました。正常に動作しますが、一部の画像では次のエラーが表示されます。

**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);
4

1 に答える 1

1

idwt290 行目の関数で、サイズの異なる 2 つの配列を追加しようとしているようです。この問題を解決する唯一の方法は、その原因を追跡することです。まず、90 行目にブレークポイントを設定し、コードを実行して、変数のサイズを確認する必要があります。

dbstop if errorまたは、エラーが発生したときにデバッガーを自動的に呼び出す を使用します。

于 2013-10-24T19:36:32.537 に答える