이미지 품질을 평가하는 대표적인 지표로 PSNR, SSIM, LPIPS가 있다.
PSNR
PSNR(Peak Signal-to-Noise Ratio)은 원본과 비교 이미지 간의 픽셀 차이를 dB 단위로 표현하는 가장 기본적인 지표이다.
MSE = (1/N) × Σ(xi - yi)²PSNR = 10 × log₁₀(MAX² / MSE)- N: 전체 픽셀 수
- xi, yi: 원본과 비교 이미지의 i번째 픽셀 값
- MAX: 픽셀 최대값 (8비트 이미지의 경우 255)
값이 높을수록 품질이 좋다. 일반적으로 40dB 이상이면 원본과 거의 동일, 3040dB이면 좋음, 2030dB이면 보통으로 본다.
from skimage.metrics import peak_signal_noise_ratio
score = peak_signal_noise_ratio(img1, img2, data_range=255)한계: 픽셀 단위의 수치적 차이만 측정하므로 인간의 시각적 인식과 괴리가 있다. 밝기 변화와 구조적 변화를 동등하게 취급한다.
SSIM
SSIM(Structural Similarity Index)은 인간의 시각 시스템을 반영하여 휘도, 대비, 구조 세 가지 요소를 비교한다.
- 휘도(Luminance): 평균 밝기 (픽셀 평균값)
- 대비(Contrast): 밝기 변화 폭 (픽셀 표준편차)
- 구조(Structure): 패턴 상관관계 (공분산)
SSIM(x, y) = (2μxμy + C1)(2σxy + C2) / ((μx² + μy² + C1)(σx² + σy² + C2))- μ: 평균, σ: 표준편차, σxy: 공분산
- C1 = (0.01 × L)², C2 = (0.03 × L)²
실제 이미지에서는 11×11 윈도우를 1픽셀씩 이동하면서 지역 SSIM을 계산하고 평균을 낸다(MSSIM).
from skimage.metrics import structural_similarity as ssim
score = ssim(img1, img2, data_range=255)한계: 블러 이미지도 값 분포가 유사하면 높은 값을 보인다. 그레이스케일 기반이라 색상 왜곡에 덜 민감하다.
LPIPS
LPIPS(Learned Perceptual Image Patch Similarity)는 사전 학습된 CNN의 feature를 비교하여 지각적 유사성을 측정한다.
LPIPS = Σ wl × ||φl(x) - φl(y)||²- φl: l번째 레이어의 feature 추출 함수
- wl: 학습된 레이어별 가중치
PSNR, SSIM과 달리 값이 낮을수록 유사하다. 인간의 유사도 판단 데이터로 가중치를 학습했기 때문에 지각적 유사성을 더 잘 반영한다.
import lpips
loss_fn = lpips.LPIPS(net="vgg")distance = loss_fn(img1_tensor, img2_tensor)이미지 생성 모델(GAN, Diffusion)이나 Super Resolution, Denoising 등 복원 모델의 품질 평가에 주로 사용된다.
참고