【Python/OpenCV】メディアンフィルタ(cv2.medianBlur)で画像のぼかし・ノイズ除去

Python+OpenCVでメディアンフィルタを「NumPy」「cv2.medianBlur」で実装し、画像をぼかし・平滑化・ノイズ除去する方法をソースコード付きで解説します。

メディアンフィルタ(Median Filter)とは

メディアンフィルタ(Median Filter)は、画像のぼかし(平滑化)ができる空間フィルタです。
中央値フィルタともいいます。
原理式については下記事で紹介しています。

【画像処理】メディアンフィルタの原理・特徴・計算式
画像処理におけるメディアンフィルタの原理や計算式についてまとめました。

このアルゴリズムは、NumPyでも実装できます。
また、OpenCVの「cv2.medianBlur」メソッドを使えば、より簡単に実装できます。

今回は、以下の2通りの方法で処理を実装してみました。

方法①cv2.medianBlurで実装
方法②NumPyでアルゴリズムを書いて実装(原理の理解を深めるため)

解説動画

本ページの内容は以下動画で解説しています。

サンプルコード①OpenCVで実装した場合

PythonとOpenCVを使用して画像にメディアンフィルタを適用し、ノイズを除去するプログラムです。


サンプルプログラムの実行結果です。

■入力画像(左)と出力画像(右)
12

コード解説

cv.imread関数を使用して、指定されたパスから画像をグレースケールで読み込みます。0`はグレースケールモードを指定しています。

   gray = cv.imread("/Users/github/sample/python/opencv/filter2d/median/input.png", 0)

cv.medianBlurを使用して、画像にメディアンフィルタを適用します。grayは入力画像(グレースケール)。カラー画像を指定することもできます。ksize=13はカーネルサイズを指定しており、13×13の領域でフィルタリングを行います。

dst = cv.medianBlur(gray, ksize=13)

メディアンフィルタは、画像の各ピクセルの周囲のピクセル値の中央値を計算し、その値で置き換えることでノイズを除去します。カーネルサイズが大きくほど、中央値の計算に用いる周囲のピクセル数が増加し、ノイズ除去の効果が高まります。

公式ドキュメント:https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9

サンプルコード②NumPyで実装した場合

サンプルプログラムのソースコードです。


コード解説

以下で、メディアンフィルタ関数を定義しています。

   def median_filter(src, ksize):
       # 畳み込み演算をしない領域の幅
       d = int((ksize-1)/2)
       h, w = src.shape[0], src.shape[1]

       # 出力画像用の配列(要素は入力画像と同じ)
       dst = src.copy()

       for y in range(d, h - d):
           for x in range(d, w - d):
               # 近傍にある画素値の中央値を出力画像の画素値に設定
               dst[y][x] = np.median(src[y-d:y+d+1, x-d:x+d+1])

       return dst
  • 入力画像srcに対してメディアンフィルタを適用します。
  • ksizeはカーネルサイズを指定し、フィルタリングに使用する領域のサイズを決定します。
  • dはカーネルの半径を計算しています。
  • hwは画像の高さと幅です。
  • 出力画像dstを入力画像のコピーとして初期化します。
  • 2重forループの部分で、画像の各ピクセルに対して、近傍のピクセル値の中央値を計算し、その値で置き換えます。

そして、以下で定義したmedian_filter関数を呼び出し、カーネルサイズ5でメディアンフィルタを適用します。

   dst = median_filter(gray, ksize=5)

関連ページ

【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
Python基礎
「Python基礎」の記事一覧です。
この記事を書いた人
西住技研

Python使用歴は10年以上。研究、仕事、趣味でデータ分析や作業自動化などに活用し、そこで得たノウハウを初心者から上級者まで幅広いユーザーに情報発信しています。
詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
OpenCV

コメント