10장. Sobel 과 Laplacian 경계 검출
Laplacian: 변화량의 변화량
자동차를 타고 가다가 평지에서 오르막으로 들어서는 순간 몸이 뒤로 쏠리고, 오르막이 끝나 평지로 나오는 순간 앞으로 쏠립니다. 오르막 한가운데서는 쏠림이 없습니다. 쏠림은 "기울기가 바뀌는 순간"에만 생깁니다. Laplacian 은 이 쏠림을 잽니다. 밝기를 한 번 빼면 변화량(기울기)이 나오고, 그 변화량을 한 번 더 빼면 "기울기가 얼마나 바뀌나"가 나옵니다.
왼쪽 상자가 한 번 빼기(Sobel), 오른쪽 상자가 두 번 빼기(Laplacian)입니다. 한 번 빼면 경계에서 큰 값이 하나 솟고, 두 번 빼면 경계 양옆에 + 와 − 가 나란히 나옵니다. 경계는 그 둘 사이, 값이 0 을 지나는 곳(영교차)입니다. 여기서 몸이 쏠리는 순간이 Laplacian 의 큰 값이고, 오르막 한가운데가 경계의 한가운데입니다.
셋째 줄의 두 번 빼기는 칸마다 "왼쪽 + 오른쪽 − 2 × 자기"를 계산합니다. 커널로 쓰면 [1, -2, 1] 입니다. 칸 2 는 연두(+150), 칸 3 은 산호(−150)이고, 그 사이에서 값이 0 을 지납니다.
손으로 계산하기
| 칸 | 왼쪽 | 자기 | 오른쪽 | 왼쪽 + 오른쪽 − 2 × 자기 |
|---|---|---|---|---|
| 1 | 50 | 50 | 50 | 50 + 50 − 100 = 0 |
| 2 | 50 | 50 | 200 | 50 + 200 − 100 = 150 |
| 3 | 50 | 200 | 200 | 50 + 200 − 400 = −150 |
| 4 | 200 | 200 | 200 | 200 + 200 − 400 = 0 |
2차원 Laplacian 커널
그림에서는 가로와 세로의 두 번 빼기를 더합니다.
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 의 인자
| 순서 | 인자 | 보통 값 | 뜻 |
|---|---|---|---|
| 1 | src | img | 입력 그림 |
| 2 | ddepth | cv2.CV_64F | 결과의 자료형. + 와 − 가 모두 나오므로 소수 |
| 3 | ksize | 1 또는 3 | 1 이면 4-이웃 커널, 3 이면 무게가 다른 3×3 커널, 5 이상이면 블러를 섞은 넓은 커널 |
짧은 예시
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 을 지나는 곳입니다. 절댓값을 취해 그리면 경계가 두 줄로 보일 수 있습니다.