エッジ検出のためのCannyアルゴリズムを実行します.
パラメタ: |
---|
この関数は,Cannyアルゴリズムを用いて入力画像 image 中のエッジを検出し,出力画像 edges 上に記録します. threshold1 と threshold2 の内,小さい方の値はエッジ同士の接続に利用され,大きい方の値は強いエッジの初期検出に利用されます.
コーナー検出のための,画像の固有値と固有ベクトルを求めます.
パラメタ: |
---|
この関数では,まず各ピクセルに対して block_size block_size の近傍領域 S(p) を考えます.そして,以下のように各近傍領域全体に対して導関数の共変動行列を求めます:
この行列の固有ベクトルと固有値を求めて,出力画像に の形式で保存します.ここで,
は, の固有値(ソートされていません),
は, に対応する固有ベクトル,
は, に対応する固有ベクトル
です.
Harrisエッジ検出器.
パラメタ: |
---|
この関数は,入力画像に対してHarrisエッジ検出を行います. CornerMinEigenVal や CornerEigenValsAndVecs と同様に,各ピクセルの サイズの近傍領域全体に対して の勾配共変動行列 が求められます.
そして,
が出力画像に格納されます.入力画像中のコーナーは,出力画像における極大点として検出できます.
コーナー検出のための,勾配行列の最小固有値を求めます.
パラメタ: |
---|
この関数は,関数 CornerEigenValsAndVecs と似ていますが,これは各ピクセルに対して導関数の共変動行列の最小固有値のみを求めます.つまりそれは,前述の関数の に相当します.
タプル ((x, y), laplacian, size, dir, hessian) で表現される SURF キーポイント
- x¶
- 画像内の特徴点のx座標
- y¶
- 画像内の特徴点のy座標
- laplacian¶
- -1,0 または +1.その点におけるラプラシアンの符号.ラプラシアンの符号が異なる特徴同士はマッチしないので,特徴点の比較に利用できます
- size¶
- 特徴のサイズ
- dir¶
- 特徴の方向:0...360 度
- hessian¶
- ヘッシアンの値(特徴の強さの大まかな推定に利用できます.params.hessianThresholdを参照してください)
画像からSURF(Speeded Up Robust Features)を抽出します.
パラメタ: |
---|
%–
パラメタ: |
|
---|
この関数は,画像からロバストな特徴を検出します.詳細は, Boy06 で述べられています.各特徴に対して,位置,サイズ,方向,そして基本あるいは拡張ディスクリプタ(オプション),が返されます.この関数は,物体追跡や位置決定,画像張り合わせなどに利用できます.
画像から強い SURF 特徴を抽出するには,次のようにします.
>>> import cv
>>> im = cv.LoadImageM("building.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
>>> (keypoints, descriptors) = cv.ExtractSURF(im, None, cv.CreateMemStorage(), (0, 30000, 3, 1))
>>> print len(keypoints), len(descriptors)
6 6
>>> for ((x, y), laplacian, size, dir, hessian) in keypoints:
... print "x=%d y=%d laplacian=%d size=%d dir=%f hessian=%f" % (x, y, laplacian, size, dir, hessian)
x=30 y=27 laplacian=-1 size=31 dir=69.778503 hessian=36979.789062
x=296 y=197 laplacian=1 size=33 dir=111.081039 hessian=31514.349609
x=296 y=266 laplacian=1 size=32 dir=107.092300 hessian=31477.908203
x=254 y=284 laplacian=1 size=31 dir=279.137360 hessian=34169.800781
x=498 y=525 laplacian=-1 size=33 dir=278.006592 hessian=31002.759766
x=777 y=281 laplacian=1 size=70 dir=167.940964 hessian=35538.363281
コーナー位置を高精度化します.
パラメタ: |
|
---|
この関数は,以下の図に示されるような,サブピクセル精度のコーナー,あるいは鞍点を検出するために繰り返し処理を行います.
高精度化された座標が (x, y) ペアのリストとして返されます.
サブピクセル精度のコーナー位置決めは,近傍領域の中心 から,その領域内に位置する点 に向かう各ベクトルが, における(画像自身と観測ノイズに従う)画像勾配と直交する,という考えに基づいています.これは,以下の式で表現されます:
ここで は,近傍領域 内の点 における画像勾配を表します. は,この を最小にする値として求められます. を 0 とすることで連立方程式が得られます:
ここで,画像勾配は の近傍領域(「探索窓」)での総和をとられます.1次勾配を ,2次勾配を とすると,以下の関係が得られます:
このアルゴリズムは,探索窓の中心をこの新しい値 に再設定し,値の変化量が与えられた閾値内に収まるようになるまで繰り返し計算を行います.
StarDetectorアルゴリズムを用いて,キーポイントを検出します.
パラメタ: |
|
---|
この関数は,キーポイント,つまり局所的スケール空間における極大値を検出します.このスケール空間は,各ピクセルに対して異なるシグマでのラプラシアン近似値を計算することで得られます.計算時間を節約する一般的な手法として画像ピラミッドがありますが,それを利用する代わりに,オリジナル高解像度画像の各ピクセルにおける全ラプラシアンを計算します.しかし,インテグラルイメージを利用することで,各ラプラシアンの近似値の計算量はシグマに関わらずO(1)となります.このアルゴリズムは,[Agrawal08] に基づいています.ただし,関数名からも分かるように,四角形,六角形,八角形の代わりに,まっすぐな正方形と45度傾いた正方形が重なり合った形状である八角星を利用しています.
それぞれのキーポイントは,タプル ((x, y), size, response) で表現されます:
- x, y キーポイントのスクリーン座標
- size 特徴のサイズ. maxSize 以下
- response キーポイントの近似ラプラシアン値
画像内の強いコーナーを検出します.
パラメタ: |
|
---|
この関数は,与えられた画像から大きな固有値を持つコーナーを検出します.これはまず,関数 CornerMinEigenVal を利用して入力画像の各ピクセルに対する最小固有値を計算し,それを eigImage に格納します.そして,non-maxima suppression を行います( の近傍領域内において,その極大値のみが残ります).次に, よりも小さな固有値を持つコーナーを棄却します.最後に,あらゆる2つのコーナー同士の距離が minDistance よりも小さくならないようにします.これによって,強い方のコーナーに近すぎる,弱い方のコーナー(最小固有値が小さいコーナー)が削除されます.
この関数が,パラメータ qualityLevel に異なる値 A と B を与えられて呼び出され,その時に A > {B} であるとします.その場合,出力コーナー配列において qualityLevel=A で求められたコーナーの配列が, qualityLevel=B で求められたものよりも前に位置することに注意してください.
ハフ変換を用いて,2値画像から直線を検出します.
パラメタ: |
|
---|
この関数は,線を検出するハフ変換のいくつかのバリエーションの実装です.
コーナー検出のための特徴マップを求めます.
パラメタ: |
---|
この関数は,以下の関数を計算します.
ここで, は1次微分画像, は2次微分画像を表します.
コーナーは,以下のように関数の極大点として計算できます:
import cv
def precornerdetect(image):
# assume that the image is floating-point
corners = cv.CloneMat(image)
cv.PreCornerDetect(image, corners, 3)
dilated_corners = cv.CloneMat(image)
cv.Dilate(corners, dilated_corners, None, 1)
corner_mask = cv.CreateMat(image.rows, image.cols, cv.CV_8UC1)
cv.Sub(corners, dilated_corners, corners)
cv.CmpS(corners, 0, corner_mask, cv.CV_CMP_GE)
return (corners, corner_mask)