2

次の論文で、単純な画像超解像アルゴリズム (DWT ベースの解像度拡張) を実装しようとしています。

http://www.ripublication.com/aeee/52_pp%20%20%20405-412.pdf

この論文の図 3 のアルゴリズムを Matlab を使用して実装しようとしました。コードを以下に示します。

img1 = imread('lena1.jpg'); %original High resolution image
[height, width, dim] = size(img1);

%%Downsampling the image by averaging
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img1);
img = avgimg(1:2:end,1:2:end); %Input low resolution image

[LL,LH,HL,HH] = dwt2(img,'haar'); %Decomposing

%Bicubic interpolation by factor 2 on each subbands
LL1 = imresize(LL,2,'bicubic');
LH1 = imresize(LH,2,'bicubic');
HL1 = imresize(HL,2,'bicubic');
HH1 = imresize(HH,2,'bicubic');

%% Calculating Difference image
for i=1:256
    for j=1:256
        img3(i,j,:) = img(i,j,:) - LL1(i,j,:);
    end
end


for i=1:256
    for j=1:256
        LH13(i,j,:) = img3(i,j,:) + LH1(i,j,:);
        HL13(i,j,:) = img3(i,j,:) + HL1(i,j,:);
        HH13(i,j,:) = img3(i,j,:) + HH1(i,j,:);
    end
 end

%bicubic interpolation(Here alpha = 2;Hence alpha/2 = 1) 
 img31 = imresize(img3,1,'bicubic');
 LH131 = imresize(LH13,1,'bicubic');
 HL131 = imresize(HL13,1,'bicubic');
 HH131 = imresize(HH13,1,'bicubic');

img4 = idwt2(img31,LH131,HL131,HH131,'haar'); %IDWT
t = uint8(img4)
imshow(t);
imsave;

しかし、まったく予期しない出力画像が表示されます。なぜこれが起こっているのですか。助けてください。よろしくお願いします。

入力画像:

レナ1

出力画像:

出力

4

1 に答える 1

4

論文にあるブロック図を見てみました。間違ったイメージで再構築しています。最後のステップでは、差分画像ではなく、元のダウンサンプリングされた画像を IDWT の一部として使用する必要があります。自己封じ込めの図は次のとおりです。

ここに画像の説明を入力

アルゴリズムの最終ステップを見てください。前のステップの LH、HL、および HH コンポーネントと組み合わせて、低解像度の画像を使用します。前のステップから、前のステップからの DWT コンポーネント (LL コンポーネントなし) を差分画像に追加することで、これらの各サブバンドを取得するので、これは正しいことになります。

私が提案する他のいくつかのコメントは、ダイナミックレンジが[0,1]. でこれを行うことができますim2doubleforまた、ループを使用して、ベクトル化された操作で実行される場合の差を非効率的に計算しています。1最後に、コードの終わりに向かっての係数で補間を実行しています。同じ画像が返されるだけなので、これは役に立たない操作です。スピードアップのために、コードからこれを削除しました。そのため、これは私が持っているコードです。レナの画像が含まれていないことに注意してください。インターネットから画像を取得しました.

これ以上苦労することなく、変更されたコードは次のとおりです。

clear all;
close all;
img1 = imread('http://www.ece.rice.edu/~wakin/images/lenaTest3.jpg'); %original High resolution image
[height, width, dim] = size(img1);

%// Change - convert to [0,1]
img1 = im2double(img1);

%%Downsampling the image by averaging
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img1);
img = avgimg(1:2:end,1:2:end); %Input low resolution image

[LL,LH,HL,HH] = dwt2(img,'haar'); %Decomposing

%Bicubic interpolation by factor 2 on each subbands
LL1 = imresize(LL,2,'bicubic');
LH1 = imresize(LH,2,'bicubic');
HL1 = imresize(HL,2,'bicubic');
HH1 = imresize(HH,2,'bicubic');

% // Change - Vectorized operations
img3 = img - LL1;
LH13 = img3 + LH1;
HL13 = img3 + HL1;
HH13 = img3 + HH1;

%bicubic interpolation(Here alpha = 2;Hence alpha/2 = 1) 
%// Change - commented out
%// Also, used ORIGINAL downsampled image, not the difference image
 %img31 = imresize(img,1,'bicubic');
 %LH131 = imresize(LH13,1,'bicubic');
 %HL131 = imresize(HL13,1,'bicubic');
 %HH131 = imresize(HH13,1,'bicubic');

%// Change - used original downsampled image
img4 = idwt2(img,LH13,HL13,HH13,'haar'); %IDWT
t = im2uint8(img4); %// Change - Convert back to uint8 when finished
imshow(t,[]);

これは私が得るイメージです:

ここに画像の説明を入力


元のレナのイメージに近いものは何も得られません。そのため、いくつかのパラメーターを微調整する必要があるか、アルゴリズムに欠陥があると思われます。この方法が無名の雑誌に掲載されたことを考えると、私は後者を疑っています。

これで始められるはずです。幸運を!

于 2014-11-07T15:41:42.147 に答える