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

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

 채택된 답변

Atsushi Ueno
Atsushi Ueno 2022년 7월 3일

1 개 추천

画像の色が真っ赤になってしまったという事は、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

晴彦 片岡
晴彦 片岡 2022년 7월 7일
返信が遅くなり申し訳ありませんでした。
おかげさまで解決いたしました。
ご回答ありがとうございます。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 イメージ에 대해 자세히 알아보기

제품

릴리스

R2022a

질문:

2022년 7월 3일

댓글:

2022년 7월 7일

Community Treasure Hunt

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

Start Hunting!