본문 바로가기
AI-driven Methodology/CV (Computer Vision)

[Computer Vision] Edge Detection

by goatlab 2021. 12. 11.
728x90
반응형
SMALL

Edge Detection

 

이미지의 edge를 감지하면 존재하는 물체를 식별할 수 있다. 따라서 CV의 중요한 사용 사례이다. 경계선을 인지하는 것 엣지 추출(edge detection)이라고 한다. 엣지 (경계선)는 이미지 안에서 픽셀의 값이 갑자기 변하는 곳이다. 따라서 엣지 추출을 하는 알고리즘은 이미지를 미분한 그레디언트 (gradient) 벡터의 크기로 판단한다. edge는 이미지의 인접한 pixel 강도의 상당한 변화에 의해 형성된다.

 

대표적인 엣지 추출 알고리즘으로 Sobel edge Detection과 Canny edge Detection이 있다.

 

Sobel Edge Detection

 

Sobel 검출기는 이미지의 pixel 기울기를 계산한다. pixel 강도가 밝은 곳에서 어두운 곳으로 변하는 속도와 변화 방향을 식별한다. 이 변경은 강도가 얼마나 빠르게 또는 점진적으로 변경되는지 판단하여 edge의 존재를 알려준다. 여기에는 두 개의 kernel이 포함되어 있다. 하나는 수평 edge를 감지하고 다른 하나는 수직 edge를 감지한다.

 

수직 kernel은 X축을 따라 edge를 향상시키는 반면 수평 kernel은 Y축을 따라 edge를 향상시킨다.

 

OpenCV에서 Sobel edge Detection Sobel, Laplacian 명령으로 구현한다.

 

from skimage.data import text
import cv2

img = text()

sobelx = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_8U, 0, 1, ksize=3)
laplacian = cv2.Laplacian(img, cv2.CV_8U)

plt.figure(figsize=(9, 4))
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('Original')
plt.axis("off")
plt.subplot(2, 2, 2)
plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian')
plt.axis("off")
plt.subplot(2, 2, 3)
plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X')
plt.axis("off")
plt.subplot(2, 2, 4)
plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y')
plt.axis("off")
plt.tight_layout()
plt.show()

 

Canny Edge Detection

 

Canny 에지 검출기는 다단계 에지 검출 알고리즘을 따른다. 일부 후처리 단계와 함께 Sobel 필터 방법을 통합하므로 강력하고 매우 효율적이다.

 

◦ 소음 감소 (Noise Reduction) : 정확한 결과를 위해 이미지를 부드럽게 하고 edge 주변의 noise를 줄이기 위해 Gaussian Blur를 사용하는 전처리 단계

◦ Sobel Filtering : X 및 Y 방향과 함께 이미지의 강도 기울기를 계산. 강도 기울기의 방향과 변화율을 출력

◦ Non Maximum Suppression : 잘못 생성된 edge를 무시하는 데 사용. 현재 pixel의 그래디언트 값이 주변 pixel보다 큰지 확인. 전자의 경우 현재 pixel의 그래디언트 값이 변경되지 않은 상태로 유지되고 값이 0으로 업데이트.

◦ Hysteresis Thresholding : 임계값은 edge를 강함, 억제됨 및 약함으로 분류. 임계값에 따라 stron, they, g edge는 최종 검출 맵에 포함되고, 억제된 edge는 제거되며, 약한 edge와 강한 edge가 연결되면 최종 검출 맵에도 포함된다.
img = text()
edges = cv2.Canny(img, 50, 100)

plt.subplot(2, 1, 1)
plt.imshow(img, cmap="gray")
plt.title("원본 이미지")
plt.axis('off')
plt.subplot(2, 1, 2)
plt.imshow(edges, cmap="Greys", alpha=0.3)
plt.axis('off')
plt.title("Canny Detection 결과")
plt.tight_layout()
plt.show()
728x90
반응형
LIST