Wiener Deconvolution Filter
1 개요
Blur 가 발생한 이미지를 복원하는 알고리즘 또는 Convolution 의 역연산 알고리즘.
2 알고리즘 상세 설명
H : 푸리에 변환된 Point Spread Function Kernel
H* : 푸리에 변환된 Point Spread Function Kernel의 Conjugation
Y : 푸리에 변환된 대상 이미지
2.1 Motion Blur
해당 Motion Blur 는 이미지 전반에 걸친 선형 모션 블러를 일컬으며 Blur(Convolution), Deblur(Deconvolution) 모두를 수행할 수 있습니다.
| Source Image | Motion Blur Image | Restored Image |
|---|---|---|
![]() |
![]() |
![]() |
위 Motion Blur Image 와 같이 이미지에 임의로 Motion Blur 를 적용할 수 있으며, Motion Blur가 적용된 이미지를 Restored Image 와 같이 복원할 수 있습니다.
2.2 Focal Blur
해당 Focal Blur는 Lens Blur 와 같은 의미로 사용되어지며 이미지에 촛점이 맞지 않아 발생하는 블러를 일컫습니다. 촛점이 센서 앞으로 맺히는 지 뒤에 맺히는 지에 따라 Front Focal, Back Focal 등으로 구분되지만, 해당 모드 설정 시 이상적인 Neutral Focal 기준으로 동작합니다. 그러나 Lens에 따라 발생할 수 있는 구면수차 조정 SA(Spherical Aberration) Tunning 기능을 활용하여 Neutral Focal 이 아닌 블러도 보정할 수 있습니다.
| Source Image | Focal Blur Image | Restored Image |
|---|---|---|
![]() |
![]() |
![]() |
Motion Blur 와 비슷한 조작으로 Convolution, Deconvolution 동작이 가능합니다.
2.3 User Defined
해당 모드는 사용자가 사전에 Blur 의 형태 또는 PSF Kernel 을 알고있는 경우 직접 입력을 통해 실행할 수 있는 기능입니다.
| User Defined Psf | Blur Image | Deblur Image |
|---|---|---|
![]() |
![]() |
![]() |
Convolution Filter 와 비슷한 조작으로 Kernel 입력과 저장 및 불러오기 동작이 가능합니다.
3 파라미터 설정 및 사용 방법
3.1 Motion, Focal Blur 공통 파라미터
| 멤버함수 | 파라미터 | 설 명 | ||
|---|---|---|---|---|
| SetLength | double | f64Length | IN | Blur Length(Unit : Pixel) |
| SetOperationType | EOperationType | eOperationType | IN | 연산 타입 |
| SetPSFType | EPSFType | ePSFType | IN | PSF 타입 |
| SetSNR | double | f64SNR | IN | 신호 대 잡음비 값 |
-
f64Length- Default Value : 0.5- Motion, Focal Blur PSF Kernel의 길이입니다. (Unit : Pixel)
-
f64SNR- Default Value : 0.0001, Recommended Value : 0.01, 0.001, 0.0001- 신호 대 잡음비 값입니다.
- Deconvolution 동작 시 사용할 수 있으며, 값에 따라 복원 이미지의 품질에 변화가 있습니다.
-
eOperationType- Default Value : EOperationType_Convolution- EOperationType_Convolution : Blur 적용
- EOperationType_Deconvolution : Deblur 적용
-
ePSFType- Default Value : EPSFType_Motion- EPSFType_Motion : Motion Blur 적용
- EPSFType_Focal : Lens Blur 적용
- EPSFType_UserDefined : 사용자 정의 Point Spread Function 적용
3.2 Motion Blur 파라미터
| 멤버함수 | 파라미터 | 설 명 | ||
|---|---|---|---|---|
| SetAngle | double | f64Angle | IN | Motion Blur 각도(Unit : Degree) |
| EnableWeightedKernel | bool | bWeightedKernel | IN | 가중치 커널 설정 적용 여부 |
-
f64Angle- Default Value : 0.5, Recommended Value : 0 ~ 180(Degree)- 선형 블러 커널의 각도 파라미터입니다.
-
bWeightedKernel- Default Value : truetrue: 직선이 지나는 모든 Pixel에 가중치를 적용하여 Kernel을 생성합니다.
| PSF Kernel | PSF Weighted Kernel |
|---|---|
![]() |
![]() |
3.3 Focal Blur 파라미터
| 멤버함수 | 파라미터 | 설 명 | ||
|---|---|---|---|---|
| EnableSATuning | bool | bSATuning | IN | 구면 수차 적용 여부 |
| SetIntensity | double | f64Intensity | IN | Intensity 설정자 |
| SetCutOffRatio | double | f64CutOffRatio | IN | CutOffRatio 설정자 |
-
bSATuning- Default Value : falsetrue: 구면 수차를 보정할 파라미터를 설정합니다.
-
f64Intensity- Default Value : 0, Recommended Value : -0.5 ~ 0.5- Kernel 의 중앙부 대비 가장자리의 Weight 비중 강도를 설정합니다.
-
f64CutOffRatio- Default Value : 0, Recommended Value : 0 ~ 1- Kernel 의 가장자리로부터 중앙까지 Intensity를 적용할 비율을 설정합니다.
| Neutral | Back | Front |
|---|---|---|
![]() |
![]() |
![]() |
3.4 User Difned PSF
SetKernel 함수를 통해 사용자 정의 PSF 를 입력하여 실행합니다. PSF 의 가로, 세로 크기를 지정하고 각 위치에서 Weight 값들의 상대적인 크기를 입력합니다. PSF 의 모든 Weight 값들은 합이 1인 정규화 프로세스를 거쳐 연산에 적용됩니다.
- Convolution Filter 참고
4 예제 코드
CWienerDeconvolutionFilter wiener;
CFLImage fliSourceImage;
wiener.SetSourceImage(fliSourceImage);
CFLImage fliDestinationImage;
wiener.SetDestinationImage(fliDestinationImage);
/*
Motion Blur(Convolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Convolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_Motion);
wiener.SetAngle(33.25);
wiener.SetLength(6.7);
wiener.Execute();
/*
Motion Blur(Deconvolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Deconvolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_Motion);
wiener.SetSNR(0.00001);
wiener.Execute();
/*
Focal Blur(Convolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Convolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_Focal);
wiener.SetLength(15.2);
wiener.Execute();
/*
Focal Blur(Deconvolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Deconvolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_Focal);
wiener.SetSNR(0.0001);
wiener.Execute();
/*
User Defined(Convolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Convolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_UserDefined);
CFLArray<CFLArray<CFLArray<float>>> flarrKernel;
flarrKernel.PushBack(CFLArray<CFLArray<float>>());
flarrKernel[0].PushBack(CFLArray<float>());
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0][0].PushBack(5.000000f);
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0][0].PushBack(0.000000f);
flarrKernel[0].PushBack(CFLArray<float>());
flarrKernel[0][1].PushBack(0.000000f);
flarrKernel[0][1].PushBack(0.000000f);
flarrKernel[0][1].PushBack(0.000000f);
flarrKernel[0][1].PushBack(7.000000f);
flarrKernel[0][1].PushBack(0.000000f);
flarrKernel[0][1].PushBack(0.000000f);
flarrKernel[0][1].PushBack(0.000000f);
...
flarrKernel[0].PushBack(CFLArray<float>());
flarrKernel[0][6].PushBack(0.000000f);
flarrKernel[0][6].PushBack(0.000000f);
flarrKernel[0][6].PushBack(0.000000f);
flarrKernel[0][6].PushBack(5.000000f);
flarrKernel[0][6].PushBack(0.000000f);
flarrKernel[0][6].PushBack(0.000000f);
flarrKernel[0][6].PushBack(0.000000f);
wiener.SetKernel(flarrKernel);
wiener.Execute();
/*
User Defined(Deonvolution Type) 적용 예시
*/
wiener.SetOperationType(CWienerDeconvolutionFilter::EOperationType_Deconvolution);
wiener.SetPSFType(CWienerDeconvolutionFilter::EPSFType_UserDefined);
wiener.SetSNR(0.0001);
wiener.Execute();













