2次元配列の加重平均

15 visualizaciones (últimos 30 días)
R.Kato
R.Kato el 28 de Abr. de 2020
Comentada: Kenta el 1 de Mayo de 2020
2次元配列a(x,y)に対して、下記のように隣接要素の半径に応じた重みづけを行いながら平均化を行うには、
どのような関数を用いれば良いでしょうか。

Respuestas (2)

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

Iniciar sesión para comentar.


R.Kato
R.Kato el 1 de Mayo de 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 comentario
Kenta
Kenta el 1 de Mayo de 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')
円形の物体が強調された気がします(?)ね

Iniciar sesión para comentar.

Community Treasure Hunt

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

Start Hunting!