6장. 평균 필터와 Gaussian 필터
평균 필터와 Gaussian 필터 견주기
같은 양의 물감을 한 점에 떨어뜨렸다고 해 봅시다. 마른 종이에서는 가장자리가 비교적 또렷하게 번지고, 젖은 종이에서는 넓고 고르게 퍼집니다. 평균 필터는 정해진 네모 안에 고르게 퍼뜨리고, Gaussian 필터는 가운데에 진하게 남기며 바깥으로 갈수록 옅게 퍼뜨립니다. 그래서 같은 크기로 걸면 Gaussian 이 경계를 덜 번지게 합니다.
안내판 그림 아래쪽의 어두운 바닥(60)과 밝은 바닥(200)이 만나는 곳을 가로로 한 줄 잘라 밝기를 그렸습니다. 갈색 계단이 원본, 다홍이 크기 9 의 평균 필터, 초록이 크기 9 의 Gaussian 필터입니다. 평균 필터는 60 에서 200 까지 곧은 비탈로 넓게 번졌고, Gaussian 은 가운데에서 가파르게 올라 번진 폭이 좁습니다. 여기서 물감이 경계의 밝기이고, 번진 폭이 흐려진 정도입니다.
두 상자는 이 절의 결론입니다. 평균 필터는 노이즈를 더 세게 지우고, Gaussian 은 경계를 더 잘 지킵니다.
크기 9 에서 견주기
| 견줄 것 | 평균 필터 cv2.blur | Gaussian 필터 cv2.GaussianBlur |
|---|---|---|
| 무게 | 81칸 모두 같게 | 가운데가 크고 멀수록 작게 |
| 경계가 번진 폭(밝기 70~190 인 칸 수) | 8칸 | 4칸 |
| 고른 면에 남은 흔들림(노이즈 낀 안내판, 표준편차) | 2.15 | 3.60 |
| 원본과의 평균 차이(노이즈 낀 안내판) | 16.16 | 11.03 |
| 어울리는 곳 | 빠르게 대충 흐릴 때, 배경 흐리기 | 경계를 지키며 노이즈를 줄일 때, 경계 찾기 전 |
경계가 번진 폭은 노이즈 없는 원본에 필터를 걸어 잰 값이고, 고른 면의 흔들림과 원본과의 평균 차이는 실습 1의 노이즈(표준편차 20, 씨앗 600)를 더한 그림에 걸어 잰 값입니다. 고른 면은 실습 3과 같은 왼쪽 아래 어두운 바닥입니다. 평균 필터 쪽 숫자는 실습 3에서 직접 확인합니다.
짧은 예시
import cv2
img = cv2.imread("ch06_board.png", cv2.IMREAD_GRAYSCALE)
row = 165 # 어두운 바닥과 밝은 바닥이 함께 있는 가로줄
mean9 = cv2.blur(img, (9, 9))[row, 150:171]
gauss9 = cv2.GaussianBlur(img, (9, 9), 0)[row, 150:171]
print("원본 :", [int(v) for v in img[row, 150:171]])
print("평균 :", [int(v) for v in mean9])
print("가우스:", [int(v) for v in gauss9])평균은 60 … 76, 91, 107, 122, 138, 153, 169, 184, 200 처럼 같은 간격(약 15.6)으로 오르고, Gaussian 은 62, 69, 86, 114, 146, 174, 191, 198 처럼 가운데에서 크게 뛰어오릅니다.
주의할 점
- "Gaussian 이 늘 낫다"는 아닙니다. 같은 크기에서 노이즈를 지우는 힘은 평균 필터가 더 셉니다. 비교는 늘 같은 크기, 같은 그림, 같은 노이즈로 합니다.
- 두 필터 모두 경계를 어느 정도는 뭉갭니다. 경계를 거의 그대로 지키며 노이즈를 지우는 필터(Bilateral)는 7장에서 봅니다.