[OpenCV] Edge Detection

rlath·2022년 4월 18일
0

OpenCV

목록 보기
12/17

Edge Detection

에지의 특징은 픽셀 강도의 급격한 변화다. 에지를 감지하려면 인접 픽셀에서 이러한 변화를 찾으면 된다. OpenCV에서 에지 감지 알고리즘인 Sobel Edge DetectionCanny Edge Detection이 사용된다..

  1. imread() 사용하여 이미지 읽기
    에지를 감지할 때 색상 정보가 필요하지 않기 때문에 회색조 이미지로 읽는다

  2. 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는 아래 그림과 같이 픽셀 강도의 급격한 변화로 표시되는 에지를 감지한다.

에지는 1차 도함수를 취하면 더 쉽게 볼 수 있습니다(여기에서 최대값으로 나타남)

위의 그림은 기울기가 특정 임계값보다 높은 영역에서 에지를 탐지할 수 있음을 보여준다. 또 도함수가 갑자기 바뀌면 화소 강도 변화도 드러난다. 이를 염두에 두고 3×3 커널을 사용하여 도함수를 근사적으로 계산할 수 있다. 우리는 하나의 커널을 사용하여 X 방향의 픽셀 강도의 갑작스러운 변화를 감지하고, 다른 커널은 Y 방향의 픽셀 강도를 감지한다.

사용되는 커널

X 방향 커널

Y 방향 커널

이러한 커널이 원본 이미지에 적용되면 Sobel Edge Detection 을 얻게 된다.

  • 수직 커널만 사용할 경우 컨볼루션은 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단계 프로세스를 따르고, 노이즈를 줄이기 위해 필요한 사전 처리 단계에 이미지 흐림 효과를 추가한다.

  1. 노이즈 감소
  2. 이미지의 강도 기울기 계산
  3. False edge 억제
  4. Hysteresis 임계값

노이즈 감소

원본 이미지 픽셀은 에지에 노이즈가 생길 수 있어서 에지를 계산하기 전에 노이즈를 줄이는 것이 중요하다. Canny Edge Detection에서 가우시안 흐림 필터는 기본적으로 원하지 않는 에지에 이어질 수 있는 불필요한 세부 사항을 제거하거나 최소화하는 데 사용된다.

아래의 오른쪽 이미지를 보면 약간 흐릿하게 보이지만 가장자리를 계산할 수 있는 상당한 양의 세부 사항을 유지하고 있다.

이미지의 강도 기울기 계산

이미지가 부드러워지면(흐리게) 수평 및 수직으로 Sobel 커널로 필터링된다. 그런 다음 이러한 필터링 작업의 결과를 사용하여 아래와 같이 각 픽셀의 강도 기울기 크기(G)와 방향(ϴ)을 계산한다.

그런 다음 기울기 방향은 가장 가까운 45도 각도로 반올림된다. 아래의 오른쪽 이미지는 이러한 결합 처리 단계의 결과다.

False edge 억제

노이즈를 줄이고 강도 기울기를 계산한 후 이 단계의 알고리즘은 가장자리를 최대로 억제하지 않는 기술을 사용해 원하지 않는 픽셀(실제로 가장자리를 구성하지 않을 수 있음)을 필터링한다. 이를 수행할 때 각 픽셀은 양수 및 음수 기울기 방향으로 인접 픽셀과 비교된다. 현재 픽셀의 기울기 크기가 인접 픽셀보다 크면 변경되지 않은 상태로 유지된다. 그렇지 않으면 현재 픽셀의 크기가 0으로 설정된다.

아래 오른쪽 그림을 보면 호랑이의 털과 관련된 수많은 에지가 상당히 억제되었다.

Hysteresis 임계값

Canny Edge Detection의 이 마지막 단계에서는 기울기 크기를 다른 임계값보다 작은 두 임계값과 비교한다.

  • 기울기 크기 값이 더 큰 임계값보다 높으면 해당 픽셀은 강한 에지와 연결되고 최종 에지 맵에 포함된다.
  • 기울기 크기 값이 더 작은 임계값보다 낮으면 픽셀이 억제되고 최종 에지 맵에서 제외된다.
  • 기울기 크기가 이 두 임계값 사이에 있는 다른 모든 픽셀은 약한 에지로 표시된다(즉, 최종 가장자리 맵에 포함될 후보가 됨).
  • 약한 픽셀이 강한 에지와 관련된 픽셀에 연결되면 이 픽셀도 최종 에지 맵에 포함된다.

Canny()

Canny(src, threshold1, threshold2)
  • src : 원본 이미지
  • threshold1 : Hysteresis 절차의 첫 번째 임계값
  • threshold2 : Hysteresis 절차의 두 번째 임계값

코드

# 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)

결과


profile
백엔드 개발자

0개의 댓글