에지의 특징은 픽셀 강도의 급격한 변화다. 에지를 감지하려면 인접 픽셀에서 이러한 변화를 찾으면 된다. 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 Operator는 아래 그림과 같이 픽셀 강도의 급격한 변화로 표시되는 에지를 감지한다.
에지는 1차 도함수를 취하면 더 쉽게 볼 수 있습니다(여기에서 최대값으로 나타남)
위의 그림은 기울기가 특정 임계값보다 높은 영역에서 에지를 탐지할 수 있음을 보여준다. 또 도함수가 갑자기 바뀌면 화소 강도 변화도 드러난다. 이를 염두에 두고 3×3 커널을 사용하여 도함수를 근사적으로 계산할 수 있다. 우리는 하나의 커널을 사용하여 X 방향의 픽셀 강도의 갑작스러운 변화를 감지하고, 다른 커널은 Y 방향의 픽셀 강도를 감지한다.
이러한 커널이 원본 이미지에 적용되면 Sobel Edge Detection 을 얻게 된다.
Gx와 Gy가 각각 x와 y 방향의 강도 기울기를 나타낸다고 하자. A와 B가 위에 정의된 X와 Y 커널을 나타내는 경우
여기서 *
는 컨볼루션 연산자를 나타내고 I
는 입력 이미지를 나타낸다.
기울기 크기의 최종 근사값인 G
는 다음과 같이 계산할 수 있다.
그러면 기울기의 방향은 다음과 같이 근사화될 수 있다.
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)
매우 강력하고 유연해서 가장 널리 사용되는 에지 검증 방법 중 하나다. 알고리즘은 이미지에서 가장자리를 추출하는 3단계 프로세스를 따르고, 노이즈를 줄이기 위해 필요한 사전 처리 단계에 이미지 흐림 효과를 추가한다.
원본 이미지 픽셀은 에지에 노이즈가 생길 수 있어서 에지를 계산하기 전에 노이즈를 줄이는 것이 중요하다. Canny Edge Detection에서 가우시안 흐림 필터는 기본적으로 원하지 않는 에지에 이어질 수 있는 불필요한 세부 사항을 제거하거나 최소화하는 데 사용된다.
아래의 오른쪽 이미지를 보면 약간 흐릿하게 보이지만 가장자리를 계산할 수 있는 상당한 양의 세부 사항을 유지하고 있다.
이미지가 부드러워지면(흐리게) 수평 및 수직으로 Sobel 커널로 필터링된다. 그런 다음 이러한 필터링 작업의 결과를 사용하여 아래와 같이 각 픽셀의 강도 기울기 크기(G
)와 방향(ϴ
)을 계산한다.
그런 다음 기울기 방향은 가장 가까운 45도 각도로 반올림된다. 아래의 오른쪽 이미지는 이러한 결합 처리 단계의 결과다.
노이즈를 줄이고 강도 기울기를 계산한 후 이 단계의 알고리즘은 가장자리를 최대로 억제하지 않는 기술을 사용해 원하지 않는 픽셀(실제로 가장자리를 구성하지 않을 수 있음)을 필터링한다. 이를 수행할 때 각 픽셀은 양수 및 음수 기울기 방향으로 인접 픽셀과 비교된다. 현재 픽셀의 기울기 크기가 인접 픽셀보다 크면 변경되지 않은 상태로 유지된다. 그렇지 않으면 현재 픽셀의 크기가 0으로 설정된다.
아래 오른쪽 그림을 보면 호랑이의 털과 관련된 수많은 에지가 상당히 억제되었다.
Canny Edge Detection의 이 마지막 단계에서는 기울기 크기를 다른 임계값보다 작은 두 임계값과 비교한다.
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)