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

18 views (last 30 days)
Takanori Aihara
Takanori Aihara on 16 Nov 2021
Commented: Takanori Aihara on 18 Nov 2021
平均値化フィルタ―を使用して移動平均をとった行列を出したいです
また、その計算の際、nanの数値を移動平均の計算式に入れないようにする方法も教えていただきたいです。
よろしくお願いします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 16 Nov 2021
>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 Comments
Atsushi Ueno
Atsushi Ueno on 17 Nov 2021
fspecial関数は平均化フィルタを作る関数です。fspecial関数が出力する平均化フィルタの定義はones(hsize)/prod(hsize)なので、要素にNaNが含まれる事はありません。
「もし画像データか平均化フィルタのいずれかにNaNが含まれていても、NaNを0に置き換えれば畳み込み演算に影響を与えない」という事です。
Takanori Aihara
Takanori Aihara on 18 Nov 2021
承知しました
ご教授ありがとうございました

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!