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

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

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 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 Comment
晴彦 片岡
晴彦 片岡 on 7 Jul 2022
返信が遅くなり申し訳ありませんでした。
おかげさまで解決いたしました。
ご回答ありがとうございます。

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!