はじめに
opencvを用いて画像の特徴量の検出について。今回はコーナー(曲線など)の検出をしていく。
2パターンの検出方法を行う。
基礎的なことについては、以下のページ参照
Pythonによる二値化画像処理の基本⇒https://qiita.com/jin237/items/04ca3d0b56e10065c4e4
やってみよう
opencvを用いるが、コーナー検出には2つの方法がある。
"cv2.cornerHarris"によるコーナー検出
エッジがあらゆる方向に高い輝度変化を持つ領域として想定。
# サンプル画像からコーナーの検出
import matplotlib.pyplot as plt
%matplotlib inline
import cv2
# 画像読み込みと二値化
img = cv2.imread("sample.png",0)
# コーナーの検出
corners = cv2.cornerHarris(img, 3,1,0.04)
plt.imshow(corners, cmap='gray')
plt.savefig('gray_pltsample')
img = cv2.imread("sample.png", 0)
によって、画像の読み込みと同時に"0"が二値化画像としての読み込みを可能とする。
本来であれば、"cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)"のように書くこともできるが今回は処理を見やすくするために、この方法を使った。
matplotlibによって、表示と保存を行っている。
また、
corners = cv2.cornerHarris(img, 3,1,0.04)
については、
3 = 近傍画素範囲(blocksize)
1 = カーネルサイズ(ksize)
0.04 = Harris検出器フリーパラメータ(k)
blockSize - コーナー検出の際に考慮する隣接領域のサイズ.
ksize - Sobelの勾配オペレータのカーネルサイズ.
k - 式中のフリーパラメータ.
理論については、Harrisコーナー検出を参照。
"cv2.goodFeaturesToTrack"によるコーナー検出
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('sample.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,100000000,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()
特徴点に対して、点を打つことができる。今回は多めに設定してみたが、あまり結果に対する変化はない。この赤点を工夫してみれば、もう少しわかりやすくなったりするかもしれない。
さいごに
コーナーの検出を行った。簡単にできることなのでぜひ理論も含めて、理解してみるといい。上記の紹介したもの以外にもあるので、ほかの記事で書いてみようと思う。