본문 바로가기

강의

[OpenCV] 조명(Lighting)의 영향을 제거하는 방법

영상에 있어서 조명의 영향은 영상처리에 상당히 많은 영향을 끼칩니다. 좋은 조명의 조건이라면 당연히 좋은 퀄러티의 결과물을 얻을 수 있겠지만 조명이 어둡다거나 특히 그라데이션 조명을 받았을 경우 에러를 일으키는 요소가 되기도 합니다. 본 강의에서는 그라데이션 조명을 받은 영상이 있을 때 조명의 영향을 최소화 하자는 것이 목표입니다. Image Code 를 연구하다보니 Image Code 의 예를 들어 설명하였지만 여기에 국한되는 문제가 아니라 다른 분야에도 해당하는 문제입니다. (예: 문자인식)

저의 연구실 정철호 박사과정 선배님께서 연구하신 자료 중에 Preprocessing(전처리)에 촛점을 맞추고 있습니다. 전처리 과정중 평균 3.6% 해당하는 샘플들이 실패하여 Postprocessing 에 가보지도 못하고 열외되는 현상이 발생하는데요.


저는 이 3.6% 라는 실패율을 줄이는데 촛점을 맞추고 있습니다.


실패가 일어나는 원인들을 살펴보면 그라데이션 조명 상태에서 입력받은 이미지들이었는데요.

그라데이션 조명 상태에서는 어떤 방법으로 이진화를 하려고 해도 Image Code 영역부분에 Case 1 과 Case 2 와 같은 문제가 발생하고 있음을 발견할 수 있었습니다. Case 1 의 경우 배경과 연결된 성분이 발생하여 Image Code 영역과 배경을 분리해 내지 못해는 문제가 발생하였고 Case 2 의 경우 배경과 Image Code 를 분리 했으나 Image Code 의 형태가 손상되어 추출해내지 못하는 문제가 발생하였습니다.


어떻게 이 문제를 해결 할 수 있을지에 대해서 고민하고 위와 같은 가설을 세워보았습니다. 원본 영상으로부터 조명 채널을 분리해낸다면 역 조명을 쏘아주어서 좋은 퀄리티의 영상을 얻을 수 있지 않을까 하는 가설을 세웠습니다.


Color Space 모델에는 다양한 모델이 있는데 그중 LAB 모델은 Lightness 를 가장 잘 분리해 낼수 있어 LAB 모델을 사용하였습니다. (검증 혹은 Ref. 자료가 부족한 부분이기도 합니다.)


LAB Color space는 1976년 CIE에 의해서 정의, uniform color space 중의 하나이다.
Lab의 각 값은 다음과 같이 계산되고 그 의미는, L:밝기
a : +이면 RED 색상의 정도를, -이면 GREEN의 색
b: +이면 YELLOW의 색상정도를 B :-이면 BLUE의 생상정도를 나타낸다

Lab Color : 이미지의밝기와색상정보를이용하여컬러를표시, L(Lightness : 밝기), a(Red 와Green의컬러정보), b(Blue와Yellow 의컬러정보)를포함하고있음.

RGB 모델을 LAB 로 변환하는 공식은 위와 같습니다.


이렇게 Lightness 채널을 분리해 냄으로서 좌측 상단과 같은 이미지를 얻을 수 있습니다.
여기에서 조명의 상태를 얻어내기 위해 Median Filter 과정을 거치게 되는데 위 슬라이드는 Radius 값을 변화시켜가며 처리해본 결과입니다. Radius 값을 100으로 하면 실제와 가장 근사한 조명상태를 얻어낼 수 있음을 볼 수 있습니다. 실질적으로는 20 이상 ~ 50 이하여도 충분한 결과를 보여줍니다.

전체 프로세스를 다이어그램으로 다시 정리하자면 원본 영상을 입력 받아 Light Removal 과정을 수행합니다. Light Removal 과정에는 RGB 모델을 LAB 모델로 변환을 하여 Lightness 채널을 분리해 내고 Median Filter 과정을 거쳐 조명의 상태를 알아낸 다음 반전 시켜 역조명 채널을 만들어 냅니다. 이를 원본 영상에 합성하여 Clear 한 Image 를 만들어 내는 것입니다.


맨 좌측에서 보시는 바와 같이 그라데이션 조명 상태에서 찍은 원본 Image Code 입니다. Preprocessing 과정에서 실패가 일어나는 가장 대표적인 사례의 장본인이라고 볼수 있는데 어떠한 알고리즘으로 Threshold 값을 주더라도 Case 1, Case 2 와 같은 경우(붉은색 사격형 표시 부분)가 발생하여 Image Code 를 얻어 낼 수 없습니다. Local Threshold(Block Binarization) 를 하더라도 Image Code 내부에 생기는 노이즈, 배경에 생기는 노이즈 등 비슷한 문제가 발생합니다.

