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

16 次查看(过去 30 天)
Takanori Aihara
Takanori Aihara 2021-11-16
平均値化フィルタ―を使用して移動平均をとった行列を出したいです
また、その計算の際、nanの数値を移動平均の計算式に入れないようにする方法も教えていただきたいです。
よろしくお願いします。

采纳的回答

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

请先登录,再进行评论。

更多回答(0 个)

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!