[OpenCV] Edge Detection


Edge Detection


エッジの特徴は画素強度の急激な変化である.エッジを検出するには、隣接するピクセルでこれらの変化を見つけるだけです.OpenCVは、エッジ検出アルゴリズムSobel Edge DetectionおよびCanny Edge Detectionを使用する.
  • imread()を用いて画像読取エネルギーを検出する際に色情報を必要としないため、階調画像として読み取る
  • GaussianBlur()を用いて画像をぼかし処理すると、エッジ付近の強度変化を平滑化することができ、画像中の突出エッジ構造をより容易に識別することができる.
  • コード#コード#

    import cv2
    
    # 이미지 읽기
    img = cv2.imread('test.jpg', flags=0)  
    # 더 나은 에지 감지를 위해 이미지 흐리게 하기
    img_blur = cv2.GaussianBlur(img, (3, 3), sigmaX=0, sigmaY=0) 

    Sobel Edge Detection


    これはエッジ検出に最も広く用いられるアルゴリズムの一つである.Sobel Operatorは、画素強度の急激な変化で表されるエネルギーを検出し、下図に示す.

    主導関数を使用すると、エッジがより簡単に見えます(ここでは最大値として表示されます).

    上図は、傾斜が特定のしきい値より高い領域でエッジを検出できることを示している.また,導関数が突然変化すると画素強度も変化する.これに鑑みて×3カーネル近似を用いて導関数を計算することができる.1つのカーネルを用いてX方向の画素強度の突然の変化を検出し,もう1つのカーネルはY方向の画素強度を検出した.

    使用するカーネル


    X方向コア



    Y方向コア



    これらのカーネルが元の画像に適用されると,Sobel Edge検出が得られる.
  • 垂直カーネルのみを使用すると、輪郭はSobel画像を生成し、エッジはX方向に上昇します.
  • 水平カーネルを使用して、Y方向エッジが強化されたSobel画像を生成します.
  • GxとGyはそれぞれxとy方向の強度傾斜を表すものとする.AおよびBは、上述したXおよびYコアを表す.

    ここで、*は協調演算子、Iは入力画像を表す.
    傾斜の大きさの最終近似値Gは、以下のように計算することができる.

    傾斜の方向は、次のように近似できます.

    Sobel()

    Sobel(src, ddepth, dx, dy)
  • src:オリジナル画像
  • ddepth:出力画像精度
  • dx:X方向の導関数の差
  • dy:Y方向の導関数の差
  • コード#コード#

    # Sobel Edge Detection
    # x 축의 sobel edge 감지
    sobelx = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)
    # y 축의 sobel edge 감지
    sobely = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5)
    # X, Y sobel edge 감지 결합
    sobelxy = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)
    
    # Sobel Edge Detection Images 표시
    cv2.imshow('Sobel X', sobelx)
    cv2.waitKey(0)
    
    cv2.imshow('Sobel Y', sobely)
    cv2.waitKey(0)
    
    cv2.imshow('Sobel X Y using Sobel() function', sobelxy)
    cv2.waitKey(0)

    結果





    Canny Edge Detection


    非常に強力で柔軟で、最も広く使用されているエッジ検証方法の一つです.アルゴリズムは,画像からエッジを抽出する3段階の過程に従い,ノイズを低減するために必要な前処理段階に画像ぼかしを加えた.
  • ノイズ低減
  • 画像の強度傾斜計算
  • False edge抑制
  • hysteresisしきい値
  • ノイズ低減


    元の画像画素はエッジノイズを発生させる可能性があるので、エッジを計算する前にノイズを低減することが重要です.Canny Edge DetectionのGaussブラーフィルタは、不要なエッジをもたらす可能性のある不要な詳細を除去または最小化するために使用される.
    下の右側の画像から見ると、少しぼやけているように見えますが、エッジを計算できるかなりの数の詳細が残っています.

    画像の強度傾斜の計算


    画像が柔らかくなると、Sobelカーネルを使用して水平方向と垂直方向にフィルタリングされます.次に、これらのフィルタリング動作の結果を用いて、各画素の強度傾斜の大きさ(G)と方向(ϴ)を算出し、以下に示すようにする.

    そして、傾斜方向は最も近い45度の角で四捨五入される.以下の右画像は、これらのマージ処理手順の結果です.

    False edgeの抑制


    ノイズを低減し、強度傾斜を計算した後、この段階のアルゴリズムは、望ましくない画素(実際にはエッジを構成しない可能性がある)をフィルタリングするために、エッジを最大に抑制しない技術を用いる.この操作を行うと、各ピクセルは正の傾きと負の傾きの方向で隣接ピクセルと比較されます.現在のピクセルの傾きの大きさが隣接するピクセルより大きい場合は、変更されません.そうでない場合、現在のピクセルのサイズは0に設定されます.
    次の右図から,トラの毛に関連するエッジの多くがかなり抑制されていることがわかる.

    Hysterosisしきい値


    Canny Edge検出の最後のステップは、傾斜の大きさを他のしきい値より小さい2つのしきい値と比較することである.
  • チルトサイズの値がより大きいしきい値より大きい場合、ピクセルは強いエッジに関連付けられ、最終エッジマッピングに含まれます.
  • チルトサイズの値がより小さいしきい値より小さい場合、ピクセルは非表示になり、最終エッジマップから除外されます.
  • 勾配の大きさが2つのしきい値の間にある他のすべてのピクセルは、弱いエッジとして表示される(すなわち、最終エッジマッピングの候補として使用される).
  • 弱い画素が強いエッジに関連する画素に接続されている場合、この画素も最終エッジマップに含まれる.
  • Canny()

    Canny(src, threshold1, threshold2)
  • src:オリジナル画像
  • しきい値1:Hysterosisプロセスの最初のしきい値
  • しきい値2:Hysterosisプロセスの2番目のしきい値
  • コード#コード#

    # Canny Edge Detection
    edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) 
    
    # Display Canny Edge Detection Image
    cv2.imshow('Canny Edge Detection', edges)
    cv2.waitKey(0)

    結果