今回はOpenCVを用いたエッジ検出法としてCanny法にについて紹介する。
1. Canny法
Canny法はエッジ、輪郭検出をするときに使われる。
処理の流れとしては、平滑フィルタ(ガウシアン)、輝度勾配・方位、非極大抑制、ヒステリシスしきい値という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法を適用した画像になるが、はっきりと輪郭が抽出できていることがわかる。
次にしきい値を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')
大きな影響はないが、しきい値を小さくしたことで中心の解像パターンの薄い文字の輪郭が抽出できている。
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法を適用することにより、線画のような画像が得られた。
次にしきい値を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')
しきい値を低い値に設定したことにより、抽出される輪郭が多くより細かい線画のようになっている。
4. まとめ
今回は輪郭・エッジ検出としてCanny法の適用方法や処理結果について紹介した。