MATLAB Answers

2次元配列の加重平均

26 views (last 30 days)
R.Kato
R.Kato on 28 Apr 2020
Commented: Kenta on 1 May 2020
2次元配列a(x,y)に対して、下記のように隣接要素の半径に応じた重みづけを行いながら平均化を行うには、
どのような関数を用いれば良いでしょうか。

Answers (2)

Shunichi Kusano
Shunichi Kusano on 28 Apr 2020
任意のフィルタであればimfilter関数が使えると思います。下記URLの構文のところでhがフィルタになるので、ここにご所望の関数による計算値(例えば単純な3x3の平均フィルタであればh = ones(3,3)/9;といった具合です)を入れることになります。
  1 Comment
Kenta
Kenta on 28 Apr 2020
こんにちは、Kusanoさまの回答に関連してですが、ガウシアンフィルターも簡単に試すことができます。
提示いただいた式だと、関心点を中心とする一辺2r+1の範囲のシンプルな平均ですが、関心点から遠ざかるにつれ重みづけをしたい場合もあるかと思いました。

Sign in to comment.


R.Kato
R.Kato on 1 May 2020
ご回答ありがとうございました。
原始的ですが、下記のようにフィルタを作成してみました。
function circ_fil=get_circ_fil(radius)
circ_fil=zeros(2*radius+1);
for n = 1:(2*radius+1)
for m = 1:(2*radius+1)
if (n==radius+1) && (m==radius+1)
circ_fil(n,m)=1;
else
r=sqrt((n-(radius+1))^2+(m-(radius+1))^2);
if r<=radius
circ_fil(n,m)=1/(2*r+1)^2;
end
end
end
end
  1 Comment
Kenta
Kenta on 1 May 2020
ご報告ありがとうございます。進んだようでよかったです。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')
円形の物体が強調された気がします(?)ね

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!