【Python・画像処理】画像の平滑化(平均化フィルタリング)

Python

平均化フィルタリングとは

空間フィルタリングの一つで、周囲の画素の平均をとることで、全体を滑らかにするとても簡単なフィルタリング技術です。
また、結果としてフィルタ適用後の画像は元画像をボケさせたようなものになります。

適用方法

まずは、画素にかけるフィルタ(またはカーネル)を作成します。

3×3の場合はこのようになります。

3×3の平均化フィルタ

また、5×5はこのようになります。

5×5の平均化フィルタ

そして、このフィルタを注目画素と周辺画素にかけて、最後にその和をとると完了です。

実際に平均化フィルタリングを行う

今回は、この解像度低めの画像を使って平均化フィルタリングを行います。

ソースコード

import numpy as np      # 行列の計算用
from PIL import Image   # 画像の読み込み用

# 元画像を読み込む
image = Image.open('avg.jpeg')
# 元の画像
image.show()

################################################
# 平均化フィルタリングを行う関数
# 
# @param size int フィルタの適用範囲
################################################
def avg_filtering(size):

    # 読み込んだ画像を2次元配列に変換する
    image_array = np.array(image)
    avg_image_array = image_array

    # 画像に畳み込むフィルタ
    avg_filter = None
    # 色々と使うので先にずらす値を変数として作っておく
    slide = int(size/2)

    # フィルタサイズが3x3のとき
    if size == 3:
        avg_filter = np.full((3, 3), 1/9)
    # フィルタサイズが5x5のとき
    if size == 5:
        avg_filter = np.full((5, 5), 1/25)

    # 端っこの方はフィルタをかけることができないのでそのまま出力
    # フィルタをかけられるところだけにかけたいのでint(size/2)で少しずらしてる
    # 画像の縦のループ
    for row_index in range(slide, len(image_array)-slide):
        # 横一列にかけるループ
        for column_index in range(slide, len(image_array[row_index])-slide):
            # 注目画素を新しいくするために、一旦0クリアする
            new_pixel_value = 0
            # 注目画素と周囲の画素にフィルタをかけて積和を取って新しい画素を作成する
            for i, y in enumerate(range(row_index-slide, row_index+slide+1)):
                for j, x in enumerate(range(column_index-slide, column_index+slide+1)):
                    new_pixel_value += image_array[y][x] * avg_filter[i, j]
            # 処理の最後に積和の値で画素を更新する
            avg_image_array[row_index][column_index] = new_pixel_value
    # フィルタリングした画像として保存する
    avg_image = Image.fromarray(np.uint8(avg_image_array))
    # フィルタリングした変換結果を表示する
    avg_image.show()

# 実際にエンボス加工を行う
avg_filtering(3) # 3x3
avg_filtering(5) # 5x5

実行結果

元画像
3×3の平均化フィルタリング
5×5の平均化フィルタリング

まとめ

徐々に、適用の範囲を広げると段々滑らかになっていくことがわかりました!!

次回は、重み付き平均化フィルタ(ガウシアンフィルタ)リングについて書こうと思います。

コメント

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