最初に
この記事で簡単に実装しているので、参考に見てみてください。
実践編
実践編では、何を記載しているかというと、上の記事ではフィルタサイズを3×3で作成していますが、それに対しフィルタサイズを可変できるようにし、さらに関数化します
コード
実行するファイルについてのコードです。
これについては特に説明することはありませんが、クラスの呼び出しについての参考記事を以下に記します。
%% 画像読み込み
Img = imread('画像名');
%% 自作したFilterクラスを用いて画像にフィルタをかけます
obj = Filter;
after_img = obj.movingAverage(Img, 3);
%% 表示
imshowpair(Img, after_img, 'montage')
続けてクラスの中身についてのコードです。
classdef Filter
properties
end
methods
%% 画像のサイズを取得関数
function image_size = getImgSize(obj, img)
image_size = size(img);
end
%% オリジナルpadarray関数
function padarray_image = getPadarrayImage(obj, img, img_size, kernel_size)
padarray_image = zeros(img_size(1) + kernel_size - 1, img_size(2) + kernel_size - 1);
i = (kernel_size - 1) / 2;
for t=1:img_size(1)
for s=1:img_size(2)
padarray_image(t+i, s+i) = img(t, s);
end
end
for t=1:i
padarray_image(i+1:i+img_size(1), i+1-t) = img(:, 1);
padarray_image(i+1:i+img_size(1), img_size(2)+i+t) = img(:, end);
end
for s=1:i
padarray_image(i+1-s, :) = padarray_image(i+2-s, :);
padarray_image(i+img_size(2)+s, :) = padarray_image(i+img_size(2)+s-1, :);
end
end
%% 移動平均フィルタ作成用関数
function get_ma_filter = getMAFilter(obj, kernel_size)
filter_sorce = ones(kernel_size);
option = 1 / kernel_size^2;
get_ma_filter = option * filter_sorce;
end
%% 移動平均メイン処理
function ma = movingAverage(obj, img, kernel_size)
try
% imreadで読み込んだ画像データは整数型なので細かく計算出来るように小数に変換
img = cast(img, 'double');
kernel_size = cast(kernel_size, 'double');
% 引数のkernel_sizeより移動平均フィルタの作成
kernel = getMAFilter(obj, kernel_size);
% 画像のサイズを取得する
img_size = getImgSize(obj, img);
% 画像の端を追加
padarray_image = getPadarrayImage(obj, img, img_size, kernel_size);
after_img = img;
new_pixel = 0;
% メインの処理
for i=1:img_size(1)
for s=1:img_size(2)
for t=0:kernel_size-1
for u=0:kernel_size-1
new_pixel = new_pixel + padarray_image(i+t, s+u) * kernel(t+1, u+1);
end
end
after_img(i, s) = new_pixel;
new_pixel = 0;
end
end
ma = after_img;
catch
warning('カーネルサイズを奇数で入力してください');
end
end
end
end
以上です。
実行結果
フィルタサイズ3×3

フィルタサイズ5×5

付録
クラスファイルの作り方
以下の画像の画面で右クリック

新規にマウスを合わせて、クラスを押下する

これで、クラスファイルの作成完了です。

コメント