OpenCV 비전 실무7장 · Median 과 Bilateral 필터, 필터 비교10 / 21← 이전목차다음 →MetaContents

7장. Median 과 Bilateral 필터, 필터 비교

필터를 견주는 방법

6장에서는 평균 절대 차이와 PSNR 로 필터를 견줬습니다. 이 장에서는 여기에 두 잣대를 더합니다. 요리 경연에서 심사위원은 맛만 보지 않습니다. 원래 조리법과 얼마나 같은지, 모양이 흐트러지지 않았는지, 시간 안에 만들었는지를 함께 봅니다. 필터도 "깨끗한 원본과 얼마나 가까운가", "경계가 살아 있나", "얼마나 빠른가"를 함께 봐야 공정하게 견줄 수 있습니다.

평균 차이, PSNR, 한 줄 밝기, 걸린 시간의 네 가지 잣대를 나란히 놓은 비교 그림

그림의 네 상자가 이 장에서 쓰는 잣대입니다. 앞의 둘(평균 차이, PSNR)은 6장에서 본 것이고, 뒤의 둘(한 줄 밝기, 걸린 시간)이 새로 더한 것입니다. 앞의 둘은 깨끗한 원본이 있어야 잴 수 있습니다. 그래서 이 장은 깨끗한 그림에 노이즈를 일부러 더한 뒤 필터로 되돌려 봅니다. 여기서 원래 조리법이 깨끗한 원본, 맛 점수가 PSNR, 모양 점수가 한 줄 밝기, 조리 시간이 걸린 시간입니다.

네 잣대

잣대구하는 법좋은 쪽알려 주는 것
평균 차이(MAE)cv2.absdiff(원본, 결과).mean()작을수록칸마다 평균 몇만큼 틀렸나
PSNRcv2.PSNR(원본, 결과)클수록크게 틀린 칸을 더 무겁게 친 점수
한 줄 밝기결과[세로, :] 를 선 그래프로원본처럼 가파를수록경계가 살았나
걸린 시간time.perf_counter 의 차이짧을수록많은 사진에 쓸 수 있나

PSNR 을 손으로 계산하기

6장에서 "차이를 제곱해 평균 낸 값이 절반이 되면 약 3dB 오른다"고 했습니다. 숫자를 넣어 한 번 손으로 계산해 봅니다. PSNR 은 세 걸음으로 구합니다. 같은 자리 칸끼리의 차이를 제곱해 평균하고(MSE, Mean Squared Error, 평균 제곱 오차), 가장 큰 밝기의 제곱(255 × 255 = 65,025)을 그 값으로 나눈 뒤, 나눈 결과가 10 의 몇 제곱인지에 10 을 곱합니다.

단계원본 [100, 100, 100, 100] 과 결과 [110, 90, 105, 95]
① 칸마다 차이10, −10, 5, −5
② 제곱의 평균(MSE)(100 + 100 + 25 + 25) ÷ 4 = 62.5
③ 65,025 ÷ MSE65,025 ÷ 62.5 ≈ 1,040
④ 10 의 몇 제곱인가 × 101,000 이 10 의 세제곱이므로 1,040 은 3 보다 조금 크다 → 약 30 dB

그래서 "PSNR 이 10 오르면 틀린 정도(MSE)가 10분의 1 로 줄었다"고 읽습니다. 사진에서는 흔히 30 dB 를 넘으면 눈으로 보기에 꽤 깨끗하다고 봅니다. 6장에서 본 것처럼, 같은 그림끼리 재면 MSE 가 0 이라 나눌 수 없어 OpenCV 는 361.2 같은 아주 큰 값을 돌려줍니다.

짧은 예시

Python
import cv2
import numpy as np

clean = np.array([100, 100, 100, 100], dtype=np.uint8)
result = np.array([110, 90, 105, 95], dtype=np.uint8)

# absdiff: 칸마다 |원본 − 결과|(6차시). 1차원 배열을 주면 세로로 긴 모양으로 돌려주므로 ravel() 로 편다
print([int(v) for v in cv2.absdiff(clean, result).ravel()])   # 결과: [10, 10, 5, 5]
print(float(cv2.absdiff(clean, result).mean()))       # 결과: 7.5 → 평균 차이
# PSNR: 두 그림의 크기와 자료형이 같아야 한다
print(round(cv2.PSNR(clean, result), 2))              # 결과: 30.17

주의할 점

  • 6장의 프로젝트에서처럼 평균 차이와 PSNR 이 늘 같은 순서를 매기지는 않습니다. 평균 차이는 모든 칸을 똑같이 세고, PSNR 은 제곱을 하므로 크게 틀린 칸을 더 무겁게 칩니다. 이 장의 실습 2에서도 평균 필터가 PSNR 은 올리면서 평균 차이는 키우는 일이 나옵니다. 둘을 함께 봅니다.
  • 실제 사진에는 깨끗한 원본이 없습니다. 그때는 한 줄 밝기와 눈으로 보기, 그리고 뒤에 이어지는 일(글자 읽기, 모델의 정확도)의 결과로 견줍니다.
← 이전 절7장 · Bilateral 의 인자와 비용다음 절 →7장 · 네 필터 한눈에 견주기