이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
블라인드 디컨벌루션 알고리즘을 사용하여 영상을 디블러 처리하기
이 예제에서는 블라인드 디컨벌루션을 사용하여 영상을 디블러 처리하는 방법을 보여줍니다. 블라인드 디컨벌루션 알고리즘은 왜곡(흐릿함과 잡음)에 대한 정보를 알 수 없는 경우에 유용할 수 있습니다. 이 알고리즘은 영상과 점 확산 함수(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단계: 흐릿함(blur) 시뮬레이션하기
카메라 모션이나 초점 부족 등으로 인해 흐릿해질 수 있는 실생활 영상을 시뮬레이션합니다. 이 예제에서는 실제 영상에 가우스 필터를 컨벌루션(imfilter
사용)하여 흐릿함을 시뮬레이션합니다. 가우스 필터는 점 확산 함수 PSF
로 표현됩니다.
PSF = fspecial("gaussian",7,10); Blurred = imfilter(I,PSF,"symmetric","conv"); imshow(Blurred) title("Blurred Image")
3단계: 흐릿한 영상을 다양한 크기의 PSF를 사용하여 복원하기
실제 PSF 크기를 아는 것이 얼마나 중요한지 설명하기 위해 이 예제에서는 복원을 세 번 수행합니다. 각 복원을 수행할 때마다 균일한 배열(1로 구성된 배열)에서 PSF 재구성이 시작됩니다.
J1
과 P1
로 기술되는 첫 번째 복원에서는 축소된 크기의 배열 UNDERPSF
를 PSF의 초기 추측값으로 사용합니다. UNDERPSF 배열의 크기는 각 차원에서 실제 PSF보다 4픽셀씩 짧습니다.
UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title("Deblurring with Undersized PSF")
J2
와 P2
로 기술되는 두 번째 복원에서는 실제 PSF의 크기보다 각 차원에서 4픽셀씩 더 긴, 1로 구성된 배열 OVERPSF
를 초기 PSF로 사용합니다.
OVERPSF = padarray(UNDERPSF,[4 4],"replicate","both"); [J2,P2] = deconvblind(Blurred,OVERPSF); imshow(J2) title("Deblurring with Oversized PSF")
세 번째 복원 J3
과 P3
에서는 실제 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인 P3
은 P1
과 P2
중간입니다. 배열 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를 각 차원에서 픽셀 수 P1
과 P2
만큼 자른 후 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]);
익명 함수 FUN
은 deconvblind
에 마지막에 전달됩니다. 함수 FUN
에 파라미터를 추가로 제공하는 방법은 MATLAB 수학 문서에서 함수를 파라미터화하기 섹션을 참조하십시오.
이 예제에서 초기 PSF인 OVERPSF
는 실제 PSF보다 4픽셀 더 큰 크기를 가집니다. FUN
에서 P1 = 2
와 P2 = 2
를 파라미터로 설정하면 OVERPSF
의 값 공간의 크기가 실제 PSF와 사실상 동일하게 됩니다. 따라서 결과로 생성된 JF
와 PF
는 올바른 크기의 PSF를 사용한 디컨벌루션 결과와 유사합니다. 4번째 단계에서는 FUN
을 호출하지 않고 J
및 P
를 사용하지 않습니다.
[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title("Deblurred Image")
확장된 크기를 가진 초기 PSF인 OVERPSF
를 제약 함수 FUN
없이 사용할 경우, 결과로 생성되는 영상은 3단계에서 생성된 만족스럽지 못한 결과인 J2
와 유사할 수 있습니다.
참고로, FUN
앞에 지정되지 않은 모든 파라미터(예: 이 예제에서는 DAMPAR
, READOUT
)는 자리 표시자([]
)를 사용하지 않고도 생략할 수 있습니다.