6장. 평균 필터와 Gaussian 필터
언제 쓰나와 주의할 점
요리할 때 소금은 맛을 살리지만, 너무 많이 넣으면 재료 맛이 사라집니다. 흐리게 하는 필터도 알맞게 쓰면 노이즈가 줄어 다음 계산이 안정되지만, 지나치면 AI 가 알아봐야 할 무늬(글자, 흠집, 테두리)까지 지웁니다.
그림의 네 상자가 흐리게 하는 필터를 자주 쓰는 곳입니다. 여기서 소금이 필터이고, 소금의 양이 커널 크기와 시그마입니다.
쓰임과 알맞은 설정
| 쓰임 | 하는 까닭 | 자주 쓰는 설정 | 다루는 장 |
|---|---|---|---|
| 노이즈 줄이기 | 어두운 곳에서 찍은 사진의 지글거림을 줄인다 | Gaussian 3~5 | 이 장 |
| 경계 찾기 전 | 노이즈를 경계로 잘못 찾지 않게 한다 | Gaussian 5 | 10장, 11장 |
| 크기 줄이기 전 | 줄일 때 생기는 들쭉날쭉한 무늬를 막는다 | 줄이는 비율에 맞춰 | 14장 |
| 학습 데이터 늘리기 | 흐린 사진에도 잘 알아보도록 흐린 사진을 섞어 넣는다 | 일부 사진만, 여러 세기로 | 16장 |
지나치게 흐릴 때 잃는 것
| 잃는 것 | 예 |
|---|---|
| 가는 선과 글자 | 번호판, 안내판 글자가 뭉개진다 |
| 작은 흠집 | 불량 검사에서 찾아야 할 긁힘이 사라진다 |
| 또렷한 테두리 | 물건의 크기를 잴 때 테두리 자리가 흐려진다 |
짧은 예시
import cv2
img = cv2.imread("ch06_board.png", cv2.IMREAD_GRAYSCALE)
# 오른쪽 위 줄무늬 판(가로 216~299, 세로 24~128)의 표준편차: 클수록 검고 흰 줄이 또렷하다
area = (slice(24, 129), slice(216, 300))
for k in (1, 3, 9, 15):
out = img if k == 1 else cv2.GaussianBlur(img, (k, k), 0)
print(f"크기 {k:2}: 줄무늬 판의 표준편차 {float(out[area].std()):.1f}")크기 1 은 필터를 걸지 않은 원본입니다. 이 코드를 돌리면 줄무늬 판의 표준편차가 69.7(원본), 58.2(크기 3), 42.9(크기 9), 31.4(크기 15)로 줄어듭니다. 검고 흰 줄이 섞여 회색이 되어 가는 것입니다.
주의할 점
- 학습 데이터 전체를 일괄로 흐리게 만들면, 실제 현장의 또렷한 사진을 오히려 못 알아볼 수 있습니다. 흐림은 꼭 필요한 곳에 알맞은 세기로만 씁니다.
- 필터를 고를 때는 이 장의 프로젝트처럼 몇 가지 설정을 숫자로 견주어 보고 정합니다.