1. 노이즈 제거
Edge detection은 이미지의 노이즈에 민감하므로 첫 번째 단계에서 Gaussian filter를 사용하여 이미지의 노이즈를 제거한다.
2. 이미지의 Gradient 크기, 방향 구하기
노이즈가 제거된 이미지에 수평(Gx), 수직(Gy) 방향으로 Sobel kernel 필터링하여 파생 모델을 얻는다. 이 두 영상에서 다음과 같이 각 픽셀에 대한 Edge Gradient 및 방향을 찾을 수 있다.
Gradient 방향은 항상 Edge에 수직이다.
3. 최댓값이 아닌 픽셀 0으로 만들기(Non-maximum Suppression)
Gradient 크기와 방향을 얻은 후, Edge를 구성하지 않을 수 있는 불필요한 픽셀 제거를 위해 이미지 전체를 스캔한다.
- 위 그림에서 A는 Edge 위에 있다.
- Gradient 방향은 Edge에 수직이다.
- 점 B, C는 Gradient 방향이다.
- 따라서 점 A는 점 B, C와 비교하여 local maximum 값인지 확인한다.
- A가 최대라면 다음 단계로 넘어가고, 아니라면 0으로 설정.
(쉽게 말해서 주변 픽셀을 탐색하여 가장 값이 큰 녀석만 남기겠다는 거다...)
4. Hysteresis Thresholding
이 단계는 모든 Edge가 실제로 Edge인지 아닌지를 결정. 이를 위해 minVal 및 maxVal의 두 가지 임계값이 필요하다. Gradient의 크기가 maxVal보다 큰 모든 Edge는 Edge가 되고, minVal보다 작은 Edge는 버려진다. 두 임계값 사이에 있는 Edge들은 연결성을 기반으로 Edge인지 아닌지 결정된다.
위 그림에서
- A는 maxVal 위에 있기 때문에 Edge.
- C는 maxVal보다 낮지만 A에 연결되어 있으므로 유효한 Edge로 간주된다.
- 그러나 B는 minVal 이상이고 C와 동일한 영역에 있지만 확실한 Edge에 연결되어 있지 않으므로 폐기된다.
Canny Edge Detection in OpenCV
void cv::Canny(InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize=3,
bool L2gradient=false
)
image : 8 bit input image
edges : output edge map, 8 bit single channel
threshold1 : minVal
threshold2 : maxVal
apertureSize : Sobel을 위한 aperture size
'Computer Vision > OpenCV' 카테고리의 다른 글
[OpenCV] cv::VideoCapture RTSP open failed. (0) | 2022.06.14 |
---|---|
[OpenCV] Optical Flow (0) | 2022.04.11 |
[OpenCV] Histogram Equalization (히스토그램 평활화) (0) | 2022.02.25 |
[OpenCV] Gamma Correction(감마 보정) (0) | 2021.05.14 |