【画像処理基礎】ノイズを除去するメディアンフィルタ

画像のごま塩ノイズを除去したい。そんなときはメディアンフィルタの登場です。本記事では、ノイズを除去するメディアンフィルタについて解説します。

この記事はこんな人におすすめ!

  • 画像処理を学んでいる初心者
  • ノイズ除去の技術を理解したい人
  • プログラミングで画像処理を実践したい人
目次

メディアンフィルタとは

メディアンフィルタとは空間フィルタリングの一種です。

メディアン(median)とは中央値のこと。メディアンフィルタは、周辺画素の画素値を降(昇)順に並べ、中央値を出力します。周辺画素に対して著しく外れた値(ノイズ)は、メディアンフィルタを通過すると除去されます。

下図は3×3メディアンフィルタでノイズが除去されるイメージ図です。

座標(i,j)の画素は上下左右斜めに対して著しく外れた「10」ですが、メディアンフィルタを通過すると、上下左右斜めの画素中央値である「2」に変換され、ノイズが除去されることが分かります。

OpenCVを用いたノイズ除去

PythonとOpenCVライブラリを用いれば、簡単にメディアンフィルタで画像のノイズを除去することが出来ます。

こちらがメディアンフィルタのPythonサンプルプログラムです。

import cv2 as cv

def concat_tile(im_list_2d):
    return cv.vconcat([cv.hconcat(im_list_h) for im_list_h in im_list_2d])

img = cv.imread("sample.jpg") # 写真の読み込み

img_median3 = cv.medianBlur(img, 3)  # 3x3のメディアンフィルタ
img_median5 = cv.medianBlur(img, 5)  # 5x5のメディアンフィルタ
img_median7 = cv.medianBlur(img, 7)  # 7x7のメディアンフィルタ

imgs = concat_tile([[img, img_median3], [img_median5, img_median7]])

cv.imshow("img", imgs)
cv.imwrite("output.jpg", imgs)

if cv.waitKey(0) & 0xFF == ord('q'):
    cv.destroyAllWindows()

左上が元画像。右上、左下、右下がそれぞれ3×3、5×5、7×7のメディアンフィルタを適用した画像となります。

3×3フィルタサイズで、ごま塩ノイズが十分除去されていることが分かりますね。フィルタサイズを大きくしすぎると、画像全体がぼやけてしまうので注意が必要です。

medianBlur関数を用いることで入力画像にメディアンフィルタを簡単に適用することができます。
cv.medianBlur(img, N)  # NxNのメディアンフィルタ

第1引数に入力画像、第2引数にフィルタサイズを設定します。

ガウシアンフィルタとの比較

ぼかしの基本であるガウシアンフィルタでも、ごま塩ノイズが除去できるか試してみましょう。

ガウシアンフィルタについては、下記リンク先参照して下さい。

あわせて読みたい
【画像処理基礎】ぼかしの基本!ガウシアンフィルタって何? 写真の主役を引き立たせるために背景をぼかしたり、プライバシー保護のため写真の顔をぼかしたりしますよね? Photoshopなどの画像処理ソフトで画像をぼかそうとすると...

左上が元画像。右上、左下、右下がそれぞれσ=1、σ=2、σ=3のガウシアンフィルタを適用した画像です。

σを大きくしないと、ごま塩ノイズは除去できないことが分かります。ごま塩ノイズ除去できたとしても、画像はかなりぼやけてしまいますね。

まとめ

本記事では、ノイズを除去するメディアンフィルタについて解説しました。

画像のごま塩ノイズを除去したければ、メディアンフィルタを適用すればよいことが分かりましたね。

この記事が画像処理を学ぶ皆さんのためになれば幸いです。

独学が大変な方は、書籍やスクールを活用するのも手です。私も活用しているものを載せておきますので参考にして下さい。

最後までお読み頂きありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次