KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるsobelとは?利用法からSobelフィルタの理論等を解説

OpenCVで使われるsobelとは?利用法からSobelフィルタの理論等を解説

今回はOpenCVで使われるsobelに関して、利用法からSobelフィルタの理論などを徹底解説致します。Sobelフィルタに関して詳しく知りたい、エッジ検出を試してみたい方はおすすめです。ぜひ最後までご覧ください。

目次
  1. OpenCVで使われるsobelとは?
  2. Sobelフィルタの理論を徹底解説
  3. OpenCVで使われるsobel関数の定義
  4. まとめ
  5. 参考文献

執筆者 - おすすめの記事3選

OpenCVで使われるsobelとは?

OpenCVで使われるsobelとは、Sobelフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数です。

輝度勾配(エッジ) : 隣りあう画素に関して、画素と画素の色の差分((例) 明るい画素(色)の隣に、暗い画素(色))が大きい箇所(エッジ)を意味する。

【画素に関する説明を行う画像】

1枚の画像は、複数の画素の集まりで成り立っています。

具体的なイメージとしては、以下の「sobel関数のイメージ画像」の白色で描画される箇所を、検出するイメージを持ってもらうと良いでしょう。

【元画像】

【sobel関数のイメージ画像】

Sobelフィルタの理論を徹底解説

早急にsobel関数の定義から利用法を知りたい方は、次章で紹介する「OpenCVで使われるsobel関数の定義」からご確認ください。

先ほどはOpenCVで使われるsobelとは、Sobelフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数であると説明しました。

「Sobelフィルタの理論を徹底解説」では、sobel関数が動く原理となる、Sobelフィルタに関して解説いたします。

Sobelフィルタは、画像を構成する画素に注目して、輝度勾配(エッジ)の検出を行います。以下の手順を繰り返し行います。

  1. 縦方向Sobelフィルタ用のカーネルを用意する。(以下の「縦方向Sobelフィルタ用のカーネル画像」とする。カーネルの大きさはsobel関数の第五引数で設定する。)
  2. 横方向Sobelフィルタ用のカーネルを用意する。(以下の「横方向Sobelフィルタ用のカーネル画像」とする。カーネルの大きさはsobel関数の第五引数で設定する。)
  3. 1つの画素に注目する。(以下の「横方向Sobelフィルタ用のカーネルを利用する画像」の赤色箇所とする。)
  4. 縦方向Sobelフィルタ用のカーネルを利用して、画素の値を変換する。(画素の値を変換する仕組みは、以下の「縦方向Sobelフィルタ用のカーネルを利用する画像」を参照。sobel関数の第四引数の回数分だけ実行する。)
  5. 横方向Sobelフィルタ用のカーネルを利用して、画素の値を変換する。(画素の値を変換する仕組みは、以下の「横方向Sobelフィルタ用のカーネルを利用する画像」を参照。sobel関数の第三引数の回数分だけ実行する。)
  6. 3~5を繰り返す。

縦方向Sobelフィルタ用のカーネル画像

横方向Sobelフィルタ用のカーネル画像

縦方向Sobelフィルタ用のカーネルを利用する画像

横方向Sobelフィルタ用のカーネルを利用する画像

OpenCVで使われるsobel関数の定義

sobel関数は

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# sobel関数 : Sobelフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。
5# 第一引数 : 多次元配列(画像情報)
6
7#############################
8# 第二引数 : 出力画像のビット深度を指定。
9# ビット深度 : 画素あたりに割り当てるデータ量を意味する。「1枚の画像を何枚重ね合わせて出力画像とするのか」と考えるとよい。
10# ビット深度とは? : https://aviutl.info/color-depth/
11# ※ 以下の手順で指定する値をご確認ください。
12# 1. print(第一引数.dtype)を実行する。(例 : print(img.dtype))
13# 2. 以下リンクの「Sobelの組み合わせ」箇所を確認して、1で確認した値で利用できる、内容(cv2.CV_8U or cv2.CV_8S or cv2.CV_16U or cv2.CV_16S or cv2.CV_32S or cv2.CV_32F or cv2.CV_64F)のどれかを選択する。
14# https://qiita.com/nonbiri15/items/e8996bd157a6155a0db1
15#############################
16
17# 第三引数 : 横方向Sobelフィルタを利用する回数。0以上~第五引数 - 1以下を指定する。
18# 第四引数 : 縦方向Sobelフィルタを利用する回数。0以上~第五引数 - 1以下を指定する。
19
20# 第五引数 : カーネルサイズ。1以上~31以下の奇数を指定。
21# カーネルサイズへ1を指定する場合、1 x 3のカーネル(横方向Sobelフィルタ用) or 3 x 1(縦方向Sobelフィルタ用)のカーネルを生成する。
22# カーネルサイズへN(3以上~31以下の奇数)を指定する場合、N x Nのカーネルを生成する。
23# カーネルサイズが5 x 5, 7 x 7の場合の情報 : https://stackoverflow.com/questions/9567882/sobel-filter-kernel-of-large-size
24
25# 戻り値 #################
26# img : 多次元配列(画像情報)
27#######################
28img = cv2.Sobel(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.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# cvtColor : 画像の色空間(色)の変更を行う関数。
15# cvtColorについて : https://kuroro.blog/python/7IFCPLA4DzV8nUTchKsb/
16# 第一引数 : 多次元配列(numpy.ndarray)
17# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
18# cv2.COLOR_BGR2GRAY : BGR(Blue, Green, Red)形式の色空間(色)を持つ画像をグレースケール画像へ変更する。
19# グレースケールとは? : https://www.shinkohsha.co.jp/blog/monochrome-shirokuro-grayscale/
20# 戻り値 : 多次元配列(numpy.ndarray)
21img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
22
23# sobel関数 : Sobelフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。
24# 第一引数 : 多次元配列(numpy.ndarray)
25# 第二引数 : 出力画像のビット深度を指定。
26# 第三引数 : 横方向Sobelフィルタを利用する回数。1回とする。
27# 第四引数 : 縦方向Sobelフィルタを利用する回数。0回とする。
28# 第五引数 : カーネルサイズ。3 x 3のカーネルを生成する。
29# 戻り値 多次元配列(numpy.ndarray)
30img = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
31
32# imwrite : 画像の保存を行う関数
33# 第一引数 : 保存先の画像ファイル名
34# 第二引数 : 多次元配列(numpy.ndarray)
35# <第二引数の例>
36# [
37# [
38# [234 237 228]
39# ...
40# [202 209 194]
41# ]
42# [
43# [10 27 16]
44# ...
45# [36 67 46]
46# ]
47# [
48# [34 51 40]
49# ...
50# [50 81 60]
51# ]
52# ]
53# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
54cv2.imwrite('output.jpg', img)

以下の画像のように、画像が描画されます。

元画像

Sobel関数を利用して保存される画像

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

cvtColorに関しては、OpenCVで使われるcvtcolorとは?cvtcolorの活用例を徹底紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

まとめ

  • OpenCVで使われるsobelとは、Sobelフィルタを用いて、画像の輝度勾配(エッジ)を検出するために利用する関数。

参考文献

記事に関するお問い合わせ