OpenCV 비전 실무11장 · Canny 와 Edge 비교8 / 21← 이전목차다음 →MetaContents

11장. Canny 와 Edge 비교

cv2.Canny 의 인자

세탁기의 버튼을 떠올려 봅시다. 빨래(그림)를 넣고, 물 온도 두 가지와 헹굼 세기, 탈수 방식을 고릅니다. 버튼 하나하나가 결과를 바꿉니다. cv2.Canny 도 그림 하나와 숫자 네 개를 받습니다.

threshold1, threshold2, apertureSize, L2gradient 네 인자를 나란히 놓은 비교 그림

그림의 네 상자가 그림(image) 다음에 주는 네 인자입니다. 두 기준값은 4단계 이력 임계값에서, apertureSize 와 L2gradient 는 2단계 기울기에서 쓰입니다. 여기서 빨래가 그림, 물 온도 두 가지가 두 기준값, 헹굼 세기가 apertureSize, 탈수 방식이 L2gradient 입니다.

인자 다섯 개

순서이름보통 값뜻
1imagegray 또는 블러한 그림8비트(uint8) 그림. 보통 흑백을 준다
2threshold150두 기준값 가운데 하나. 작은 쪽이 low 가 된다
3threshold2150다른 기준값. 큰 쪽이 high 가 된다
4apertureSize3(기본값)기울기를 잴 Sobel 커널 크기. 3, 5, 7
5L2gradientFalse(기본값)True 면 √(gx² + gy²), False 면 \gx\+ \gy\

low 와 high 의 비율

OpenCV 의 Canny 튜토리얼에는 캐니가 high : low 를 2 : 1 에서 3 : 1 사이로 권했다고 적혀 있습니다. 이 장에서도 이것을 출발점으로 삼는 경험 규칙으로 씁니다.

lowhigh비율결과의 경향
501001 : 2약한 선까지 많이 이어진다
501501 : 31장부터 써 온 무난한 값
1001501 : 1.5약한 선이 끊기기 쉽다
504001 : 8강한 경계가 적어 선이 많이 사라진다

짧은 예시

Python
import cv2
import numpy as np

gray = cv2.imread("ch11_set/shapes.png", cv2.IMREAD_GRAYSCALE)
# 두 기준값의 순서를 바꿔 줘도 같은 결과인지 본다
a = cv2.Canny(gray, 50, 150)
b = cv2.Canny(gray, 150, 50)
print("순서를 바꿔도 같은가:", np.array_equal(a, b))

# apertureSize 를 키우면 같은 기준값에서 경계가 크게 늘어난다
for size in [3, 5, 7]:
    e = cv2.Canny(gray, 50, 150, apertureSize=size)
    print(f"apertureSize {size}: 경계 칸 비율 {round(float((e > 0).mean()), 3)}")

교안 PC 에서는 순서를 바꿔도 같고(True), apertureSize 3 과 5 는 0.019, 0.02 로 비슷하지만 7 은 0.069 로 세 배 넘게 늘어납니다. 커널이 커지면 칸 여러 개의 차이를 더하므로 기울기 크기가 훨씬 크게 나오고, 같은 기준값이 상대적으로 낮아지기 때문입니다.

주의할 점

  • apertureSize 를 바꾸면 기울기 크기의 눈금이 달라집니다. 5 나 7 을 쓰면 기준값도 함께 키워야 합니다.
  • 컬러 그림을 넣어도 오류는 나지 않지만, 이 교안에서는 흑백으로 바꿔 넣습니다. 결과를 견주기 쉽고, 앞 장들과 같은 꼴이기 때문입니다.
← 이전 절11장 · 4단계 이력 임계값다음 절 →11장 · 기준값 자동으로 정하기