Main Content

블라인드 디컨벌루션 알고리즘을 사용하여 영상을 디블러 처리하기

이 예제에서는 블라인드 디컨벌루션을 사용하여 영상을 디블러 처리하는 방법을 보여줍니다. 블라인드 디컨벌루션 알고리즘은 왜곡(흐릿함과 잡음)에 대한 정보를 알 수 없는 경우에 유용할 수 있습니다. 이 알고리즘은 영상과 점 확산 함수(Point-Spread Function, PSF)를 동시에 복원합니다. 감쇠를 고려한 고속 Richardson-Lucy 알고리즘이 각 반복에서 사용됩니다. 추가적으로 광학 시스템(예: 카메라) 특성을 입력 파라미터로 사용하여 영상 복원 품질을 높일 수도 있습니다. PSF 제약 조건은 사용자 지정 함수를 통해 지정할 수 있습니다.

1단계: 영상 읽어 들이기

회색조 영상을 작업 공간으로 읽어 들입니다. deconvblind 함수는 임의 차원의 배열을 처리할 수 있습니다.

I = imread("cameraman.tif");
figure;imshow(I);title("Original Image");
text(size(I,2),size(I,1)+15, ...
    "Image courtesy of Massachusetts Institute of Technology", ...
    "FontSize",7,"HorizontalAlignment","right");

Figure contains an axes object. The axes object with title Original Image contains 2 objects of type image, text.

2단계: 흐릿함(blur) 시뮬레이션하기

카메라 모션이나 초점 부족 등으로 인해 흐릿해질 수 있는 실생활 영상을 시뮬레이션합니다. 이 예제에서는 실제 영상에 가우스 필터를 컨벌루션(imfilter 사용)하여 흐릿함을 시뮬레이션합니다. 가우스 필터는 점 확산 함수 PSF로 표현됩니다.

PSF = fspecial("gaussian",7,10);
Blurred = imfilter(I,PSF,"symmetric","conv");
imshow(Blurred)
title("Blurred Image")

Figure contains an axes object. The axes object with title Blurred Image contains an object of type image.

3단계: 흐릿한 영상을 다양한 크기의 PSF를 사용하여 복원하기

실제 PSF 크기를 아는 것이 얼마나 중요한지 설명하기 위해 이 예제에서는 복원을 세 번 수행합니다. 각 복원을 수행할 때마다 균일한 배열(1로 구성된 배열)에서 PSF 재구성이 시작됩니다.

J1P1로 기술되는 첫 번째 복원에서는 축소된 크기의 배열 UNDERPSF를 PSF의 초기 추측값으로 사용합니다. UNDERPSF 배열의 크기는 각 차원에서 실제 PSF보다 4픽셀씩 짧습니다.

UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title("Deblurring with Undersized PSF")

Figure contains an axes object. The axes object with title Deblurring with Undersized PSF contains an object of type image.

J2P2로 기술되는 두 번째 복원에서는 실제 PSF의 크기보다 각 차원에서 4픽셀씩 더 긴, 1로 구성된 배열 OVERPSF를 초기 PSF로 사용합니다.

OVERPSF = padarray(UNDERPSF,[4 4],"replicate","both");
[J2,P2] = deconvblind(Blurred,OVERPSF);
imshow(J2)
title("Deblurring with Oversized PSF")

Figure contains an axes object. The axes object with title Deblurring with Oversized PSF contains an object of type image.

세 번째 복원 J3P3에서는 실제 PSF와 크기가 완전히 동일한, 1로 구성된 배열 INITPSF를 초기 PSF로 사용합니다.

INITPSF = padarray(UNDERPSF,[2 2],"replicate","both");
[J3,P3] = deconvblind(Blurred,INITPSF);
imshow(J3)
title("Deblurring with INITPSF")

Figure contains an axes object. The axes object with title Deblurring with INITPSF contains an object of type image.

4단계: 복원된 PSF 분석하기

세 번의 모든 복원 작업에서도 PSF가 생성됩니다. 다음 그림에서 재구성된 PSF를 분석하여 초기 PSF의 올바른 크기를 판단해 볼 수 있습니다. 실제 PSF인 가우스 필터에서는 중앙(흰색)에 큰 값이 분포하고 테두리(검은색)로 갈수록 값이 작아집니다.

figure;
subplot(2,2,1)
imshow(PSF,[],"InitialMagnification","fit")
title("True PSF")
subplot(222)
imshow(P1,[],"InitialMagnification","fit")
title("Reconstructed Undersized PSF")
subplot(2,2,3)
imshow(P2,[],"InitialMagnification","fit")
title("Reconstructed Oversized PSF")
subplot(2,2,4)
imshow(P3,[],"InitialMagnification","fit")
title("Reconstructed true PSF")

Figure contains 4 axes objects. Axes object 1 with title True PSF contains an object of type image. Axes object 2 with title Reconstructed Undersized PSF contains an object of type image. Axes object 3 with title Reconstructed Oversized PSF contains an object of type image. Axes object 4 with title Reconstructed true PSF contains an object of type image.

