OpenCVで使われるLaplacianとは?利用法からフィルタの理論等を解説
今回はOpenCVで使われるLaplacianに関して、利用法からLaplacianフィルタの理論などを徹底解説致します。Laplacianフィルタに関して詳しく知りたい、エッジ検出を試してみたい方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるLaplacianとは?
OpenCVで使われるLaplacianとは、Laplacianフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数です。
輝度勾配(エッジ) : 隣りあう画素に関して、画素と画素の色の差分((例) 明るい画素(色)の隣に、暗い画素(色))が大きい箇所(エッジ)を意味する。
【画素に関する説明を行う画像】
1枚の画像は、複数の画素の集まりで成り立っています。
具体的なイメージとしては、以下の「Laplacian関数のイメージ画像」の白色で描画される箇所を、検出するイメージを持ってもらうと良いでしょう。
【サンプル画像】
【Laplacian関数のイメージ画像】
Laplacianフィルタの理論を徹底解説
早急にLaplacian関数の定義から利用法を知りたい方は、次章で紹介する「OpenCVで使われるLaplacian関数の定義」からご確認ください。
先ほどはOpenCVで使われるLaplacianとは、Laplacianフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数であると説明しました。
「Laplacianフィルタの理論を徹底解説」では、Laplacian関数が動く原理となる、Laplacianフィルタに関して解説いたします。
Laplacianフィルタは、画像を構成する画素に注目して、輝度勾配(エッジ)の検出を行います。以下の手順を繰り返し行います。
- Laplacianフィルタ用のカーネルを用意する。(以下の「Laplacianフィルタ用のカーネル画像」とする。カーネルの大きさはLaplacian関数の第三引数で設定する。)
- 1つの画素に注目する。(以下の「Laplacianフィルタ用のカーネルを利用する画像」の赤色箇所とする。)
- Laplacianフィルタ用のカーネルを利用して、画素の値を変換する。(画素の値を変換する仕組みは、以下の「Laplacianフィルタ用のカーネルを利用する画像」を参照。)
- 2~3を繰り返す。
Laplacianフィルタ用のカーネル画像
Laplacianフィルタ用のカーネルを利用する画像
OpenCVで使われるLaplacian関数の定義
Laplacian関数は
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# Laplacian関数 : Laplacianフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。
5# Laplacian関数 - 公式ドキュメント : https://docs.opencv.org/3.4/d5/db5/tutorial_laplace_operator.html
6
7# 第一引数(必須) : 多次元配列(画像情報)
8
9##################################
10# 第二引数(必須) : 出力画像の型を指定する。以下の中からどれかを選択する。
11# 負の整数 : 入力画像と同じ型。
12# cv2.CV_16U : 符号なし16ビット(0~65536の画素値で画像を表現する。)
13# cv2.CV_16S : 符号あり16ビット(-32,768~32,767の画素値で画像を表現する。)
14# cv2.CV_32F : 32ビット浮動小数点数
15# cv2.CV_64F : 64ビット浮動小数点数
16
17# ※ 入力画像の型に合わせて、第二引数を選択ください。以下対応表になります。
18# 入力画像の型がcv2.CV_8Uの場合、-1 or cv2.CV_16S or cv2.CV_32F or cv2.CV_64Fを選択する。
19# 入力画像の型がcv2.CV_16U, cv2.CV_16Sの場合、-1 or cv2.CV_32F or cv2.CV_64Fを選択する。
20# 入力画像の型がcv2.CV_32Fの場合、-1 or cv2.CV_32F or cv2.CV_64Fを選択する。
21# 入力画像の型がcv2.CV_64Fの場合、-1 or cv2.CV_64Fを選択する。
22# 入力画像の型を調べる場合、print(img.dtype)でご確認ください。(参考 : https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#filter_depths)
23# ※ 出力画像の型で指定される、画素値の範囲を超えた画素は、フィルタを通して変換されずに無視されます。
24##################################
25
26# 第三引数(任意) : カーネルサイズ。1以上~31以下の奇数を指定。デフォルトで3が指定される。
27# カーネルサイズへ1を指定する場合、3 x 3のカーネルが生成する。(参考 : https://docs.opencv.org/3.0-last-rst/modules/imgproc/doc/filtering.html?highlight=laplacian#laplacian)
28# カーネルサイズへN(3以上~31以下の奇数)を指定する場合、N x Nのカーネルが生成する。
29# カーネルサイズが5 x 5, 9 x 9の場合の情報 : https://www.clg.niigata-u.ac.jp/~medimg/practice_medical_imaging/imgproc_scion/4filter/index.htm
30
31# 戻り値 #################
32# img : 多次元配列(画像情報)
33#######################
34
35img = cv2.Laplacian(img, 定数, 数字)
で定義されます。
例えば以下のようなコードを作成すると、
1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread("xxx.jpg")
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12 sys.exit("Could not read the image.")
13
14# Laplacian関数 : Laplacianフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。
15
16# 第一引数(必須) : 多次元配列(numpy.ndarray)
17# 第二引数(必須) : 出力画像の型。cv2.CV_32F : 32ビット浮動小数点数。
18# 第三引数(任意) : カーネルサイズ。
19
20# 戻り値 : 多次元配列(numpy.ndarray)
21img = cv2.Laplacian(img, cv2.CV_32F, ksize=3)
22
23# imwrite : 画像の保存を行う関数
24# 第一引数 : 保存先の画像ファイル名
25# 第二引数 : 多次元配列(numpy.ndarray)
26# <第二引数の例>
27# [
28# [
29# [234 237 228]
30# ...
31# [202 209 194]
32# ]
33# [
34# [10 27 16]
35# ...
36# [36 67 46]
37# ]
38# [
39# [34 51 40]
40# ...
41# [50 81 60]
42# ]
43# ]
44# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
45cv2.imwrite("./output.png", img)
以下の画像のように、画像が描画されます。
サンプル画像
Laplacian関数を利用して保存される画像
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
まとめ
- OpenCVで使われるLaplacianとは、Laplacianフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。