7장. Median 과 Bilateral 필터, 필터 비교
Median 필터
반장 선거에서 아홉 명이 저마다 점수를 매겼는데, 한 명이 장난으로 0점이나 100점을 줬다고 해 봅시다. 가장 공정한 방법 하나는 점수를 줄 세워 가운데 점수를 쓰는 것입니다. 장난 점수는 줄의 끝에 가서 결과에 끼어들지 못합니다. OpenCV 의 cv2.medianBlur 가 이 일을 그림의 모든 칸에서 해 줍니다.
왼쪽은 점 비율 20% 그림이고, 오른쪽으로 갈수록 커널 크기(ksize)를 3, 5, 9 로 키웠습니다. ksize 3 에서 점이 대부분 사라지고, 5 에서는 거의 남지 않습니다. 9 까지 키우면 점은 없지만 글자 모서리가 둥글어지고 가는 선이 뭉개집니다. 여기서 장난 점수가 점 노이즈이고, 줄 세워 가운데 점수를 쓰는 일이 cv2.medianBlur 입니다.
cv2.medianBlur 의 인자
| 인자 | 뜻 | 보통 값 |
|---|---|---|
| src | 고칠 그림(흑백이나 컬러) | noisy |
| ksize | 커널의 한 변(칸 수). 1 보다 큰 홀수 정수 하나 | 3 이나 5 |
| 돌려주는 것 | 고친 새 그림(원본은 그대로) | 같은 크기, 같은 자료형 |
cv2.blur(img, (5, 5)) 와 cv2.GaussianBlur(img, (5, 5), 0) 은 커널 크기를 (가로, 세로) 튜플로 받았지만, cv2.medianBlur(img, 5) 는 정사각형 커널만 써서 숫자 하나만 받습니다.
짧은 예시
import cv2
import numpy as np
tiny = np.full((5, 5), 100, dtype=np.uint8)
tiny[2, 2] = 255 # 하얀 점
tiny[0, 4] = 0 # 검은 점
# cv2.medianBlur(그림, ksize): 3×3 칸의 중앙값으로 바꾼다
print(cv2.medianBlur(tiny, 3))
# 결과: 25칸이 모두 100 → 두 점이 얼룩 없이 깨끗이 사라졌다평균 필터가 두 점을 117 과 89 의 얼룩으로 번지게 한 바로 그 그림에서, Median 필터는 두 점을 흔적 없이 지웠습니다.
주의할 점
- ksize 에 짝수(4)나 튜플((5, 5))을 주면 오류가 납니다. 1 보다 큰 홀수 정수 하나만 됩니다.
- ksize 가 3 이나 5 일 때는 uint8 말고 다른 자료형(uint16, float32)도 되지만, 그보다 크면 uint8 그림만 됩니다(OpenCV 공식 문서).
- 커널보다 가는 선(굵기 1칸)도 점처럼 소수파로 보고 지웁니다. 부품의 가는 금이나 얇은 글자 획이 중요하면 ksize 를 3 으로 작게 두고 결과를 꼭 눈으로 봅니다.