2次元配列の加重平均

10 vues (au cours des 30 derniers jours)
R.Kato
R.Kato le 28 Avr 2020
Commenté : Kenta le 1 Mai 2020
2次元配列a(x,y)に対して、下記のように隣接要素の半径に応じた重みづけを行いながら平均化を行うには、
どのような関数を用いれば良いでしょうか。

Réponses (2)

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

Connectez-vous pour commenter.


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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!