画像のごま塩ノイズを除去したい。そんなときはメディアンフィルタの登場です。本記事では、ノイズを除去するメディアンフィルタについて解説します。
この記事はこんな人におすすめ!
- 画像処理を学んでいる初心者
- ノイズ除去の技術を理解したい人
- プログラミングで画像処理を実践したい人
メディアンフィルタとは
メディアンフィルタとは空間フィルタリングの一種です。
メディアン(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フィルタサイズで、ごま塩ノイズが十分除去されていることが分かりますね。フィルタサイズを大きくしすぎると、画像全体がぼやけてしまうので注意が必要です。
cv.medianBlur(img, N) # NxNのメディアンフィルタ
第1引数に入力画像、第2引数にフィルタサイズを設定します。
ガウシアンフィルタとの比較
ぼかしの基本であるガウシアンフィルタでも、ごま塩ノイズが除去できるか試してみましょう。
ガウシアンフィルタについては、下記リンク先参照して下さい。
左上が元画像。右上、左下、右下がそれぞれσ=1、σ=2、σ=3のガウシアンフィルタを適用した画像です。
σを大きくしないと、ごま塩ノイズは除去できないことが分かります。ごま塩ノイズ除去できたとしても、画像はかなりぼやけてしまいますね。
まとめ
本記事では、ノイズを除去するメディアンフィルタについて解説しました。
画像のごま塩ノイズを除去したければ、メディアンフィルタを適用すればよいことが分かりましたね。
この記事が画像処理を学ぶ皆さんのためになれば幸いです。
独学が大変な方は、書籍やスクールを活用するのも手です。私も活用しているものを載せておきますので参考にして下さい。
最後までお読み頂きありがとうございました!