Retinex 알고리즘은 영상의 contrast를 향상시키거나, sharpness를 증진시킬 때 많이 사용한다. 또한 픽셀값의 dynamic range가 큰 경우에 이것을 압축시켜 영상 데이터 전송에 따른 병목현상의 해소에 이용할 수 있다.

Retinex 알고리즘의 기본원리는 입력영상에 들어있는 배경성분을 제거하는 것이다.
1. 배경영상는  입력영상의 평균적인 영상로 생각할 수 있는데, 이것은 적당한 스케일(필터사이즈)의 가우시안 필터를 적용하여서 얻을 수 있다. 이 필터를 적용하면 입력영상에서 필터사이즈 보다도 작은 스케일은 무시하는 효과를 준다.
2. 입력영상의 반사성분(배경조명에 무관한)은 입력영상을 앞서 구한 배경영상으로 나누면 된다
3. Retinex 출력은 이 반사성분에 로그값을 취한 것이다. 이 로그값을 취하므로써 반사성분이 분포범위(=dynamic range)를 압축하는 효과를 얻는다( 원래 로그함수는 큰 수의 연산을 작은 수의 연산으로 바꾼다)
- 입력영상 = I(x, y) ;
- 가우시안 필터 = G(x, y) = A exp(-(x2 + y2 )/2σ2)
- 배경영상 = G(x, y)* I(x, y) = convolution;
- Retinex 출력 
   R(x, y) = log(반사성분)
             = log(입력영상/배경영상)
             = log(I(x, y)) - log(G(x, y)* I(x, y));


이처럼 하나의 스케일에 대해서 적용하는 경우를 SSR(single-scale retinex)알고리즘이라고 한다. 컬러영상의 경우에는 각각의 RGB채널에 대해서 알고리즘을 적용하면 된다.

Retinex 영상을 구할 때 하나의 스케일이 아니라 여러가지 스케일에 대해서 적용한 retinex 영상을 적절한 가중치를 주어서 합한 결과를 출력영상으로 사용할 수 있다. 이 경우가 MSR(multi-scale retinex)알고리즘이다.

  Rmsr(x,y) = i wiRssr(x,y) = i (가중치) * SSR.

이렇게 얻은  Retinex 영상은 적당한 offset과 stretching을 하여서 픽셀값이 [0,255]구간에 있게 조절한다. 이 과정은 Retinex 출력영상 픽셀의 평균값과 편차를 구하여서 분석할 수 있다.

컬러영상의 경우에 Retinex 출력영상은 전체적으로 그레이화되는 경향이 있어서 이것을 보완하기 위해서 아래의 추가적인 처리과정을 더 거친다.

   R'msr(x,y)_red = log(C* Ir/(Ir + Ig + Ib)) * Rmsr(x,y)_red ;
   R'msr(x,y)_gre = log(C* Ig/(Ir + Ig + Ib)) * Rmsr(x,y)_gre ;
   R'msr(x,y)_ble = log(C* Ib/(Ir + Ig + Ib)) * Rmsr(x,y)_blu ;


여기서, C는 상수값이고, Ir, Ig, Ib는 입력영상의 RGB-채널이다.

*그레이 이미지 처리 결과:


*구현 코드는 다음을 참고: 그레이: http://kipl.tistory.com/33 
                               컬러: http://blog.naver.com/helloktk/80039132534
* 기술적으로  log를 취하므로 입력영상에 +1을 더해서 log(0)이 나오는 것을 방지해야 한다.
* convolution된 영상도 1보다 작은 경우에 1로 만들어야한다.
* 스케일이 큰 경우에 필터사이즈가 매우 크므로 효과적인 convolution 알고리즘을 생각해야 한다. 보통 recursive 필터링을 하여서 빠르게 convolution결과를 얻는다.

'Image Recognition' 카테고리의 다른 글

Savitzky-Golay smoothing filter  (2) 2010.03.24
Watershed Algorithm Code  (0) 2010.03.19
Retinex 알고리즘  (11) 2010.02.03
Gaussian Mixture Model & KMeans  (4) 2010.01.30
Image Morphing  (0) 2010.01.24
Fant's Algorithm  (0) 2010.01.22
Posted by helloktk

