1 minute read

Edge Detection


Scharr

Derivative (도함수) 계산을 총해 경계를 검출하는 방식


Input

untitle


untitle


Code

img_his = cv2.cvtColor(img_blr, cv2.COLOR_BGR2HLS).astype(np.float32)

edge_x = cv2.Scharr(img_his, cv2.CV_64F, 1, 0)
edge_x = np.absolute(edge_x)
edge_x = np.uint8(255 * edge_x / np.max(edge_x))


Output

untitle


untitle


Explain

img_his = cv2.cvtColor(img_blr, cv2.COLOR_BGR2HLS).astype(np.float32)
  • 색상 공간 변경: cv2.cvtColor 함수는 임지 ‘img_lur’의 색상 공간을 BRG(Blue, Green, Red) 에서 HLS(Hue, Lightness, Saturation)로 변환
    • HLS: Hue(색조), Lightness(명도), Saturation(채도). 경계선 감지에 있어 BGR 색상 공간보다 유리하다.
    • 다른 색 공간 영역 사용 가능
  • 데이터 타입 변경: .astype 를 사용해 데이터 타입을 float32로 변환. 정밀도 유지.


edge_x = cv2.Scharr(img_his, cv2.CV_64F, 1, 0)
  • Scharr: x축 경계선 감지. 이미지의 x축 방향(수평 방향)의 경계선을 감지
    • y축 감지: (img_his, cv2.CV_64F, 0, 1)
    • 차선은 주로 x 축 방향의 감지를 요구함(차선을 나타내는 직선은 y축 방향임으로)
  • CV_64F: 출력 이미지의 depth 를 나타내며, 64비트 부동 소수점을 의미. 경계선 감지에서 발생할 수 있는 음수 값을 처리 가능


edge_x = np.absolute(edge_x)
edge_x = np.uint8(255 * edge_x / np.max(edge_x))
  • absolute: 엣지의 인텐시티(intensity, 변화율)의 절대값 계산. scharr 는 음-양수 값을 모두 가짐
  • unit8(255 * edge_x / np.max(edge_x)): 0-255 로 정규화.


Threshold

Way A

edge_x = np.where(edge_x > threshold, edge_x, 0)
  • edge_x 배열 내 threshold 값보다 큰 모든 요소는 유지. 나머지는 0.
  • 특정 임계값 이상의 경계만 강조
  • 임계값 미만의 값 제거


untitle


untitle



Way B

binary = np.zeros_like(img_his)
binary[img_his >= threshold] = 255
  • 새로운 이미지 배열 생성, 배열 내 threshold 이상의 모든 요소에 대응하는 binary 배열 위치에, 255할당.
  • 임계값 미만의 값 유지


untitle


untitle


Sobel

cv2.Sobel(src, ddepth, dx, dy, kernelsize)
  • 특징: 이미지의 x, y 축 방향의 공간적 변화율을 계산하여 경계선 감지
  • 장점: 다양한 크기의 커널 사용 가능
  • 단점: 노이즈에 민감하다.


Canny Edge

cv2.Canny(image, threshold1, threshold2)
  • 특징: 여러 전처리 과정을 거쳐 경계선을 감지.
    • 노이즈 제거, 경계 인텐시티 계산, 비최대 억제, 이력 임계값 처리 프로세스 포함
  • 장점: 높은 정확도, 노이즈에 강하고, 명확하고 얇은 경계선 제공
  • 단점: 계산 비용이 높고, 임계값을 직접 지정


Laplacian

cv2.Laplacian(src, ddepth)

특징: 이미지의 2차 미분을 사용하여 감지. 장점: 빠른 계산 및 구현 단점: 노이즈에 예민함. 전처리 필수


Prewitt


Leave a comment