Retinex 알고리즘은 영상의 명암 대비(contrast)를 향상시키고, 어두운 영역의 세부 구조를 강조하며, 조명 변화의 영향을 줄이는 데 널리 사용된다. 또한 영상의 픽셀값이 매우 넓은 동적 범위(dynamic range)에 걸쳐 분포하는 경우, 이를 압축하여 영상의 표현이나 전송을 보다 효율적으로 만드는 데 활용할 수 있다.
Retinex 알고리즘의 기본 원리는 입력 영상에 포함된 저주파의 배경(조명) 성분을 추정한 뒤 이를 제거하여, 물체 고유의 반사 성분을 강조하는 것이다. 입력 영상을 \[I(x, y) = r(x, y)\ell (x, y)\]로 나타내자. 여기서 \(I(x,y)\)는 관측된 영상, \(r(x,y)\)는 물체의 반사 성분, $\ell(x, y)$는 배경 성분이다.
1. 베경 성분은 입력 영상의 완만하게 변하는 평균적 밝기 분포로 볼 수 있다. 일반적으로 입력 영상에 적절한 크기의 가우시안 필터 $G_{\sigma }(x, y) =\frac{1}{2\pi \sigma^2} \exp [-\frac{x^2+y^2}{2\sigma^2}]$를 적용하여 이를 추정한다.
\[ \text{배경(조명) 성분:}\quad \ell (x,y)\approx (G_{\sigma }*I)(x,y)\]
여기서 \(G_\sigma(x,y)\)는 가우시안 커널이고, \(*\)는 convolution을 의미한다. 필터의 크기가 클수록 영상의 넓은 영역에 걸친 조명 변화를 추정하며, 필터 크기보다 작은 국소 구조는 배경 성분에서 상대적으로 억제된다.
2. 배경 성분이 추정되면 반사 성분은 입력 영상을 조명 영상으로 나누어 구할 수 있다.
\[ \text{반사 성분:} \quad r(x, y) \approx \frac{I(x, y)}{ (G_{\sigma} * I) (x, y)} \]3. 실제 Retinex 출력은 입력 영상과 배경 추정 영상에 각각 로그를 취한 뒤 그 차를 계산하여 얻는다. 로그 변환은 곱셈 관계를 덧셈 관계로 바꾸어 배경 성분을 분리하기 쉽게 하며, 동시에 반사 성분의 넓은 동적 범위(dynamic range)를 압축하는 효과를 준다.
\begin{align}R(x,y;\sigma) &= \log r(x, y) \\ &=\log [I(x, y)] - \log[ (G_{\sigma} * I)(x,y)]\end{align}
이와 같이 Retinex는 영상의 완만한 조명 변화를 억제하고 국소적인 밝기 차이를 강조함으로써, 명암 대비를 개선하고 어두운 영역의 세부 정보를 보다 잘 드러내도록 한다.
하나의 스케일에 대해서 적용하는 경우를 SSR(single-scale retinex) 알고리즘이라고 한다. 컬러 영상의 경우에는 각각의 RGB 채널에 대해 알고리즘을 적용하면 된다.
Retinex 영상을 구할 때 하나의 스케일이 아니라 다중 스케일에 대해서 적용한 retinex 영상을 적절한 가중치($\omega_\sigma$)를 주어서 더한 결과를 출력 영상으로 사용할 수 있다. 이 경우가 MSR(multi-scale retinex) 알고리즘이다. $$R_{MSR}(x,y) = \sum_{\sigma\in scales} \omega_{\sigma} R_{SSR}(x,y;\sigma) $$
이렇게 얻은 Retinex 출력 영상은 적당한 offset과 stretching을 하여서 픽셀 값이 [0,255] 구간에 있게 조절한다. 이 과정은 Retinex 출력 영상 픽셀의 평균값과 편차를 구하여 해결한다.
컬러 영상의 경우에 Retinex 출력 영상은 전체적으로 그레이화 되는 경향이 있어서(Gaussian smoothing 때문임) 이것을 보완하기 위해서 아래의 추가적인 처리 과정을 더 거친다. $$ {\tilde R}_{MSR}^{red}(x,y)=\log \left(\frac{C I_{red}}{ I_{red}+I_{green}+I_{blue}} \right) R_{MSR}^{red}(x,y)$$ $$ {\tilde R}_{MSR}^{grren}(x,y)=\log \left(\frac{CI_{green}}{ I_{red}+I_{green}+I_{blue}} \right) R_{MSR}^{green}(x,y)$$ $$ {\tilde R}_{MSR}^{blue}(x,y)=\log \left(\frac{C I_{blue}}{I_{red} +I_{green}+I_{blue}} \right) R_{MSR}^{blue}(x,y)$$
여기서, $C$는 상수이고, $I_{red}, I_{green}, I_{blue}$는 입력 영상의 RGB-채널이다.
*그레이 이미지 처리 결과:
- 구현 코드는 다음을 참고: 그레이: http://kipl.tistory.com/33 컬러: http://blog.naver.com/helloktk/80039132534
- 기술적으로 log를 취하므로 입력 영상에 +1을 더해서 log(0)이 나오는 것을 방지해야 한다.
- convolution 된 영상도 1보다 작은 경우에 1로 만들어야 한다.
- 스케일이 큰 경우에 필터 사이즈가 매우 크므로 효과적인 convolution 알고리즘을 생각해야 한다. 보통 recursive 필터링을 하여서 빠르게 convolution결과를 얻는다.
Retinex Algorithm
Retinex 알고리즘은 영상의 밝기와 시각적으로 인지된 감각 사이에는 로그의 관계를 가진다는 사실과, 영상의 밝기는 실제의 밝기인 반사 성분과 조명에 의한 성분의 곱으로 주어진다는 실험적인
kipl.tistory.com
'Image Recognition' 카테고리의 다른 글
| Savitzky-Golay Smoothing Filter (3) | 2010.03.24 |
|---|---|
| Watershed Algorithm 구현 (0) | 2010.03.19 |
| Gaussian Mixture Model & KMeans (4) | 2010.01.30 |
| Image Morphing (1) | 2010.01.24 |
| Fant's Algorithm (0) | 2010.01.22 |

