OpenCV 비전 실무10장 · Sobel 과 Laplacian 경계 검출10 / 21← 이전목차다음 →MetaContents

10장. Sobel 과 Laplacian 경계 검출

Laplacian: 변화량의 변화량

자동차를 타고 가다가 평지에서 오르막으로 들어서는 순간 몸이 뒤로 쏠리고, 오르막이 끝나 평지로 나오는 순간 앞으로 쏠립니다. 오르막 한가운데서는 쏠림이 없습니다. 쏠림은 "기울기가 바뀌는 순간"에만 생깁니다. Laplacian 은 이 쏠림을 잽니다. 밝기를 한 번 빼면 변화량(기울기)이 나오고, 그 변화량을 한 번 더 빼면 "기울기가 얼마나 바뀌나"가 나옵니다.

Sobel 은 한 번 빼서 경계에서 큰 값이 솟고, Laplacian 은 두 번 빼서 + 와 − 가 나란히 나온다는 비교 그림

왼쪽 상자가 한 번 빼기(Sobel), 오른쪽 상자가 두 번 빼기(Laplacian)입니다. 한 번 빼면 경계에서 큰 값이 하나 솟고, 두 번 빼면 경계 양옆에 + 와 − 가 나란히 나옵니다. 경계는 그 둘 사이, 값이 0 을 지나는 곳(영교차)입니다. 여기서 몸이 쏠리는 순간이 Laplacian 의 큰 값이고, 오르막 한가운데가 경계의 한가운데입니다.

한 줄의 밝기 50, 50, 50, 200, 200, 200 과 한 번 빼기, 두 번 빼기 결과를 위아래로 놓은 계산 그림

셋째 줄의 두 번 빼기는 칸마다 "왼쪽 + 오른쪽 − 2 × 자기"를 계산합니다. 커널로 쓰면 [1, -2, 1] 입니다. 칸 2 는 연두(+150), 칸 3 은 산호(−150)이고, 그 사이에서 값이 0 을 지납니다.

손으로 계산하기

칸왼쪽자기오른쪽왼쪽 + 오른쪽 − 2 × 자기
150505050 + 50 − 100 = 0
2505020050 + 200 − 100 = 150
35020020050 + 200 − 400 = −150
4200200200200 + 200 − 400 = 0

2차원 Laplacian 커널

그림에서는 가로와 세로의 두 번 빼기를 더합니다.

Laplacian 의 4-이웃 커널과 8-이웃 커널을 연두(더하는 칸), 산호(빼는 칸), 크림(0) 으로 칠한 3×3 표 두 개

4-이웃 커널은 위·아래·왼쪽·오른쪽을 더하고 가운데를 4 배 뺍니다. 가로 [1, -2, 1] 과 세로 [1, -2, 1] 을 더한 모양입니다. 8-이웃 커널은 대각선까지 더하고 가운데를 8 배 뺍니다. 두 커널 모두 숫자의 합이 0 이라, 고른 면에서는 결과가 0 입니다.

견줄 것4-이웃8-이웃
커널[[0, 1, 0], [1, -4, 1], [0, 1, 0]][[1, 1, 1], [1, -8, 1], [1, 1, 1]]
보는 이웃위·아래·왼쪽·오른쪽 4칸대각선까지 8칸
OpenCV 에서cv2.Laplacian(img, cv2.CV_64F, ksize=1) 과 같다cv2.filter2D 로 직접 건다

cv2.Laplacian 의 인자

순서인자보통 값뜻
1srcimg입력 그림
2ddepthcv2.CV_64F결과의 자료형. + 와 − 가 모두 나오므로 소수
3ksize1 또는 31 이면 4-이웃 커널, 3 이면 무게가 다른 3×3 커널, 5 이상이면 블러를 섞은 넓은 커널

짧은 예시

Python
import cv2

img = cv2.imread("ch10_shapes.png", cv2.IMREAD_GRAYSCALE)

# ksize=1: 4-이웃 커널. 결과를 소수로 받아 + 와 − 를 함께 본다
lap = cv2.Laplacian(img,          # src: 흑백 그림
                    cv2.CV_64F,   # ddepth: 음수까지 담는 소수
                    ksize=1)      # ksize: 1 이면 4-이웃 커널
print(lap[80, 57:63].tolist())    # 결과: [0.0, 0.0, 150.0, -150.0, 0.0, 0.0]

네모의 왼쪽 변에서 가로 59 는 +150, 가로 60 은 −150 입니다. 손계산과 같습니다. 이 줄은 세로로는 바뀌지 않으므로 세로 두 번 빼기는 0 이고, 가로 두 번 빼기만 남았습니다.

주의할 점

  • Laplacian 은 방향을 알려 주지 않습니다. 결과가 한 장뿐이라, 경계가 세로인지 가로인지는 알 수 없습니다.
  • Laplacian 의 큰 값은 경계 양옆에 생기고, 경계 자체는 0 을 지나는 곳입니다. 절댓값을 취해 그리면 경계가 두 줄로 보일 수 있습니다.
← 이전 절10장 · 커널 크기와 Scharr다음 절 →10장 · 노이즈와 블러 먼저 하기