다음은 Light Removal 과정입니다. RGB 모델을 LAB 모델로 변환하여 Lightness 채널을 분리해 냅니다. Median Filter 을 적용하여 Gradation 조명의 정보를 얻어내고 이를 반전하여 반전된 조명을 얻어냅니다.

이를 원본 영상과 Composition 하여 맨 우측과 같은 이미지를 만들어 냅니다. 여기에 Thresholding 을 하면 맨 좌측과 같은 Clear 한 이진화 영상을 얻게 됩니다.

다시한번 정리 하자면, 맨 좌측에는 그라데이션 조명이 먹은 상태의 원본 이미지들입니다.

그 다음 중간에는 각각 좌측의 원본 이미지들을 이진화 한 것인데 어떤 임계값을 사용하더라도 붉은색 사격형 부분과 같은 Case 1, Case 2 중 하나 이상의 문제가 발생하여 실패하게 됩니다. 맨 우측에는 지금까지 제안한 조명 제거법으로 조명을 제거한후 Histogram 의 최대-최소 평균으로 Global Thresholding 를 한 이진화 이미지 입니다. Image Code 영역이 정확하게 추출되었음을 볼 수 있습니다.

  • 노형석 2007.12.03 20:36

    항상 빛에 대한 이미지 변형을 어떻게 해결해야하는지에 대해서

    고민이 많았는데..

    이런 방법이 있었군요..

    세상엔 대단한 사람이 너무 많아요 ㅠㅠ

    잘 보았습니다.^^

    한가지 궁금한게 Histogram 의 최대-최소 평균이 정확히 무슨 뜻인지 모르겠어요..

    그래이 스케일에서 영상의 히스토그램에서 최대값과 최소값의 평균을 임계값으로 사용한다는 뜻인가요?

    예를들어..

    최소값이 0이고 최대값이 255면 128을 임계값으로 사용하겠다는 뜻인가요?

  • BlogIcon t9t9 2007.12.26 00:15 신고

    histogram 을 구하게 되면 가로축 0~255 사이에서 각각 값의 분포가 나오게 되는데
    처음으로 분포가 나오기 시작하는 값이 min 값이라고 보시면 됩니다.
    마지막 분포가 나온 값이 max 값.

    Histogram-stretch 를 보시면 도움이 되실 거에요.

  • huyk 2008.07.24 14:05

    영상처리에 조명정도가 늘 거슬렸습니다.

    한수 배우고 갑니다. 좋은정보 감사드립니다.

  • 김정호 2008.08.07 20:52

    이 내용에 관련해서 논문이나 좀 더 심도 있는 자료를 구할 수 있을까요? ^^

    kimsmap@naver.com이나 이 게시판에 올려주셔도 좋구요...

    부탁드리겠습니다 ^^;ㅋ

  • 이병환 2008.12.19 10:53

    좋은 내용 잘 봤습니다. 그런데 의문점이 있어 질문 드립니다.

    라이팅 분리후 미디언필터를 사용한다고 말씀하셨는데 미디언필터로 이미지를 처리하면 미디언필터는 선형정리가 아니기 때문에 원본으로 회복되지 못하는걸로 알고있는데요...

    Composition시 원본 조명 복원부분의 처리는 어떻게 하신건가요?

    단순히 미디언 필터의 처리후 저런 결과가 가능한지 궁금합니다.

    그리고 미디언 필터를 이용해 구한 리버스 이미지와 단순히 혼합한 결과를 라이팅으로 활용해 전환하신건가요?

    ^^ 너무 구체적인것을 질문드리는거 같아 민망하네요.

    예전에 논문쓸때 엄청 고생한 경험이 있어 질문드립니다. ^^

  • 곰장 2010.04.15 11:12

    한가지 의문점이 있어 질문 드립니다.

    알려주신방법을 사용해보니 아주 유용하다고 생각드는데요... 여러 단계중 최종 Composition 하는 단계에서 처리를 어떻게 해야할지 고민이 있어 질문드립니다.

    저같은 경우 그냥 cvAdd로 원L 채널과 반전L 채널을 더하였는데. 그러면 결과 영상이 전체적으로 밝이지고 영향이 좀 있더라구요...

    티구티구님께서 Composition 단계를 어떻게 처리하셨느지 조언부탁드립니다.

  • 2016.07.02 20:55

    비밀댓글입니다