つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方19 ~ Canny法

 今回はOpenCVを用いたエッジ検出法としてCanny法にについて紹介する。

1. Canny法

Canny法はエッジ、輪郭検出をするときに使われる。

labs.eecs.tottori-u.ac.jp

処理の流れとしては、平滑フィルタ(ガウシアン)、輝度勾配・方位、非極大抑制、ヒステリシスしきい値という4つの処理によって得られる。

前回と同様に以下の解像チャートでCanny法を適用する。

import cv2
import numpy as np
from matplotlib import pyplot as plt
from google.colab import files
uploaded_file = files.upload()
orig = cv2.imread(uploaded_file_name)
src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
plt.imshow(orig, cmap='gray',vmax=255,vmin=0)
plt.title('Original')

"解像チャート"
解像チャート

2. Canny法によるエッジ検出

Canny法を適用するにはcv2.Canny(img,minval,maxval)を用いる。imgは適用する画像、minvalおよびmaxvalはヒステリシスしきい値処理のための引数になっている。とりあえずminval=100,maxval=200として解像チャート画像origにCanny法を適用する

edges = cv2.Canny(orig,100,200)
plt.figure(figsize=(8,16))
plt.subplot(1,2,1)
plt.imshow(orig,cmap='gray')
plt.title('Original')
plt.subplot(1,2,2)
plt.imshow(edges,cmap='gray')
plt.title('Canny edge')

左側は元の解像チャートの画像で右側はCanny法を適用した画像になるが、はっきりと輪郭が抽出できていることがわかる。

"Canny法を解像チャートに適用"
Canny法を解像チャートに適用

次にしきい値をminval=50, maxval=80に変更する。

edges2 = cv2.Canny(orig,50,80)
plt.figure(figsize=(8,16))
plt.subplot(1,2,1)
plt.imshow(orig,cmap='gray')
plt.title('Original')
plt.subplot(1,2,2)
plt.imshow(edges2,cmap='gray')
plt.title('Canny edge')

大きな影響はないが、しきい値を小さくしたことで中心の解像パターンの薄い文字の輪郭が抽出できている。

"Canny法のしきい値変更"
Canny法のしきい値変更

3. カラー画像へCanny法を適用

 解像チャートはモノクロ画像だったが、カラー画像に対しても同じように適用できる。一番上のコードを再度実行し、RGBに変換したsrc = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)を元画像として表示する。 Canny法はBGRまたはRGBのどちらの画像に適用しても良いが、今回はBGRのまま(orig)適用する。

edges = cv2.Canny(orig,100,200)
plt.figure(figsize=(8,16))
plt.subplot(1,2,1)
plt.imshow(src,cmap='gray')
plt.title('Original')
plt.subplot(1,2,2)
plt.imshow(edges,cmap='gray')
plt.title('Canny edge')

Canny法を適用することにより、線画のような画像が得られた。

"Canny法をカラー画像に適用"
Canny法をカラー画像に適用

次にしきい値をminval=50, maxval=80に変更する。

edges = cv2.Canny(orig,50,80)
plt.figure(figsize=(8,16))
plt.subplot(1,2,1)
plt.imshow(src,cmap='gray')
plt.title('Original')
plt.subplot(1,2,2)
plt.imshow(edges,cmap='gray')
plt.title('Canny edge')

しきい値を低い値に設定したことにより、抽出される輪郭が多くより細かい線画のようになっている。

"Canny法のしきい値変更"
Canny法のしきい値変更

4. まとめ

 今回は輪郭・エッジ検出としてCanny法の適用方法や処理結果について紹介した。