Line-wise Pattern Noise


라인 스캔 카메라는 라인 CCD을 구성하는 각 pixel의 불균일로 인하여 스캔 방향(여기서는 vertical)을 따라 Fixed Pattern Noise(FPN) 가 생긴다. 여기까지는 누구나 아는 상식. 이를 해결하기 위해 각 pixel 응답을 1차 함수로 근사한 보정알고리즘을 사용한다. 말이야 쉽지만 calibration data를 가지고도 완벽히 처리하기는 쉽지 않은가 보다.(정말?) 그뿐만이 아니다. 실제 영상을 분석해보면 vertical 방향뿐만 아니라 horizontal 방향을 따라서도 미약하긴 하나 어떤 패턴이 관측된다. 이 값을 rms 값으로 환산해보면 1bit 이하의 무시할 수 있을만큼 작은 레벨이나 constrast 보정 등을 통해 gain 을 준 이미지에서는 눈에 띌 수도 있나보더군. 완전히 랜덤한 temporal noise는 적당한 수준에서는 눈에 별로 거슬리지 않는데 반해, 일정한 트렌드를 갖는 변화는 그보다 10배 이하의 낮은 파워로도 상대적으로 훨씬 지각되기 쉽다. 이 문제는 CCD 각 라인마다 수행되는 dark pixel을 이용한 dark current correction 기능의 오차로 인한 것으로 각 pixel 간의 responsivity 차이로 인해 생겨 정적인 특성을 나타내는 vertical FPN과는 달리 그 정도를 예측 할 수 없다. 즉 영상에 랜덤한 holizontal line offset 이 더해지는 형태의 잡음이란거지. 문제의 원인과 양태를 파악했으니 이제 해결에 들어가 볼까... 아 내가 왜 이런 문제를 풀고 있어야 하지. 본래 땜쟁이라 이런 고상한 프로세싱에 익숙하지 않으니 허접해도 뭐 그냥 눈감아주시고...요리할 재료부터 정리해보자.


S_11+D_1   S_12+D_1   S_13+D_1 ....... S_1n+D_1
S_21+D_2   S_22+D_2   S_23+d_2 ....... S_2n+D_1
S_31+D_3   S_32+D_3   S_33+d_3 ....... S_3n+D_1
.
.
.
S_m1+D_m   S_m2+D_m   S_m3+D_m .... S_mn+D_m


S_xy 는 영상을 이루는 각 픽셀의 신호, D_x 는 horizontal offset noise 이다. 목표는 위의 매트릭스만을 가지고 D_x 를 모두 찾는 것! 그래서 D_x를 모두 발라내고 S_xy만을 남겨야 한다. 문제를 정의하자 마자 바로 계시가 내려왔다. 아는게 별로 없으니 사고의 폭도 그만큼 좁겠지. 간단히 한 라인을 모두 더한다면 영상에 의한 dependency를 제거하고 각 D_x 를 분리해 낼 수 있지 않을까. 다음과 같은 행렬로 변환하는 거다. 편의상 S_x1+S_x2+S_x3.... 을 S_x 이라 하면,


S_1 + n*D_1
S_2 + n*D_2
S_3 + n*D_3
.
.
.
S_m+n*D_m


S_x 은 첫번째 가로 라인의 얻고자 하는 영상 신호를 모두 더한 값이다. 여기서 무언가를 몽창 더한 값들의 통계적 특성을 이용하면 되는데, 영상은 절대로 특정 한 라인만 밝거나 어두울 수 없다. 즉 영상 중에 가는 일직선이 있다 하더라도 광학적 한계에 의해 한 픽셀에만 맺히지 않고 주변 픽셀로 퍼지게 되며, 영상 좌표에 대해서도 기울어져 있기 때문에 그 라인을 모두 더한 값 S_x 에는 부드러운 변화만이 남게된다. 따라서 S_1, S_2, S_3... S_n 의 배열은 low frequency 가 된다. 그러나 D_x 는 그와는 조금 다른 분포를 갖는데, 완전히 랜덤하다고 가정하면(발생 원인을 볼때 가장 손쉽게 적용할 수 있는 모델), 시그널 파워가 모든 주파수에 골고루 퍼져있다. 그림으로 정리해보자.


