ターゲット検出のOpenCVのキャニーアルゴリズム

気の利きました

3つのキャニー目標があります。

  • 低エラーレート検出されたエッジは、真エッジであります
  • 実際のエッジ上の良好な位置決めとピクセル距離のエッジ上の画素は最小であるべきです
  • 最小応答のみエッジを識別することができ、ノイズがエッジとしてラベル付けされるべきではありません

気の利いたいくつかのステップ

  • など濾過ガウス雑音
  • 勾配はSobelオペレータによって計算されるような勾配を算出します
  • 非極大抑制
    前のステップでは、粗いエッジを計算することができる、エッジは、ユーザーが、比較的太い線を得るように非常に細い線は、次いで上記の処理結果は、いわゆる非極大抑制がであり、理解することができることが想定されます従って、より微細なエッジを得る、局所画素点における最も劇的な転換点を見つけるために。
  • デュアル閾値検出及びエッジコネクタ

私たちの前に2つの段階では非常に精通し、不慣れ参照する必要がありますhttps://www.cnblogs.com/sdu20112013/p/11608469.htmlhttps://www.cnblogs.com/sdu20112013/p/11600436.html

非最大抑制

この段階勾配を解決するには、我々は勾配のカビの成長と方向性を得ることができます

このステップは広く、我々は、画像のエッジに反映されるNMS(非最大抑制)得られたエッジは非常に粗いことができる処理Sobelオペレータの後に私たちの次の画像のための基礎を築いたが、行われる非NMSを採用しますあなたは、非エッジ画素の多くを除外することができるように階調点の最大値は、ゼロに設定されます

以下に示すように、点Cは、非最大抑制の電流値を示し、それは8の近傍に通信ポイントをG1-4、青いライン上の点Cで得られた画像の図。計算値のステップ角は、すなわち、勾配方向を示します最初のステップは、8近傍の最大階調値Cの値は、その後、点Cは、グレー値dTmp2点が決定されるdTmp1よりも大きいように値が、dTmp2 Cよりも大きいか否かを、図交点dTmp1における勾配方向の場合をチェックし続けるか否かを判断します点Cが最大の点である、1に設定されているので、最終的な画像は、二値画像の下に生成されるべきで、理想的な状態のエッジは単一ピクセルのエッジである。

注意すべきこのステップの一つは、そのdTmp1、dTmp2、ある2画素が存在しない場合、双線形補間により計算される。キャニーは4 0,90,45,135わずか勾配方向にサブ紙、非最大抑制のジョン・キャニーオペレータに提案されています四方の代わりに同様のレベルで勾配方向との画素毎の実際の検出処理、より正確にエッジに属する画素をフィルタリングするために、バイリニア補間dTmp1、dTmp2を与えない。行きNMSピクセルを判断するために、前述のプロセスを実行します 。エッジのいかなる部分
2を推奨は良く話すん:https://blog.csdn.net/kezunhai/article/details/11620357 https://www.cnblogs.com/techyan1990/p/7291771.html

上の画素の勾配方向を取得する方法を、図に示すように、。

この場合、より繊細であることが「厚いエッジ」フィルタに達しました。

このステップの後、得られたエッジはまた、ノイズおよび他の理由に起因する偽のエッジを多く含みます。

デュアル閾値検出及びエッジコネクタ

後でNMSの後、実際のエッジに非常に近い。しかし、ノイズに起因するいくつかまたは偽エッジのいくつかの他の原因があります。のは、さらに二つの閾値を介して濾過してみましょう。

ヒステリシス:最後のステップ。キャニーは(上下)は、2つの閾値を使用し: -画素勾配が上限閾値より高い場合、画素勾配値.IFエッジが下限閾値を下回るように、画素が受け入れられ、それはピクセルrejected.Ifあります勾配は、次に、上限閾値を超えている画素に接続されている場合にのみ受け入れられる、二つの閾値の間です。
1と3:2との間に低い比:キャニーは、上部推奨1。

  • 勾配の高い点が閾値よりも大きいため、これは真のエッジ画素です。
  • 勾配の低い点が閾値未満であるため、それは、これらの点を除去し、ノイズによる誤ったエッジ画素です。
  • 上側および下側閾値との間の点との間の勾配のために、その周囲の近傍画素「が真のエッジ点」(高閾値の点よりも大きい勾配すなわち)、それは本でもあると考えられる「真のエッジ点」である場合に
    推奨レベル1:2の比閾値:1-3

実用的なエンジニアリングでは、調整するために、独自の画像データにこれら2つのパラメータのために、低すぎるがあまりにも多くの偽エッジを引き起こす可能性があり、エッジはあなたにも除外されて保存しておきたい引き起こす可能性が高すぎる。
キャニーAPI

3,4パラメータは、平方根方法の勾配の計算された大きさかどうかを示す、偽の低閾値および高閾値、L2gradientデフォルト値を示しています。

OpenCVの例

from __future__ import print_function
import cv2 as cv
import argparse
max_lowThreshold = 100
window_name = 'Edge Map'
title_trackbar = 'Min Threshold:'
ratio = 3
kernel_size = 3
def CannyThreshold(val):
    low_threshold = val
    #img_blur = cv.blur(src_gray, (3,3))
    detected_edges = cv.Canny(src_gray, low_threshold, low_threshold*ratio, kernel_size)
    mask = detected_edges != 0
    dst = src * (mask[:,:,None].astype(src.dtype))
    cv.imshow(window_name, dst)

src = cv.imread("/home/sc/disk/keepgoing/opencv_test/sidetest.jpeg")
src = cv.GaussianBlur(src, (3, 3), 0)
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.namedWindow(window_name)
cv.createTrackbar(title_trackbar, window_name , 0, max_lowThreshold, CannyThreshold)
CannyThreshold(0)
cv.waitKey()

ときよりライン、もちろん、「偽のエッジ」より、「偽のエッジ」は減少し、高しきい値異なるによって引き起こさ注意しきい値効果は、あなたは非常に低いしきい値を見ることができるだけでなく、より詳細を失いました私たちは、彼らの実際の画像データに基づいてパラメータを調整する必要があります。

おすすめ

転載: www.cnblogs.com/sdu20112013/p/11614059.html