Image Restoration: From Wiener Filter to Deep Learning
| 방법 | PSNR (dB) | SSIM | 특징 |
|---|---|---|---|
| 블러 (기준선) | 24.38 | 0.6380 | 입력 |
| Wiener Filter | 26.95 | 0.7225 | PSF·K값 필요 |
| DPIR (DL) | 27.52 | 0.7652 | 데이터 기반, PSF 불필요 |
카메라 흔들림·초점 오류로 인한 영상 블러는 의료·감시·사진 분야에서 핵심적인 문제라고 생각합니다. 블러 제거 없이는 후속 비전 처리(객체 탐지, 분류)의 정확도가 저하됩니다.
기존 접근 — Wiener Filter:
PSF(Point Spread Function)를 알고 있을 때 주파수 도메인에서 역필터링을 수행합니다.
| 항목 | 내용 |
|---|---|
| 언어 | C++ (OpenCV 4.12), Python 3.12 |
| 딥러닝 모델 | DPIR / DRUNet (IEEE TPAMI 2021) |
| 실험 이미지 | Set12 benchmark (Lena, 512×512, grayscale) |
| 블러 유형 | Gaussian PSF (ksize=21, σ=4.0) + Gaussian noise (σ=3) |
| 방법 | PSNR (dB) | SSIM | 비고 |
|---|---|---|---|
| 블러 (기준선) | 24.38 | 0.6380 | 입력 이미지 |
| Wiener Filter | 26.95 | 0.7225 | K=0.004, +2.57 dB |
| K값 | PSNR (dB) | 현상 |
|---|---|---|
| 0.0001 | 17.34 | 너무 작음 → 노이즈 증폭 |
| 0.001 | 27.21 | 과소 추정 |
| 0.004 | 26.95 | 최적 |
| 0.02 | 25.05 | 과대 추정 → 과도한 평활화 |
| 0.1 | 23.32 | 너무 큼 → 블러 잔존 |
PSF를 알고 있어도 노이즈 파라미터 K를 잘못 설정하면 복원 품질이 급격히 저하됩니다.
한계 확인:
- PSF 의존성: PSF와 K값을 모두 정확히 알아야 최적 복원 가능
- Blind Deblurring 불가: 실제 환경에서 PSF를 정확히 알기 어려움
- 비균일 블러 처리 불가: 초점 오류·렌즈 수차 등 공간 변이 블러에 적용 불가
왜 DPIR인가:
Gaussian 블러 + 노이즈 복원에 특화된 Plug-and-Play 방식으로,
PSF 없이 데이터 기반 denoiser(DRUNet)를 반복 적용하여 복원합니다.
Half-Quadratic Splitting(HQS) 알고리즘으로 데이터 충실도와 prior를 교대 최적화합니다.
| 방법 | PSNR (dB) | SSIM | 특징 |
|---|---|---|---|
| 블러 (기준선) | 24.38 | 0.6380 | 입력 |
| Wiener Filter | 26.95 | 0.7225 | PSF·K값 필요 |
| DPIR (DL) | 27.52 | 0.7652 | 데이터 기반, PSF 불필요 |
Wiener 대비 DPIR: +0.57 dB / +0.0427 SSIM
"PSF를 정확히 알고 최적 K값을 사용한 Wiener Filter(26.95 dB)보다,
데이터에서 학습한 DPIR(27.52 dB)이 더 높은 복원 품질을 달성했습니다.
특히 SSIM에서 +0.0427의 개선은 구조적 디테일 보존 측면에서 의미 있는 차이라고 생각합니다."
- 한계 1: 단일 이미지 실험 — 대규모 데이터셋에서 일반화 성능 미검증
- 한계 2: 사전학습 모델 추론만 사용 — 도메인 특화 fine-tuning 미적용
- 한계 3: 실시간 처리 미최적화 — HQS 반복(iter=24)으로 추론 속도 제한
- 방향 1: Diffusion Model 기반 복원 (DiffPIR) — 생성 모델을 prior로 활용
- 방향 2: Blind Deblurring을 위한 PSF 자동 추정 모듈
├── wiener-filter/
│ └── wiener-filter.cpp # C++ Wiener Filter 구현 (OpenCV DFT)
├── project/
│ └── phase1.py # 실험 파이프라인 (이미지 생성 + Wiener)
│ └── phase2.py # 딥러닝 파이프라인 (DPIR)
├── images/
│ ├── original.png # 원본 (Set12 #08, Lena)
│ ├── deg.png # 블러+노이즈 이미지
│ └── ker.png # PSF 커널 시각화
├── results/
│ ├── wiener_restored.png # Wiener 복원 결과
│ └── dpir_restored.png # DPIR 복원 결과
└── README.md
- Zhang et al., "Plug-and-Play Image Restoration with Deep Denoiser Prior" (IEEE TPAMI 2021) — DPIR
- Gonzalez & Woods, "Digital Image Processing" — Wiener Filter
- Set12 Benchmark Dataset (cszn/FFDNet)
| 항목 (Item) | 내용 (Description) |
|---|---|
| Set | 12 Lena, |
| 블러 (Blur) | Gaussian PSF ( |
| 노이즈 (Noise) | Gaussian noise ( |
| 구현 (Implementation) | C++ OpenCV 4.12 / Python 3.12 + PyTorch |