OpenCVを使ったエッジ検出

Table of Contents
1 エッジ検出とは
画像処理の一種で、 画像内の画素値の変化が大きい箇所(エッジ)を検出する処理です。
エッジ検出を行うことで物体の輪郭を抽出することが来ます。
エッジは画素値に対する微分で判断します。
ただし、画素値は離散的であるため通常の連続関数に対する微分ではなく、 隣接画素の差分をとることで近似します。
このような計算にはフィルタを用いた畳み込み演算が使われます。
フィルタや畳み込み演算については、ここ や ここ が参考になります。
興味のある方は参照してみてください。
フィルタの一例として以下に示すSobelフィルタがあります。

Figure 1: 水平方向のフィルタ

Figure 2: 垂直方向のフィルタ
水平方向のフィルタを画像に適用すると、画素値が横方向に平坦な部分がマスクされるため縦方向のエッジが検出できます。
同様に垂直方向のフィルタを適用することで横方向のエッジが検出できます。
2 OpenCVを使った例
OpenCVではエッジ検出のためのいくつかのフィルタが提供されています。
以下では、上で示したSobelフィルタを使った例を示します。
import cv2 import numpy as np img = cv2.imread('eagle.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dx = cv2.Sobel(img_gray, cv2.CV_64F, 1, 0, ksize=3) dy = cv2.Sobel(img_gray, cv2.CV_64F, 0, 1, ksize=3) grad = np.sqrt(dx ** 2 + dy ** 2) cv2.imwrite('./gray.jpg', img_gray) cv2.imwrite('./dx.jpg', dx) cv2.imwrite('./dy.jpg', dy) cv2.imwrite('./grad.jpg', grad)
フィルタを適用した画像は以下のようになります。
Figure 4, Figure 5では、それぞれ縦方向、横方向のエッジが確認できます。

Figure 3: 元画像(グレースケール)

Figure 4: 水平方向のフィルタ適用

Figure 5: 垂直方向のフィルタ適用

Figure 6: 水平垂直両方のフィルタを適用
◆WEB会議/セミナーシステム『Szia』
https://www.ois-yokohama.co.jp/szia/
◆サーバサイドで動作するミドルウェア『ReDois』
https://www.ois-yokohama.co.jp/redois/wp_redois/