【Python】画像の畳み込み処理・空間フィルタリング|OpenCVによる画像処理

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

こんな方におすすめ
  • Pythonによる画像処理に興味がある。
  • OpenCVをもとに画像の畳み込み処理(空間フィルタリング)を行う方法が知りたい。
目次

OpenCVとは

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

【OpenCV】画像の畳み込み処理とは

畳み込み(Convolution)とは、入力画像のそれぞれの画素に対して、着目した画素及びその周辺の画素の画素値の重み付き総和を算出し、出力画像の画素値を求める処理を指します。別名、空間フィルタリングとも呼ばれています。

フィルタリング時に用いる重みはカーネルまたはフィルタと呼びます。

入力画像の画素を INPUT(x, y)と置き、 N×Nサイズのカーネル値を f(i, k)と置くとき、出力画像の画素Output(x, y)は以下のように表せれます。

【Python×OpenCV】画像の畳み込み

PythonのOpenCVライブラリを用いて畳み込み処理を実践する方法について解説していきます。

【OpenCV】cv2.filter2D

OpenCVのもとに畳み込みを実践する場合、cv2.filter2D()というメソッドを活用します。

以下、活用する上でのひな型コードおよび引数説明です。

cv2.filter2Dのひな型コード

conv_img  = cv2.filter2D(src,     # 入力画像
                         ddepth,  # 出力画像の型(デフォルト「-1」で入力画像と同じ型を出力)
                         kernel   # カーネル
                         )

引数情報

引数名概要
src入力画像
ddepth出力画像の型
デフォルト「-1」で入力画像と同じ型を出力
kernelカーネル(フィルター)

【実践】OpenCVによる画像の畳み込み

Pythonコードを実行し、畳み込みの流れを理解してみましょう。以下、異なるフィルタを用いた出力結果イメージおよびコードを示します。

値が1/16の4×4サイズのカーネルを活用する場合

入力画像部分に畳み込み処理を行いたい画像のディレクトリを指定し、以下を実行してみましょう。

import cv2
import numpy as np

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

# 4x4配列で値が1/16の畳込フィルタ要素を用意
kernel = np.ones((5,5)) /16

# フィルタを確認
print(kernel)

# 畳み込み操作
conv_img = cv2.filter2D(img,      # 入力画像 
                         -1,      # 出力画像の型(デフォルト「-1」で入力画像と同じ型を出力)
                         kernel   # カーネル
                        )

# 画像の比較
cv2.imshow("img",img)
cv2.imshow("conv_img",conv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

任意の値を指定した3×3のカーネルを活用する場合

前述の例と異なるのが、カーネルサイズおよび、カーネルの値を更新している点です。こちらを、細かく値を設定したい場合に有効なコードと言えます。

import cv2
import numpy as np

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

# 3x3配列の畳込フィルタ要素を用意
kernel = np.zeros((3,3))

# フィルタの値を更新
kernel[1,0] = 2
kernel[0,1] = 2
kernel[0,0] = 2
kernel[2,0] = -1
kernel[0,2] = -1

# フィルタを確認
print(kernel)

# 畳み込み
conv_img = cv2.filter2D(img,      # 入力画像 
                         -1,      # 出力画像の型(デフォルト「-1」で入力画像と同じ型を出力)
                         kernel   # カーネル
                        )

# 画像の比較
cv2.imshow("img",img)
cv2.imshow("conv_img",conv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

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

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

最後に

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

本記事をシェア!
目次