이제 해결의 실마리가 보인다. S_x 와 같은 주파수를 점유하고 있는 부분까지 모두 분리해낼 수 없겠지만, 필터링을 통해 D_x 중에 높은 주파수 성분은 끄집어 내는 것이 가능하다. 가설은 여기까지. 앞서 주저리주저리 늘어놓은 것들이 대충이나마 맞아들어가는지 이제 검증을 해보자. 원영상과 필터링된 영상간의 위상 일치가 중요하므로 linear phase delay 특성을 갖는 32tap FIR 필터로 돌렸다.


빨간색 선, low pass 필터링된 신호는 S_x 에 더해 D_x 의 저주파 성분만을 담고 있다. 일단은 이 신호가 우리가 가고자 하는 이상에 가장 가까우니까 S_x + D_x로 부터 이 값을 빼주어 각 라인의 원하는 값과 실제 값과의 차이를 구한다. 그 결과를 원래 영상의 각 라인으로부터 빼주면 영상이 가지고 있는 가로줄 노이즈의 고주파 성분을 제거 할 수 있다. 그렇다면 저주파 잡음은? 안타깝게도 이 방법으로는 저주파 성분을 분리해낼 수 없다. 그렇다고 너무 실망하진 말자. 눈에 거슬리는 성분은 대부분 고주파니까. 이제 최종 결과 확인이다.


세로줄은 그대로 놔두고 가로줄만을 보정한 결과다. 왼쪽 영상에 있던 희미한 가로줄들이 거의 사라졌다. 원래 있던 가로줄이라고 해봤자. local area histogram equalization으로 지정해놓고 무지무지 확대해야 어두운 부분에서 보일락 말락하는 수준으로 문제라기보다는 어쩔 수 없는 하드웨어적인 한계에서 비롯된 것이다. 어쨌든 그마저도 이렇게 간단한 계산으로 해결이 되니 제발 조용히 있자. 여기저기서 호들갑을 떨어대는 통에 정신이 하나도 없네. 이제 정리해야지. 이러한 방법을 쓰는데 가장 중요한 포인트는 cut-off 주파수를 얼마로 잡느냐이다. 너무 높게잡으면 D_x 의 일부만을 제거할 수 있고 너무 낮게 잡으면 D_x 는 많이 날릴수 있겠지만, S_x 까지 깍아먹어서 결과영상이 세로로 일렁이게 된다. 더 나아가서는 영상으로부터 추출된 광학계의 성능 파라메터를 고려한 최적화, S_x 의 high freq 를 유발하는 광포화영역에 대한 제외처리, 특정 영역에 웨이트를 준다던가 등등의 복잡한 기법으로 다듬으면 더 좋겠다.

그런데 이 글은 어떤 독자층을 대상으로 썼지? -_-;;; 친절한척 늘어놓았으나 아무도 도움이 안될 글자들이로군.

by strin | 2006/10/19 18:31 | the domain of nerds | 트랙백 | 덧글(2)

트랙백 주소 : http://strin.egloos.com/tb/2765979
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 로딘 at 2006/10/20 12:43
학교에서 DSP 듣는 덕에 적당히 알아들었습니다; 랄까 이론만 배우고 실습이 없어서 알동말동했는데 저렇게 쓰는거였군요.
(사실 얼마없는 실습시간에 모조리 빠져버린 날라리 학생인지라. -_-)
Commented by strin at 2006/10/21 00:54
S_xy+d_x 이미지를 그대로 FFT 하면 그 두 신호 모두 전주파수 대역에 펼쳐져 있어 대역 필터로 분리할 수 없지만, 가로 따라 평균을 내면 S_x 는 저주파 대역으로 이동하고 d_x 는 그대로라 대역 필터로 분리 할 수 있게 되죠. 여러가지가 함께 섞여들어간 현실에서 원하는 측면 만을 보다 명확히 보기 위한 시각을 찾아내는 것이 포인트.... 어제 밤에 자려고 누워있는데, 주제 전달이 약했다 싶었네요. 그림 하나를 더 넣을껄 하면서 잤어요 -_-;;
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지    |    다음 페이지 ▶