画像用フィルタをMATLABで自作してみた【実践】

プログラミング

最初に

画像用移動平均フィルタをMATLABで自作してみた

この記事で簡単に実装しているので、参考に見てみてください。

実践編

実践編では、何を記載しているかというと、上の記事ではフィルタサイズを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

付録

クラスファイルの作り方

以下の画像の画面で右クリック

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

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

コメント

タイトルとURLをコピーしました