【Python】画像のノイズ除去・平滑化・ぼかし|OpenCVによる画像フィルタ処理

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ
  • Pythonによる画像処理に興味がある。
  • OpenCVの画像処理を適用し画像のノイズ除去・平滑化(ぼかし)を実行できるようになりたい。
目次

OpenCVとは

OpenCV(Open Source Computer Vision Library)とは、画像処理やコンピュータビジョンの分野で広く活用されているオープンソースライブラリです。画像データの数値処理に強いのが特徴であり、高度な統計アルゴリズムも多数含まれていることから、近年機械学習の分野でも広く利用されています。

【OpenCV】画像の平滑化とは

画像の平滑化(ぼかし)は、画像中のノイズ除去を目的とした手法であり、画像中のエッジやノイズを消すことによって実現されます。平滑化は、ローパスフィルタからなるカーネルを重畳積分することによって実行可能です。

本記事ではOpenCVで用意されている「画像の平滑化手法」と「Pythonでのコーディング方法」を解説します。

【Python×OpenCV】画像のノイズ除去・平滑化処理

PythonのOpenCVライブラリを用いて画像の平滑化を実現する方法について解説します。

平滑化フィルタによるノイズ除去|cv2.blur

OpenCVのcv2.blur()メソッドを活用すると、正規化されたボックスフィルターを活用して画像のぼかしが実行されます。以下、9×9のボックスフィルタを用いて平滑化したコード例を示します。

import cv2

# 画像
img = cv2.imread("image_data.jpg")

# 平滑化フィルタ
smooth_img = cv2.blur(img,   # 入力画像
                      (9,9)  # 畳込配列
                     )
 
# 表示
cv2.imshow("smooth_img",smooth_img)  # 平滑化した画像
cv2.imshow("img",img)                # オリジナル画像
cv2.waitKey(0)
cv2.destroyAllWindows()

メディアンフィルタによるノイズ除去|cv2.medianBlur

cv2.medianBlur() メソッドを用いると、カーネル内の全画素の中央値計算に基づき平滑化が実行されます。メディアンフィルタは、常にオリジナル画像内にある画素値を出力として用いるため、外れ値のようなドット系のノイズ除去に効果的であると言えます。

import cv2

# 画像
img = cv2.imread("image_data.jpg")

# メディアンフィルタ
median_filter = cv2.medianBlur(img,   # 入力画像
                               1      # カーネルサイズ(奇数)
                              )

# 表示
cv2.imshow("median_filter",median_filter)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ガウシアンフィルタによるノイズ除去|cv2.GaussianBlur

cv2.GaussianBlur()を活用すると、注目画素との距離に応じた重み付け平均値を出力するガウシアンカーネルを用いて、平滑化が実行されます。ガウシアンフィルタの特徴はオリジナル画像に存在しない画素の画素値を活用して平滑化が実行される点です。そのため、白色ノイズ等の除去に適した平滑化手法と言えます。

import cv2

# 画像
img = cv2.imread("image_data.jpg")

# ガウシアンフィルタ
img_gafilter = cv2.GaussianBlur(img,     # 入力画像
                               (9,9),    # カーネルの縦幅・横幅
                                2        # 横方向の標準偏差(0を指定すると、カーネルサイズから自動計算)
                            )

# 表示
cv2.imshow("img_gafilter",img_gafilter)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

バイラテラルフィルタによるノイズ除去|cv2.bilateralFilter

一般的に、画像の平滑化を行うと、エッジをぼかすことになりますが、バイラテラルフィルタcv2.bilateralFilter()の場合、エッジを保持しつつ画像をぼかすことができるのが特徴的です。

import cv2

# 画像
img = cv2.imread("image_data.jpg")

# バイラテラルフィルタ
br_filter = cv2.bilateralFilter(img,  # 入力画像
                                100,  # 注目画素の周辺領域(値が大きいほどぼかしが強くなる)
                                120,  # 色空間の標準偏差
                                10    # 距離空間の標準偏差
                               )

# 表示
cv2.imshow("br_filter",br_filter)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【参考】Python・OpenCVを用いた画像処理

当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。

用途【Python×OpenCV】記事名
画像変換画像のリサイズ・拡大・縮小
画像変換画像の回転・反転・平行移動|アフィン変換
画像変換画像の明るさ調節|ガンマ補正
画像変換グレースケール・HSV・L*a*b|色空間の変換
画像変換モノクロ(白黒)画像変換|2値化処理
画像変換ヒストグラムの描画・ヒストグラム均一化処理
画像変換画像上にテキスト・図形(直線・長方形・円)を描画
画像変換画像の透視変換・遠近法
画像変換画像のノイズ除去・平滑化
画像変換画像の畳み込み(空間フィルタリング)
特徴抽出エッジの検出方法

画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。

最後に

【参考】Python・OpenCVを用いた画像処理

当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。

用途【Python×OpenCV】記事名
画像変換画像のリサイズ・拡大・縮小
画像変換画像の回転・反転・平行移動|アフィン変換
画像変換画像の明るさ調節|ガンマ補正
画像変換グレースケール・HSV・L*a*b|色空間の変換
画像変換モノクロ(白黒)画像変換|2値化処理
画像変換ヒストグラムの描画・ヒストグラム均一化処理
画像変換画像上にテキスト・図形(直線・長方形・円)を描画
画像変換画像の透視変換・遠近法
画像変換画像のノイズ除去・平滑化
画像変換画像の畳み込み(空間フィルタリング)
特徴抽出エッジの検出方法

画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次