첫 번째 복원에서 재구성된 PSF인 P1은 제약 조건이 적용된 크기에 확실히 맞지 않습니다. 이 PSF는 테두리에서 신호 변동이 강합니다. 해당 영상 J1의 선명도는 흐릿한 영상 Blurred에 비해 전혀 개선되지 않았습니다.

두 번째 복원에서 재구성된 PSF인 P2는 경계가 상당히 매끄럽습니다. 이는 두 번째 복원이 크기가 더 작은 PSF를 다룬 것을 의미합니다. 해당 영상 J2는 흐릿함이 어느 정도 제거되었지만 링잉 현상으로 인해 상당히 손상되었습니다.

마지막으로, 세 번째 복원에서 재구성된 PSF인 P3P1P2 중간입니다. 배열 P3은 실제 PSF와 매우 유사합니다. 해당 영상 J3은 상당히 개선되었지만 링잉 현상으로 인해 여전히 손상되었습니다.

5단계: 복원 개선하기

복원된 영상 J3에서의 링잉 현상은 명암 대비가 두드러진 영역과 영상 테두리에서 발생합니다. 이 예제에서는 가중치를 지정하여 링잉 현상의 영향을 줄이는 방법을 보여줍니다. 블라인드 디컨벌루션 알고리즘은 영상과 PSF를 복원하는 동안 WEIGHT 배열에 따라 각 픽셀에 가중치를 적용합니다. 이 예제에서는 먼저 edge 함수를 사용하여 명암 대비가 "두드러진" 픽셀을 찾아 보겠습니다. 시행착오를 거쳐 이상적인 임계값 수준을 0.08로 결정했습니다.

WEIGHT = edge(Blurred,"sobel",.08);

영역을 넓히려면 imdilate를 사용하고 구조 요소 se를 전달하십시오.

se = strel("disk",2);
WEIGHT = 1-double(imdilate(WEIGHT,se));

또한 테두리 가까이에 있는 픽셀에 값 0을 할당합니다.

WEIGHT([1:3 end-(0:2)],:) = 0;
WEIGHT(:,[1:3 end-(0:2)]) = 0;
figure
imshow(WEIGHT)
title("Weight Array")

Figure contains an axes object. The axes object with title Weight Array contains an object of type image.

WEIGHT 배열을 사용하고 반복 횟수를 30으로 증가시킨 상태에서 deconvblind를 호출하여 영상을 복원합니다. 거의 모든 링잉 현상이 나타나지 않습니다.

[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT);
imshow(J)
title("Deblurred Image")

Figure contains an axes object. The axes object with title Deblurred Image contains an object of type image.

6단계: PSF 복원 시 추가 제약 조건 사용하기

이 예제에서는 PSF에 제약 조건을 추가로 지정하는 방법을 보여줍니다. 아래 함수 FUNdeconvblind가 다음 반복에 사용할 수정된 PSF 배열을 반환합니다.

이 예제에서 FUN은 PSF를 각 차원에서 픽셀 수 P1P2만큼 자른 후 0으로 채워 배열을 다시 원래 크기로 되돌리는 방식으로 PSF를 수정합니다. 이렇게 PSF를 수정해도 PSF의 가운데 값은 변경되지 않지만 PSF 크기가 2*P1 픽셀과 2*P2 픽셀만큼 효과적으로 줄어듭니다.

P1 = 2;
P2 = 2;
FUN = @(PSF) padarray(PSF(P1+1:end-P1,P2+1:end-P2),[P1 P2]);

익명 함수 FUNdeconvblind에 마지막에 전달됩니다. 함수 FUN에 파라미터를 추가로 제공하는 방법은 MATLAB 수학 문서에서 함수를 파라미터화하기 섹션을 참조하십시오.

이 예제에서 초기 PSF인 OVERPSF는 실제 PSF보다 4픽셀 더 큰 크기를 가집니다. FUN에서 P1 = 2P2 = 2를 파라미터로 설정하면 OVERPSF의 값 공간의 크기가 실제 PSF와 사실상 동일하게 됩니다. 따라서 결과로 생성된 JFPF는 올바른 크기의 PSF를 사용한 디컨벌루션 결과와 유사합니다. 4번째 단계에서는 FUN을 호출하지 않고 JP를 사용하지 않습니다.

[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title("Deblurred Image")

Figure contains an axes object. The axes object with title Deblurred Image contains an object of type image.

확장된 크기를 가진 초기 PSF인 OVERPSF를 제약 함수 FUN 없이 사용할 경우, 결과로 생성되는 영상은 3단계에서 생성된 만족스럽지 못한 결과인 J2와 유사할 수 있습니다.

참고로, FUN 앞에 지정되지 않은 모든 파라미터(예: 이 예제에서는 DAMPAR, READOUT)는 자리 표시자([])를 사용하지 않고도 생략할 수 있습니다.

참고 항목

|

관련 항목