0

平均化操作で画像のダウンサンプリングを実行しました。イメージは 2 x 2 ブロックに分割され、4 倍にダウンサンプリングされます。ダウンサンプリングされた画像の新しいピクセル値は、次のように各ブロックの平均値に置き換えられます。

img = imread('cameraman.tif');
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img);
down1 = avgimg(1:2:end,1:2:end);
imshow(down1);

入力としてグレースケール画像を使用しました。ただし、ダウンサンプリングの出力として完全な白い画像が得られます。なぜこうなった?助けてください。

4

1 に答える 1

3

なぜこうなってしまうのかというと、使用後の平均的なイメージfilter2ダブルタイプのイメージだからです。あなたはimshow. imshow実際、ここ StackOverflowに関して私が解決したほとんどすべての問題は、 imshow.

この関数を使用する前に、表示しようとしている画像の種類を認識しておく必要があります。imshowタイプの画像はdouble、その強度/カラー チャンネルが の間の範囲にあることが期待されます[0,1]。以下0はすべて黒に設定され、それ以外1は白に設定されているため、完全に白い画像が得られます。

uint8画像を正しく表示するには、元に戻す必要があります。そのため、画像を表示する前にこれを試してください。

down1 = uint8(down1);
imshow(down1);

これを行うと、ダウンサンプリングされた画像を表示すると、これが得られます。

ここに画像の説明を入力


軽微なコメント

FWIW、画像フィルタリングに関しては、imfilter代わりに個人的に使用します。 imfilterは画像フィルタリング用に設計されていますが、filter2はより一般的な 2D 信号用です。良い点の 1 つは、同じタイプの画像をデフォルトでimfilter出力することです。あなたが画像でそれを使用することを余儀なくされない限り、私は近づかないでしょう.filter2doublefilter2

filter2そのため、構文を次のように置き換えます。

avgimg = imfilter(img, avgfilter);

代わりにこれを行う場合、イメージを にキャストする必要はありませんuint8。を使用すると、結果を適切に視覚化できますimshow

于 2014-10-04T04:32:45.333 に答える