3

分析のために画像を配列に保存しようとしています。プロセスをループし、結果をさまざまなファイルに「imwrite」すると、空の画像が保存されます (「imshow」と同じ)。画像配列をコンソールに出力すると、値は本来あるべき値になります (50 から 200 まで変化します)。これが私のコードの間違った部分です。助けてください:

**必要な変数はループの前に初期化されています。画像は空白ではありません。縮小画像は、印刷時にゼロ以外を示す配列です 'reduced_image(:,:,k);' しかし、inshow で空白の画像を表示します。「Img」変数についても同じです。スクイーズ機能を削除して、ピクセルのループごとのコピーを使用しようとしましたが、同じ結果が得られました**

for k=1:level
    for i=1:H/(2^k)
        for j=1:W/(2^k)
            reduced_image(i,j,k) = uint8 (( uint32(Image_current(2*i,2*j)) + uint32(Image_current(2*i - 1 ,2*j - 1)) )/2 ) ; 
        end
    end
    Img =  squeeze(reduced_image(:,:,k)) ;
    imwrite( Img , 'output.jpg' ) ;
end
4

3 に答える 3

0

データ形式の変換に問題があります。このバージョンは動作します:

for k=1:level
    for i=1:H/(2^k)
        for j=1:W/(2^k)
            reduced_image(i,j,k) = (double(Image_current(2*i,2*j)) + double(Image_current(2*i - 1 ,2*j - 1)) )/2 ; 
        end
    end
    Img =  squeeze(reduced_image(:,:,k)) ;
    imwrite(uint8(Img) , [int2str(k), 'output.jpg']) ;
end
于 2013-11-14T14:21:21.233 に答える
0

ときどき、imshow が範囲を使用しようとするためです。

ちょうど試して :

imshow(Img,[]);

imshow再スケーリングせずに現在の範囲画像を使用することを強制します。

または多分あなたはただすることができます

imshow(Img,[50 200]);

ただし、画像は 0 から 255 の間になるように再スケーリングされます (ディスプレイ上では、配列は変更されません)。

編集

表示画像をキャプチャするには、次のことができます。

h = figure;
imshow(Img,[]);

saveas(h,'PathImage.jpg');

編集2

0 ~ 1 の間で正規化し、255 を掛けて 0 ~ 255 の画像を取得します。ダブルキャストは除算用で、uint8 は画像形式に戻すためのものです。

maxVal = max(Img(:));
minVal = min(Img(:));

Img = uint8(255*double(double(Img(:) - minVal) / double( maxVal - minVal))));
于 2013-11-14T15:58:48.920 に答える
-2

次のコード行が欠落している可能性があります....チェックしてください

tagstruct.RowsPerStrip = 16

したがって、tagstruct の RowsPerStrip フィールドが欠落していることが、すべてゼロのイメージの原因である可能性があります。

于 2013-11-14T13:31:30.597 に答える