2次元配列の加重平均

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

Antworten (2)

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

Melden Sie sich an, um zu kommentieren.


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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Logical finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!