[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検出が得られる.

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

Sobel()
Sobel(src, ddepth, dx, dy)
コード#コード#
# 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段階の過程に従い,ノイズを低減するために必要な前処理段階に画像ぼかしを加えた.
ノイズ低減
元の画像画素はエッジノイズを発生させる可能性があるので、エッジを計算する前にノイズを低減することが重要です.Canny Edge DetectionのGaussブラーフィルタは、不要なエッジをもたらす可能性のある不要な詳細を除去または最小化するために使用される.
下の右側の画像から見ると、少しぼやけているように見えますが、エッジを計算できるかなりの数の詳細が残っています.

画像の強度傾斜の計算
画像が柔らかくなると、Sobelカーネルを使用して水平方向と垂直方向にフィルタリングされます.次に、これらのフィルタリング動作の結果を用いて、各画素の強度傾斜の大きさ(
G
)と方向(ϴ
)を算出し、以下に示すようにする.
そして、傾斜方向は最も近い45度の角で四捨五入される.以下の右画像は、これらのマージ処理手順の結果です.

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

Hysterosisしきい値
Canny Edge検出の最後のステップは、傾斜の大きさを他のしきい値より小さい2つのしきい値と比較することである.
Canny()
Canny(src, threshold1, threshold2)
コード#コード#
# 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)
結果

Reference
この問題について([OpenCV] Edge Detection), 我々は、より多くの情報をここで見つけました https://velog.io/@rlath/OpenCV-Edge-Detectionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol