2次元配列の加重平均
11 ビュー (過去 30 日間)
古いコメントを表示
2次元配列a(x,y)に対して、下記のように隣接要素の半径に応じた重みづけを行いながら平均化を行うには、
どのような関数を用いれば良いでしょうか。

0 件のコメント
回答 (2 件)
Shunichi Kusano
2020 年 4 月 28 日
任意のフィルタであればimfilter関数が使えると思います。下記URLの構文のところでhがフィルタになるので、ここにご所望の関数による計算値(例えば単純な3x3の平均フィルタであればh = ones(3,3)/9;といった具合です)を入れることになります。
1 件のコメント
Kenta
2020 年 4 月 28 日
こんにちは、Kusanoさまの回答に関連してですが、ガウシアンフィルターも簡単に試すことができます。
提示いただいた式だと、関心点を中心とする一辺2r+1の範囲のシンプルな平均ですが、関心点から遠ざかるにつれ重みづけをしたい場合もあるかと思いました。
R.Kato
2020 年 5 月 1 日
1 件のコメント
Kenta
2020 年 5 月 1 日
ご報告ありがとうございます。進んだようでよかったです。for分を少なく書くなら
r=10;
として、上でいうradiusに相当する変数を定義した後に
filt=zeros(r*2+1,'logical');
filt(r+1,r+1)=1;
filt_circle = double(bwdist(filt) <= r+1)./(r+1)^2;
このようにすれば簡単にフィルターを作成できます。
また、
r=10;
filt=zeros(r*2+1,'logical');
filt(r+1,r+1)=1;
filt_circle_gradation = sqrt(1./double(bwdist(filt)));
filt_circle_gradation(r+1,r+1)=1;
figure;imagesc(filt_circle_gradation);colormap('jet')
とすれば、中心部に近いほど値を大きくするようにもできます。左が最初のフィルターを右が後半のコードで作成したものです。

Kusanoさまのおっしゃるように、imfilter関数を使うとフィルター演算を実行できます。
circles = imread('coloredChips.png');
B = imfilter(circles,filt_circle);
figure;imshowpair(circles,B,'montage')

円形の物体が強調された気がします(?)ね
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!