이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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

이 예제에서는 블라인드 디컨벌루션을 사용하여 영상을 디블러 처리하는 방법을 보여줍니다. 블라인드 디컨벌루션 알고리즘은 왜곡(블러 처리와 잡음)에 대한 정보를 알 수 없는 경우에 유용할 수 있습니다. 이 알고리즘은 영상과 점 확산 함수(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');

2단계: 블러 처리 시뮬레이션하기

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

PSF = fspecial('gaussian',7,10);
Blurred = imfilter(I,PSF,'symmetric','conv');
imshow(Blurred)
title('Blurred 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')

두 번째 복원 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')

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

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

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')

첫 번째 복원에서 재생성된 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')

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

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

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

이 예제에서는 PSF에 제약 조건을 추가로 지정하는 방법을 보여줍니다. 아래 함수 FUN은 deconvblind가 다음 반복에 사용할 수정된 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 = 2와 P2 = 2를 파라미터로 설정하면 OVERPSF의 값 공간의 크기가 실제 PSF와 사실상 동일하게 됩니다. 따라서 결과로 생성된 JFPF는 올바른 크기의 PSF를 사용한 디컨벌루션 결과와 유사합니다. 4번째 단계에서는 FUN을 호출하지 않고 JP를 사용하지 않습니다.

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

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

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

참고 항목

| | |

관련 항목