Python+OpenCVでメディアンフィルタを「NumPy」「cv2.medianBlur」で実装し、画像をぼかし・平滑化・ノイズ除去する方法をソースコード付きで解説します。
メディアンフィルタ(Median Filter)とは
メディアンフィルタ(Median Filter)は、画像のぼかし(平滑化)ができる空間フィルタです。
中央値フィルタともいいます。
原理式については下記事で紹介しています。
このアルゴリズムは、NumPyでも実装できます。
また、OpenCVの「cv2.medianBlur」メソッドを使えば、より簡単に実装できます。
今回は、以下の2通りの方法で処理を実装してみました。
方法①cv2.medianBlurで実装
方法②NumPyでアルゴリズムを書いて実装(原理の理解を深めるため)
解説動画
本ページの内容は以下動画で解説しています。
サンプルコード①OpenCVで実装した場合
PythonとOpenCVを使用して画像にメディアンフィルタを適用し、ノイズを除去するプログラムです。
サンプルプログラムの実行結果です。
■入力画像(左)と出力画像(右)
コード解説
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
はカーネルの半径を計算しています。h
とw
は画像の高さと幅です。- 出力画像
dst
を入力画像のコピーとして初期化します。 - 2重forループの部分で、画像の各ピクセルに対して、近傍のピクセル値の中央値を計算し、その値で置き換えます。
そして、以下で定義したmedian_filter
関数を呼び出し、カーネルサイズ5でメディアンフィルタを適用します。
dst = median_filter(gray, ksize=5)
コメント