matlabでの画像​に対するfilter​についての質問です。

1 Ansicht (letzte 30 Tage)
晴彦 片岡
晴彦 片岡 am 3 Jul. 2022
Kommentiert: 晴彦 片岡 am 7 Jul. 2022
matlab初心者のものです。自身で定義したフィルターを用いて画像を平滑化しようとしています。
起こっている問題としては、平滑化を目的としてフィルターを適用したにもかかわらず、意に反して画像の色が真っ赤になってしまいます。
コードは以下です。
この後、imshow(r)を入力すると、元の画像の色が真っ赤になったものが表示されてしまいます。
つまらない質問かもしれませんがご回答いただけると大変助かります。よろしくお願い致します。

Akzeptierte Antwort

Atsushi Ueno
Atsushi Ueno am 3 Jul. 2022
画像の色が真っ赤になってしまったという事は、IMG_0678.JPGはカラー画像として読み込まれたはずです。
  • カラー画像データは3次元(RGB)データなので、RGB共に処理する必要があります。質問のプログラムはR成分しか処理していないので、R成分だけが強調(説明は次)されて真っ赤になっています。
  • フィルタ行列は要素毎に掛けるべきところを、行列の掛け算をしてしまっています。その為、平均化フィルタリング処理の結果に比べて、元の画素値が大きくなってしまっています。(R成分が強調された理由)
下記は質問のプログラム(右)と修正したプログラム(左)の差分です。sum関数の引数がtemp(:)のままだと、RGB成分全ての和を返してしまうので、vecdimオプションにより各ページ(RGB)の総和となる 1 x 1 x 3 の配列を返す様に、即ちRGB別の和を返す様に変更しました。
下記の4枚の画像と演算内容は下記の通りです
  • r0: 質問のプログラムの再現結果 (真っ赤になり、意図しない結果)
  • r1: RGB別に処理するよう変更した結果(フィルタ処理が行列の乗算の為、意図しない結果)
  • r2: RGB別の要素毎乗算に変更した結果(平均化フィルタリングによりぼやけて、意図した結果に)
  • I: 元の画像
I = imread('onion.png');
gfl = (1/16) * [1 2 1;2 4 2; 1 2 1];
Id = im2double(I);
s = size(Id);
r0 = zeros(s);
r1 = zeros(s);
r2 = zeros(s);
for i = 2:s(1)-1
for j = 2:s(2)-1
temp = Id(i-1:i+1,j-1:j+1) * gfl;
r0(i-1,j-1) = sum(temp(:));
for k = 1:3
temp = Id(i-1:i+1,j-1:j+1,k) * gfl;
r1(i-1,j-1,k) = sum(temp(:));
end
temp = Id(i-1:i+1,j-1:j+1,:) .* gfl;
r2(i-1,j-1,:) = sum(temp,[1 2]);
end
end
montage({r0,r1,r2,I});
  1 Kommentar
晴彦 片岡
晴彦 片岡 am 7 Jul. 2022
返信が遅くなり申し訳ありませんでした。
おかげさまで解決いたしました。
ご回答ありがとうございます。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu イメージ finden Sie in Help Center und File Exchange

Produkte


Version

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!