画像への平均値化フィルターの適用

平均値化フィルタ―を使用して移動平均をとった行列を出したいです
また、その計算の際、nanの数値を移動平均の計算式に入れないようにする方法も教えていただきたいです。
よろしくお願いします。

 Réponse acceptée

Atsushi Ueno
Atsushi Ueno le 16 Nov 2021

0 votes

>nanの数値を移動平均の計算式に入れないようにする方法
演算前にNaNを探して0にしておけば、畳み込みの際に影響を与えない(計算に入れない)事になります。これを行う"nanconv関数"がFile Exchangeにありました。conv2の代わりにnanconvを使いました(NaN値は入れてませんが)
2つの方法を実行してみます
  1. MATLABのみで実行可能な関数を使用:画像データの種類を考慮したり、自分でフィルタを記述する必要があります
  2. image processing toolboxが必要な関数を使用:画像やフィルタの種類を選ばず、多くの条件に対応します
I = imread('peppers.png');
hsize = [1,20]; % 平均化フィルタのサイズ
%% 1:MATLABのみで実行可能な関数を使用
H = ones(hsize(1),hsize(2))/(hsize(1)*hsize(2)); % fspecialのアルゴリズムに基づく平均化フィルタ
R = uint8(nanconv(I(:,:,1),H,'same')); % イメージ(R成分)と平均化フィルタの畳み込み(conv2⇒nanconvに置換)
G = uint8(nanconv(I(:,:,2),H,'same')); % イメージ(G成分)と平均化フィルタの畳み込み(conv2⇒nanconvに置換)
B = uint8(nanconv(I(:,:,3),H,'same')); % イメージ(B成分)と平均化フィルタの畳み込み(conv2⇒nanconvに置換)
C = cat(3,R,G,B);
imshow(C);
%% 2:image processing toolboxが必要な関数を使用
H = fspecial('average',hsize); % 色々なフィルタを名前とサイズ等のパラメータだけで作成できます
C = imfilter(I,H); % やってる事はconv2と同じですが、あらゆる条件に対応可能なすごい関数です
imshow(C);

3 commentaires

Takanori Aihara
Takanori Aihara le 17 Nov 2021
早速の回答、ありがとうございます
つまるところ、fspecial関数を使えば平均化フィルタ―(移動平均)を使用する際に含まれる0の値は自動的に計算では除外される(分母にも含まれない)と考えてよろしいでしょうか?
Atsushi Ueno
Atsushi Ueno le 17 Nov 2021
fspecial関数は平均化フィルタを作る関数です。fspecial関数が出力する平均化フィルタの定義はones(hsize)/prod(hsize)なので、要素にNaNが含まれる事はありません。
「もし画像データか平均化フィルタのいずれかにNaNが含まれていても、NaNを0に置き換えれば畳み込み演算に影響を与えない」という事です。
Takanori Aihara
Takanori Aihara le 18 Nov 2021
承知しました
ご教授ありがとうございました

Connectez-vous pour commenter.

Plus de réponses (0)

Produits

Version

R2021b

Community Treasure Hunt

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

Start Hunting!