댓글을 달아 주세요

  1. 소용도리 2010.04.02 21:14 신고  댓글주소  수정/삭제  댓글쓰기

    포스트 아주 잘 봤습니다 !!
    몇가지 질문이 있어서 댓글 남깁니다 ~

    1. Gaussian Filter 만들때 Block Size랑 표준편차는 어떻게 설정하나요?
    (여러개로 할경우에도 어떤 값들을 넣어서 하셨나요?)

    2. 그리고 색깔 보정할때 계수 C는 어떻게 정하셨나요?

    그럼 수고하세요~ 앞으로 많이 배우러 오겠습니다 ㅎㅎ

  2. helloktk 2010.04.07 23:09 신고  댓글주소  수정/삭제  댓글쓰기

    본문의 예제코드 링크http://blog.naver.com/helloktk/80039132534
    에서 코드를 보면,사용한 필터값들이 있습니다(보다 자세한 것은 gimp의 소스코드를 직접 보면 어렵지 않게 알 수 있을 것입니다) gimp에서 사용하는 몇가지 default값을 이용한 것입니다(보통 3개의 다른 스케일의 필터를 사용합니다).그리고, gaussian 필터의 block 사이즈는 sigma값이 정해지면 보통 3시그마 정도로 사용하는데 여기서 사용하는 것은 보통 사용하는 가우시안 필터를 사용하지 않고 gimp 의 구현대로 recursive 하게 구현한 필터를 사용합니다.
    그리고 C값은 예제에서 128로 하였습니다.
    좋은 결과를 얻으려면, 가우시안 스케일을 바꾸면서 테스트를 해보아야할 것입니다.

  3. 이미지궁금이 2011.04.06 10:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 소중한 포스트 감사합니다.

    위에서 2차원 가우시안 함수에 대해서 문의 드립니다.
    2차원 가우시안 함수 같은 경우 직접 구하지 않고
    1/16 1/8 1/16
    1/8 1/4 1/8
    1/16 1/8 1/16
    식의 가우시안 마스크를 적용해도 무난할런지요?? gimp의 구현대로 구하였을 경우에가 더 효과가 좋을 듯 한데..소중한 의견 부탁 드립니다.
    감사합니다.

    • helloktk 2011.04.08 19:31 신고  댓글주소  수정/삭제

      multiscale 이란 다양한 크기의 가우시안 필터와 영상을convolution한 결과를 이용한다는 의미입니다. 따라서 고정된 가우시안 필터만을 사용하여서는 원하는 결과를 얻을 수 없을 것입니다. gimp의 경우에 3개의 스케일(3가지 종류의 가우시안 필터)를 사용합니다

  4. 2011.09.28 09:03  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. 궁금합니다 2017.04.27 18:53  댓글주소  수정/삭제  댓글쓰기

    게시글 잘 봤습니다.
    궁금한게 하나 있는데요, 내용 중에 "컬러영상의 경우에 Retinex 출력영상은 전체적으로 그레이화되는 경향이 있어서" 라고 되어있는데, 왜 그레이화 되는 경향이 있는지 혹시 알 수 있을까요?

  6. 2017.06.07 09:43  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  7. 이승현 2017.07.19 16:27  댓글주소  수정/삭제  댓글쓰기

    CV에 있는 가우시안 블러로 동일한 효과를 내보려고 하는데, 안되네요;;
    nfilter 가 3개라서 Sigma가 3개, 계수가 5x3=15개 나오는데, cv::GaussianBlur는 그냥 커널 사이즈 1개, SigmaX, SimgaY 뿐이라 적용이 힘든건지,,

    혹시 CV로 동일한 효과를 내기 위한 설정 방법이 없을까요?

    • helloktk 2017.07.19 18:13 신고  댓글주소  수정/삭제

      x-y symmetric이므로 sigmaX = sigmaY입니다. 원하는 결과를 얻으려면 이 값(3개 정도)을 잘 선택해야 합니다. 본문에 써진 구현 code가 있는 URL에 들어가서 어떤 값을 선택했는지 찾아보고 시도해 보세요.

  8. 2017.12.27 22:35  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다