영상처리 색공간 변환

컴퓨터비전/영상처리 2014. 10. 20. 07:26

지난 포스트 영상처리 색변환 에 이어 색 모델에 관해 정리한다.

사람의 색 인지방법 등 기초적인 색 모델에 관심있으면 지난 포스트를 참조 바란다.


RGB와 CMY 색공간

 색의 3원소라는 말이 있다. 이 용어가 의미하는 것은 세가지의 색의 기본 원소만 있으면

이들을 조합하여 어떠한 색이든(모든색)을 만들수 있는 것을 의미한다. 이 용어가 가리키는

중요한 점은 사람이 인식할 수 있는 색은 3차원 공간에서 표현된다는 것이다.


       [그림 1] RGB 색공간 모형(3차원)


컴퓨터와 디지털 영상 처리에서 색상 표현에 가장 널리 사용되는 RGB 색 공간은 빨간색과 초록색,

파란색 총 3가지 색이 기본 축으로 이 세가지 색이 빛의 3원색이다.

빛의 3원색에서 각 색을 더하면 더 밝은 색이 나온다. 다른 색의 조명을 같은 곳에 비추면 더 밝은

빛이 나는것과 동일한 원리다. 실제 색의 3원색 은 하늘색(Cyan), 자홍색(Magenta), 노란색(Yellow)로

여러 물감을 섞으면 검정색이 되는것과 같은 원리다. RGB 색공간 모형은 [그림 1]과 같이 표현 할

수 있다.


색의 3원색에 해당하는 색공간을 CMY 색공간 이라고 한다. 빛을 이용한 장치(모니터 등)은 RGB색 

공간을 사용하는 반명, 색깔을 이용하는 장치(프린터 등)은 CMY 색공간을 사용한다. 이 세가지 색을

조합하면 어떤 원하는 색이든 출력이 가능하다.


CMY 색상은 RGB색상의 보색에 해당하므로([그림 1] 참조) 색상 사이 변환은 

흰색에서 R, G, B 각 채널 값을 빼면 된다.



프린터로 출력하는 경우 검정색 글씨를 많이 사용하기 때문에 검정색 잉크를 별도로 추가한

CMYK 색 공간을 쓰는 경우가 많다. K 는 검정색을 의미하며 K = min(C, Y, K)로 정의한다.

K는 C, Y, K 각 채널 중 최소값으로 정의한다. 이렇게 하면 잉크를 절약할수 있는 장점이 있다.

프린터 출력할때 CMY 채널이 공통으로 가지는 양은 검정색 잉크를 K만큼 사용, 

각 채널별로 초과하는 부분만 C, Y, K 각각의 채널에 할당된 잉크를 사용하면 된다.



1수식을 토대로 2수을 계산해 최종 C, M, Y 를 계산한다.


YIQ, YUV, YCbCr 색공간

앞의 색공간은 세 종류의 색을 이용한 축이지만, 지금 소개할 색상은 색상의 특성을 이용하여 

축을 구성한다. 세 원소에 동일하게 포함된 Y 채널은 색상의 밝고 어두움을 나타내는 성분을

의미한다. 그리고 나머지 두 축을 이용해 색상 정보를 표현한다. 이 기법은 텔레비전 신호나

비디오 데이터를 효율적으로 전송하기 위해 개발되었다. 방송국에서 흑백 TV, 컬러 TV에 신호

를 전송할 때, 흑백 TV에서는 밝기 신호(Y성분)만 사용하고, 컬러 TV에서는 나머지 정보를 모두

사용하면 되므로 효율적인 신호 전달이 가능했다.


YUV색 공간은 컬러 비디오 표준에서 사용하는 색 표현 기법으로, Y축을 밝기 성분으로 하고

U, V 두축을 이용하여 색상(chrominance)를 표현한다. U축은 파란색에서 밝기 성분을 뺀

값이고, V축은 빨간색에서 밝기 성분을 뺀 값이다. RGB 색 공간에서 YUV 색 공간으로 변환

하는 것은 다음과 같이 RGB 각 채널에 가중치를 적용하여 더하는 방식으로 계산한다.


RGB 색공간 YUV 색공간

YUV 색공간  RGB 색공간


YIQ 색 공간은 컬러 TV의 표준에서 사용하는 모델이다. YUV와 같은 원리를 사용하며

RGB 색 공간에서 Y(밝기)성분을 구하는 방법은 같고, I, Q값을 구하는 방법은 다르다.


RGB 색공간  YIQ 색공간

YIQ 색공간  RGB 색공간


YCbCr 색 공간은 디지털 텔레비전 시스템에서 사용하는 색 공간이다. 이 색 공간은

YPbPr이라는 아날로그 신호의 색 공간을 디지털화 한 것이다. 


RGB 색공간 → YPbPr 색공간

여기서 RGB 채널 값이 아날로그 신호로서 0에서 1사이의 값이라고 하는 YPbPr 색 공간으로

변환한 결과값은 다음 범위를 갖는다.



YCbCr 색 공간은 YPbPr 색 공간의 디지털 버전임으로, RGB채널이 0~255 값을 가지므로

YCbCr 변환의 결과값도 0~255 값을 가져야하므로 다음과 같이 변환한다.


이 결과 YCbCr은 다음과 같은 범위를 갖는다.



YCbCr 색공간  RGB 색공간




HSV, HSL, HSI 색 공간

HSV 색 공간은 [그림 2] 와 같이 육각뿔의 형태로 표현 할 수 있다. 육각뿔의 높이는 밝기 값인

V이고, 육각뿔 축으로부터 거리가 색의 진한 정도(채도)를 나타내는 S(Saturation)값이다.

S값이 0이면 원뿔의 축에 해당하여 아무런 색채값이 없는 회색이 된다.

V값이 0이면 육각뿔의 아래 꼭짓점에 해당하는 검은색이 된다. 반면 S값이 증가할 수록

점점 색이 진해져 원색에 가까워진다.

H(Hue)값은 빨주노초파남보와 같은 색상을 표현하는 값으로, 육각뿔에서의 각도를 나타내며

0도가 빨간색, 60도가 노란색, 120도가 초록색, 180도가 하늘색, 240도가 파란색, 300도가 

자홍색에 해당한다.


   

                      [그림 2] HSV 색 공간 모델


HSL 색 공간은 [그림 3] 과 같이 나타낼수 있는데, 이중의 뿔 구조로 이루어져있다.

색상 값 H와 채도 값 S는 HSV 색 공간과 거의 같지만, 밝기를 나타내는 축으로 검은색 꼭지점의

반대 방향에 해당하는 꼭지점이 하나 더 있다. 


           

                  [그림 3] HSL 색 공간 모델


RGB에서 HSV와 HSL 색 공간으로 변환하는 방법을 정리하면

두 색 공간이 공통으로 갖는 색상 H는 다음과 같다.




H는 0도에서 360도 사이의 각도 값을 갖는다(음수라면 360을 더하면 된다)

HSV 색 공간의  밝기 V와 채도 S는 다음과 같이 계산할 수 있다.



HSL 색 공간의 밝기 L과 채도 S값은 다음과 같이 계산할 수 있다.



HSI 색 공간의 밝기 I와 채도 S값은 다음과 같이 계산할 수 있다.



'컴퓨터비전/영상처리' 카테고리의 다른 글

Tracking Learning and Detection(TLD)  (0) 2014.10.30
random tree(임의 숲)  (0) 2014.10.25
특징 기술자, 관심 기술자  (0) 2014.10.18
모라벡 알고리즘  (0) 2014.10.13
지역 특징(Local Feature)을 찾는법  (0) 2014.10.13

특징 기술자, 관심 기술자

컴퓨터비전/영상처리 2014. 10. 18. 13:36

특징 기술자, 관심 기술자란 무엇일까?

먼저 특징 기술자에 설명하면 매칭이나 인식과 같은 단계에서 같은 그림의 여부를 판단하기 

위해 사용하는 기술자를 말한다. 이때, 몇가지 요구 조건을 만족해야 한다.


첫째, 기술자의 분별력(discriminating power)이 높아야 한다. 

                                         [그림 1] 기술자의 기준이란


[그림 1]을 보면 a와 b에서 구한 기술자는 서로 달라야 한다. 그래야 다른 영상과 매칭할 때

자신에 해당하는 점과 대응할 것이다.


둘째, 다양한 변환에 불변(invariant)해야 한다.

                                         [그림 2] 다양한 변환


[그림 2]의 경우 원래 영상을 기준으로 회전, 축소, 뒤틀림 등 여러가지 변환이 이루어진 

모습을 볼 수 있다. 만약에 기술자를 면적으로 사용한다고 했을때, 회전 했을 경우  면적은

원래 영상과 같다. 하지만 크기를 축소하는 변환이 일어나면 면적이 변한다. 따라서 면적은 

크기에 불변이 아니다.(공변이다 - convariant) 이제 주축을 생각하면 영역 a는 수직 방향으로 

길기 때문에 주축은 대략 수직 방향이 된다. 주축은 축소가 일어나도 변하지 않는다. 


마지막으로, 특징 벡터의 크기(차원)이다. 매칭은 특징 벡터(기술자) 간의 거리를 계산하여

판단하므로 차원이 높으면 계산 시간이 비례하여 늘어난다. 보통 한 영상에서 발생하는 특징의

개수가 수천에 이르기 때문에, 거리 계산에 걸리는 시간을 단축하는 일은 매우 중요하다. 

계산 효율 측면에서 보면 차원이 낮은 기술자 일수록 좋다.


이제 관심 기술자에 대해 살펴보자.

관심 기술자란 관심점을 위한 기술자로 관심점으로 선정된 화소에 대한 

올바른 매칭을 위한 기술자를 말한다.


   

            [그림 3] 다양한 변환속의 관심점 기술자


관심점 기술자를 추출하려면 (y,x)를 중심으로 윈도우를 씌우고 윈도우 내부를 살펴봐야 하는데,

이때 몇 가지 고려할 점이 발생한다. 윈도우의 모양과 크기, 그리고 어떤 것을 살펴봐야 할지를

정해야 한다. [그림 3]을 보면 a는 원래 영상이고, b는 카메라 위치를 이동해 찍은 사진이다.

c는 이동해 찍은 사진을 회전한 사진이다. a와 b라고 표시한 두 곳에서 관심점이 검출되었다고 

가정하면, 오른쪽 영상들은 왼쪽 영상에서 검출된 관심점에 21×21 크기의 윈도우를 씌워서,

그 영역을 확대하여 보여준것이다. 단순히 카메라의 위치 이동만 발생했을 경우 윈도우 영역이

비슷하여 어떤 기술자를 사용하든 큰 어려움 없이 매칭에 성공할 것으로 기대할 것이다.

하지만 회전과 크기 변환이 일어난 경우 크기와 회전 변환에 불변한 기술자를 고안해야 성공적인

매칭이 가능할 것이다. 영상의 스케일에 따라 윈도우 크기를 줄이고, 회전된 윈도우를 사용해야 한다.

또한 만약 햇빛이 강해져 조명이 바뀔 수도 있을 것이다. 이러한 기하 변환과 광도변환에도 불구하고 

비슷한 기술자를 생성해 주는 알고리즘을 고안해야 한다.


참조 : 컴퓨터비전(오일석)


'컴퓨터비전/영상처리' 카테고리의 다른 글

random tree(임의 숲)  (0) 2014.10.25
영상처리 색공간 변환  (0) 2014.10.20
모라벡 알고리즘  (0) 2014.10.13
지역 특징(Local Feature)을 찾는법  (0) 2014.10.13
기하 연산  (0) 2014.10.10

모라벡 알고리즘

컴퓨터비전/영상처리 2014. 10. 13. 23:51

모라벡 알고리즘

모라벡 알고리즘은 다음 식과 같다.


                         [식 1] 모라벡 알고리즘


[식1]은 제곱차의 합(SSD-Sum of Squared Difference)를 사용해 화소에 특징점의 여부를 판별하는 식이다.

f(..)는 입력 영상이고, w(..)는 마스크이다. w의 크기는 비교할 범위를 나타내며, 박스 내의 화소에 대해서만 

비교 연산을 하면 된다.


         

         

                             [그림 1] 12x12 이미지


[그림 1]의 이미지는 12×12크기의 이미지 속 삼각형을 나타내는 이미지이다.

현재 점은 b(5, 3)의 위치에 있다고 가정하고 제곱차 합을 계산해 보겠다. 마스크의 크기는 3x3이다.



a, b, c 세 지점에서 S(u,v)맵을 구해보면 다음과 같다.


     

                    [그림 2] a, b, c위치에 따른 S(u,v)맵


[그림 2] 를 보면 세 지점에서 S(u,v)맵이 각각 다르게 나타냄을 확인할 수 있다.

화소 c의 경우 변화가 전혀 없으며 아홉 개의 요소 모두 0을 갖는다. 

화소 b의 경우 에지는 세로 방향인데, 그 방향으로는 낮은 값을 갖는 반면, 에지와 수직인 

가로 방향으로는 큰 값을 갖는다. 물체의 코너에 해당하는 a는 모든 방향에서 모두 큰 값을 갖는것을 확인할 수 있다.

즉, 제곱차의 합은 어떤 점이 다른 곳과 얼마나 두드러지게 다른지 측정해 주는 역할을 한다.

물체의 코너는 두드러지게 다른 곳이므로 S를 코너일 가능성 정보로 해석할 수 있다.


            

                  [그림 3] 원래 영상


       

[그림 4] 9×9 마스크로 측정한 S맵(밝을수록 큰값)


[그림 3]을 보면 a, b, c의 화소에 따라 S맵을 출력한 결과 [그림 4]를 볼 수 있다.

[그림 4]를 보면 화소 a의 경우 사슴의 눈으로, 모든 방향에서 명암의 변화가 심하다. 따라서 S맵의

모든 화소가 큰 값을 갖는다. b는 대각선 방향의 에지에 위치하는데, 에지 방향으로는 낮은 값을 갖지만

에지에 수직한 방향으로는 큰  값을 가진다. 변화가 거의 없는 c는 아주 낮은 값을 갖는다.


모라벡은 3×3 크기의 박스형 마스크를 사용하였으며, 동서남북 네 방향으로 한 화소만큼

이동시켜 얻은 네 개의 값 S(0, 1), S(0, -1), S(1, 0), S(-1, 0)만 사용하였다. 모라벡은 어떤

점이 코너라면 네 방향 모두 변화가 커야 한다고 보고, 네 값의 최소값을 지역 특징일 가능성 값

으로 간주하였다.

            


모라벡 알고리즘은 한 화소에대해 네 방향만 보고 특징점 여부를 계산하고, 

잡음에 대한 대처 방안이 없다는 단점이 존재한다.



참조 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

영상처리 색공간 변환  (0) 2014.10.20
특징 기술자, 관심 기술자  (0) 2014.10.18
지역 특징(Local Feature)을 찾는법  (0) 2014.10.13
기하 연산  (0) 2014.10.10
bilateral filter  (0) 2014.10.10

지역 특징(Local Feature)을 찾는법

컴퓨터비전/영상처리 2014. 10. 13. 22:38

대응점을 찾기 위해 무엇을 특징점으로 쓸 것인지 결정하는 문제를 위해 사람들은 여러가지 고민을 했다. 

초기에는 에지의 경우 물체의 경계에 위치하므로 특징점으로 적합하다고 생각하고 접근했다. 지만 

에지는 그 자체로 매칭을 위해 어떤 구실을 하지 못했다.  에지가 가진 정보는 에지 강도와 방향에 불과해

 매칭에 부적합했던 것이다. 따라서 독립적으로 매칭에 참여할 정도로  풍부한 정보를 지닌 특징점을 

검출하는 새로운 접근 방법이 필요했다. 이러한 아이디어는 1970년대부터 나타나기 시작했다. 

이 시기의 사람들은 에지화소를 연결해서 얻은 에지 토막에 의지하였다. 특징점을 검출하는 기본 

원리는 에지 토막에서 곡률(curvature)이 큰 지점을 찾고 그곳을 코너(corner)특징으로 취하는 것이다.

이때 에지 토막은 디지털 공간에서 정의된 곡선이므로 곡률을 계산하는데 어려움이 발생했다.

또한 작은 물체와 큰 물체 사이의 스케일 변화를 적절히 다루어야 하는 문제도 발생한다. 

에지 토막을 이용하는 연구 결과는 1980년대 왕성하게발표되었다가 1990년대에 소강 국면에 

접어들고, 2000년대에는 드물게 나타난다.


이후 지역특징(local feature)의 접근 방법이 떠오르며 에지에 의존하는 대신 명암 영상에서

직접 검출하는 방법으로 접근했다. 다른 곳과 두드러지게 다르고 풍부한 정보를 가진 위치를 찾는

정교한 연산자를 설계하는 일이 핵심이었다. 


지역 특징은 종류에 따라 조금씩 다르지만 대략 위치, 스케일, 방향, 특징벡터 정보로 구성된다.

검출 단계는 위치와 스케일, 기술 단계는 방향과 특징 벡터를 알아낸다. 이때 검출은 여러변환에

공변(covariant)이어야 한다. 물체가 이동 또는 회전하거나 스케일이 달라지면 그에 따라 

위치, 스케일, 방향 정보도 변하기 때문이다. 하지만 물체 입장에서 보면 같은곳이므로 불변이다.

어떤 점에서 특징이 검출되었다면, 변환이 일어나도 같은 점에서 같은 특징이 검출되어야 하기 때문이다.

또한 특징 벡터를 추출하는 기술단계는 불변(invariant)이어야 한다. 매칭 알고리즘은 특징 벡터를 비교하여

비슷한 경우 대응점으로 판단하기 때문이다. 


                 

                                                 [그림 1] 그림간의 대응점 찾기


[그림 1]을 보면 두 점간의 대응점을 보면 배의 꽁무니 주변 영역의 명암을 확대하여 보여주는데,

각기 다른 시점에서 찍은 영상이기 때문에 배라는 물체의 명암이 다를수밖에 없다. 하지만 본질적인

명암 구조는 같으므로 스케일, 회전, 조명 변화에 무관하게 같은 값을 갖는 특징 벡터를 추출하는 

알고리즘을 구상할수 있다. 


수백만 개의 점으로 구성된 영상에서, 훌륭한 곳을 어떻게 찾을수 있을까?


                  

                                                 [그림 2] 특징점 간 비교


[그림 2]를 보면 a, b, c로 표시된 세곳이 있다. 왼쪽 영상에서의 a, b, c 위치를 오른쪽 영상에서의

어느 위치인지 찾는것이 문제로 주어졌을때, 어떤 것이 가장 쉽고 어떤것이 가장 어려울까?

c가 가장 어렵고, a가 가장 쉬울 것이다. 왜 그런 결과가 나타날까?

a는 주변과 비교했을때 여러 방향으로 밝기가 변하지만, C는 모든 방향으로 밝기가 비슷하여 찾기 

어렵기 때문이다. b는 이제 방향으로 변화가 적고 에지에 수직인 그레디언트 방향으로 큰 변화가 일어난다.

컴퓨터는 사람과 마찬가지로 a를 찾는것이 더 쉬울것이다. 


출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

특징 기술자, 관심 기술자  (0) 2014.10.18
모라벡 알고리즘  (0) 2014.10.13
기하 연산  (0) 2014.10.10
bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10

기하 연산

컴퓨터비전/영상처리 2014. 10. 10. 19:25

기하 연산이란?

기하연산은 영상을 회전시키거나 특정 영역을 크게 하는 혹은 회전하는 작업 등의 작업이 필요한 경우에

기하연산을 적용하여 해결할 수 있다.


동차좌표와 동차행렬

기하 변환은 동차좌표(homogeneous coordinate)와 동차행렬(homogeneous matrix)로 표현한다.

이 표현에서 2차원상의 점 x = (y, x)는 동차좌표 x' = (y, x, 1)로 표현한다. 세 개의 값을 가진 3차원 벡터로 표현한다.

단순히 차원을 하나 늘리고 1로 설정하면 된다.

동차좌표에서는 세 요소에 같은 값을 곱하면 같은 좌표가 된다. 

예를 들면 (5, 2, 1), (10, 4, 2), (0.5, 0.2, 0.1)은 모두 같은 (5, 2) 좌표를 나타낸다.


동차 행렬은 [그림 1]과 같이 정리할 수 있다.


                                 [그림 1 - 기하 변환을 정리한 동차행렬]


어떤 점을 y방향으로 3만큼, x방향으로 2만큼 이동시키는 동차행렬 H는 다음과 같다.


                                            


그런데 2차원 변환을 하는데 왜 3차원 동차좌표와 동차행렬을 사용할까?

T(3, 2)를 좌표이동한후, 회전변환을 수행하면 각 점에 대해 2번씩 연산을 수행해야 한다.

하지만 행렬은 다행히 곱셈에 대해 결합 법칙이 성립하므로 결합하면 한번의 연산으로 변환이 가능하다.

이것을 복합변환(Composite transformation)이라고 부른다. k 단계의 변환이 이뤄지는 상황에서 복합 변환을

활용하면 k배 만큼 빨라진다. 이것이 동차 좌표를 사용하는 이유이다.



영상에서의 기하 변환 적용

만약 위에서 동차좌표계로 계산한 결과의 좌표값이 (8.6962, 3.0622)와 같이 실수 값이 나오게 되면 

어떻게 처리해야 할까?

이때 반올림 하여 처리하면 (9, 3)이 될것이다.

[그림 2]를 보게 되면 전방 변환의 경우 여러 곳에서 값을 받는 화소가 있는 반면,

어떤 화소는 하나도 못받아 구멍이 생기는 현상이 발생한다. 이렇게 구멍이 생기는 현상을

에일리어싱(aliasing)이라 불른다. 이런것을 처리하려는 노력을 안티 에일리어싱(anti-aliasing)

이라고 한다. 


                                   [그림 2 - 후방 기하 변환의 안티에일리어싱 효과]


목표 영상의 target의 화소가 자신의 값을 찾아 나설때 역변환을 통해 target이미지의 위치가 source이미지의 어느

위치에 존재하는지 계산해 픽셀을 채우는 것이다. 이 방법을 사용하면 에일리어싱 효과를 막을 수 있다.

변환행렬 H의 역행렬을 사용하면 된다.


전방 기하 변환

1
2
3
4
5
6
7
8
9
10
11
12
/*
입력 : 영상 inputF(j,i), 0≤j≤M-1, 0≤i≤N-1, 변환행렬 H
출력 : 기하 변환된 영상 outputF(j,i), 0≤j≤M-1, 0≤i≤N-1
*/
 
for(j=0 to M-1)
   for(i=0 to N-1) {
      (j,i)에 H를 적용하여 변환된 점(j2, i2)를 구한다.
      실수는 반올림하여 정수로 변환
    
      outputF(j2, i2) = inputF(j, i) // 영상 공간을 벗어난 점은 무시
}

후방 기하 변환

1
2
3
4
5
6
7
8
9
10
11
12
/*
입력 : 영상 inputF(j,i), 0≤j≤M-1, 0≤i≤N-1, 변환행렬 H
출력 : 기하 변환된 영상 outputF(j,i), 0≤j≤M-1, 0≤i≤N-1
*/
 
for(j=0 to M-1)
   for(i=0 to N-1) {
      (j,i)에 H의 역행렬을 적용하여 변환된 점(j2, i2)를 구한다.
      실수는 반올림하여 정수로 변환
    
      outputF(j, i) = inputF(j2, i2) // 영상 공간을 벗어난 점은 무시
}





'컴퓨터비전/영상처리' 카테고리의 다른 글

모라벡 알고리즘  (0) 2014.10.13
지역 특징(Local Feature)을 찾는법  (0) 2014.10.13
bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
화소 연결성  (0) 2014.10.09

bilateral filter

컴퓨터비전/영상처리 2014. 10. 10. 16:41

1. Bilateral Filter C++ 코드 이해하기

사실 Bilateral Filter 가 수식으로 보면 이해가 안가서 차라리 c++을 보고, 수식을 이해했다.

이 무슨 반대 현상... 이제 수식이.. 나에게 무슨 말을 하는지 전혀 안들려...

 

어쨌던.. c++ 코드 검토 결과 아래와 같이 생각 된다.

 

생성자에서  kernelD 는 kernel size 만큼의 n x n 가우시안 필터이다.

여기서 kernel size는 kernel radius*2 +1 로 항상 홀수 이며

kernel radius(반지름)은  sigma Max 의 값으로 정해지며 이 값은 sigma D, sigma R 중 큰 값*2 이다.


즉 d=10, r=6을 주면  sigma max 는 10 이 되며 kernel radius는 20 kernelD[41][41] 가우시안 필터가 된다. 값을 확인하고 싶으면 가장 center인 kernel[20][20] 의 값을 보면 1로 되어 있다.

 

gaussSimilarity[i] 는 256 까지로써 exp((double)-((i) / twoSigmaRSquared)); 로 표현하고 있다.

나중에 범위 편차를 구할때 사용함. 현재 여기서는 순서대로 읽다보면 당연히 이해 안됨.

여기까지가 생성자 끝.

 

실제 runfilter 부분을 보면 단순히 apply()를 width, height 만큼 돌린 전형적인 image processing 함수의 틀을 가지고 있으며,  실제적으로 apply() 에서 가장 핵심적인 부분은 아래 한줄 이다.

 

weight = getSpatialWeight(m,n,i,j) * similarity(intensityKernelPos,intensityCenter);


 

여기서 getSpatialWeight(m,n,i,j) 함수는 ( kernelD[(int)(i-m + kernelRadius)][(int)(j-n + kernelRadius)] ) 으로 처리되며, 실제로 m과n 이라는 상대위치가  i,j 라는 센터 위치와 얼마나 가우시안 분포적으로 가중치를 가지고 있는가로 해석 된다.

 

similarity(intensityKernelPos,intensityCenter) 함수는 아래와 같이 변하며 이것은 해당 주석과 동일하다

this equals: Math.exp(-(( Math.abs(p-s)) /  2 * this->sigmaR * this->sigmaR));


이것은 m,n 의 값 intensityKernelPos (13) 와 i,j 의 값 intensityCenter  (12) 의 절대 차가 얼만큼 가우시안 유사도를 가지는가 이다. (즉 인접 화소의 픽셀 값이 유사하면 가우시안 가중치를 높게 받고, 인접 화소의 픽셀값이 유사하지 않으면 가우시안 가중치가 적다.  실제 gaussSimilarity[256] 에는 gaussSimilarity[0] 값이 1이고, gaussSimilarity[128] 값이 0.16 이며, gaussSimilarity[255] 값은 0.02 정도이다. 가우시안 분포를 아는 사람이면 gaussSimilarity[33] 을 봐야 하며, 이 값은 0.6323 값으로 대략 우리가 말하는 33 이 1 시그마 정도 될것이며, 그 때의 값이 63% 가 된다는 것이다.

뭐 다른 그림을 보니 엄밀히는 68.3% 에 해당되는 값은 gaussSimilarity[28] 이다.

 

암튼 여기 까지 해서 다시 수식을 풀면 weight = getSpatialWeight(m,n,i,j) * similarity(intensityKernelPos,intensityCenter); 는 아래처럼 변신하며

 

weight = ( kernelD[(int)(i-m + kernelRadius)][(int)(j-n + kernelRadius)] ) * ( this->gaussSimilarity[abs(p-s)]; ) 이다.

 

이 i,j 를 이미지의 width, height 만큼 for 문을 돌린다.  이중 앞, 뒤 모두 이미 배열이 완성된 상태에서 for 문을 i,j 에 대해서 각각 kernel radius *2 +1 만큼 (41x41 번 돌리며) 이 i,j 를 이미지의 width, height 만큼 for 문을 돌린다.

 

즉 4중 for 문으로 완성된다.  (소프트웨어 공학적인, 계산의 복잡도는 빼자, 보통 image post processing은 이정도 될듯. )

 

한마디로 길게 풀어 쓰면 바이레터럴 필터는 입력 화소 x 의 값 I(x) 에 대해 그 이웃 화소들 y 의 값 I(y) 들의 공간(space), 범위(range) 에 대한 가우시안 가중치를 적용한 결과 이다.

이 결과 값은 주변 값들이 유사한 경우에는 노이즈 제거 효과를 주변값이 급격히 바뀌는 에지에는 유사성이 떨어지므로 가우시안 가중치가 작어져서 에지를 보존하는 수학적 특성을 가지고 있다.

 

여기서 공간(space) 의 편차는 센터 a 와  상대 위치 b 에 대한 가우시안 가중치를 , 범위 편차는  그때의 센터 a 의 화소값 m 과 그 때의 상대 위치 b 의 화소값 n 에 대해, m, n 이 얼마나 가우시안 가중치를 가지고 있는 것으로 계산될 수 있다.

 

아래는 해당 full src 이다.

당연히 내가 짠것 아니다. 위에 링크 걸었으니 참고해라.

단 execute 시키는 것은 open cv가 있어야 하며 최신 open cv 2.4.x 버전으로 변경되면서, 일부 신경써줘야 할것들이 있긴 한데 그건 이 장과는 별개의 얘기...

 

bilateral filter c++ 코드를 보면 구글에 검색을 하니 http://code.google.com/p/bilateralfilter/ 에 잘 나온것 같다. 역시 코드도 구글 코드가 대세인듯



'컴퓨터비전/영상처리' 카테고리의 다른 글

지역 특징(Local Feature)을 찾는법  (0) 2014.10.13
기하 연산  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
화소 연결성  (0) 2014.10.09
이진영상  (0) 2014.10.09

영상처리의 기본연산

컴퓨터비전/영상처리 2014. 10. 10. 03:23

영상처리란 화소 입장에서 보면 새로운 값을 부여 받는 것을 뜻한다. 이때 새로운 값을 어떻게 부여 

받을지에 대해 세 가지로 구분할 수 있다.


1. 점 연산

점 연산은 [수식 1]과 같이 쓸 수 있다. 출력영상 fout 에서 화소(j,i)값은 k개의 입력영상에서 

같은 위치에 존재하는 화소의 값에 따라 정해진다.


 [수식 1]


대부분 k=1인 한장의 영상을 입력한다. 위의 [수식 2]의 위쪽 2식은 양수 a를 더해서 밝게 만들거나 

어둡게 만드는 연산이다. 세 번째 식은 어두운 곳은 밝게 밝은 곳은 어둡게 반전시킨다.

이들을 모두 선형연산(Linear Operation)에 속한다. 


[수식 2]


                           [그림 1 영상의 선형 연산]



[수식 3]은 감마 수정(Gamma correction)이라 부르는 비선형 연산(nonlinear operation)으로 

f'은 [0,1] 사이 값을 갖는 정규 영상이다.


 [수식 3]


[그림 2]는 감마 값에 따른 변환 함수의 모양과 연산을 적용한 결과를 보여준다.


                                   [그림 2 - 감마변화에 따른 이미지 밝기 변화]


결과를 보면 r이 1보다 작으면 영상이 밝아 지고, 1보다 크면 영상이 어두워 지는 효과가 나타난다.

앞서 설명한 이진화 의 경우 임계값 T를 정하고 작은 화소는 0, 높은 화소는 1로 바꾸었다. 이런 

방식의 함수를 계단함수(step function)이라 부른다. 점 연산에 속하는 또 다른 것은 히스토그램 평활화

(histogram equalization)를 들 수 있다. 이때는 누적 히스토그램이 변환 함수 역할을 한다.


디졸브

응용에 따라 [수식 1]에 들어가는 영상의 개수 k가 2 이상인 경우가 있다. 예를 들면

컬러 영상을 명암 영상으로 변환하는 경우 R, G, B 세 채널이 입력되므로 k는 3이다.

또 다른 경우로 장면 디졸브(scene dissolve)라는 재미있는 효과가 있다. 장면 디졸브는

[수식 4]와 같이 표기할 수 있다.


  [수식 4]


                              [그림 3 - 디졸브 효과]


2. 영역 연산

[그림 4]는 1차원에 불과한 아주 간단한 예제이지만, 매칭에 대한 개념을 얻는데 아주 유용하다.

윈도우 u는 검출하려는 물체 영상이고, f는 입력 영상이다. f에서 u가 어딨는지 찾는것이다.


                                              [그림 4 - 상관과 컨볼루션 원리]


이 문제를 해결하기 위해 u를 f의 위치 0, 1, 2, 3, ‥, 9 각각에 씌워 곱의 합을 계산하고, 그 결과를

새로운 g에 기록하면 g와 같은 출력 영상을 얻을 수 있다. 이 결과를 보면 위치 6에서 최대값을 갖는데

거기에 찾고자 하는 u가 있기 때문이다. 반면 u와 많이 다른 곳일수록 낮은 값임을 알 수 있다.

이와 같이 물체를 표현하는 윈도우 u와 입력영상 f가 얼마나 비슷한지 측정해 주는 연산을

상관(correlation) 이라 부른다. 컨볼루션(convolution)은 상관과 비슷한데, 단지 탐색 윈도우를 뒤집는 것

만 다르다. 


컨볼루션과 상관은 윈도우를 뒤집는것 외에는 차이가 없다. 

이 둘을 구분하는 이유는 각각의 다른 쓰임새를 갖기 때문이다. 매칭하여 물체를 검출한다는 목적에서

보면 뒤집어서 맞추어 보는 컨볼루션은 적합하지 않다. 이때는 상관 매칭 방법이 필요하고, 

신호처리 분야에 임펄스 반응이라는 성질을 이용해 연산의 특성과 동작을 분석하는데 사용된다. 

이때 임펄스 반응은 상관에서는 나타나지 않는다. 따라서 컨볼루션이 필요하다.


                                            [그림 5 다양한 마스크와 컨볼루션 효과]


박스 마스크는 마스크 크기만큼의 평균을 구해준다. 마스크의 값을 모두 합치면 1이 되도록 정규화 한다.

이를 정규 마스크(normalized mask)라고도 한다.

박스나 가우시안과 같은 연산을 스무딩(smoothing)연산이라고 부르며 주로 영상 향상(image enhancement)에 

주로 사용한다.

영상의 잡음은 주로 어떤 화소가 이웃에 비해 아주 크거나 작은 경우인데,

화소와 이웃 화소의 차이를 줄여 평평한 영상을 만들어 주기 때문이다.

에지 마스크는 미분 마스크 이다. 값의 변화 차이를 계산한다. 값의 변화가 크면 엣지로 판단한다.

모션 마스크는 모션 효과를 생성한다.


컨볼루션은 선형 연산이다. 왜냐하면 상수를 변수에 곱하고 그것들을 단순히 합하기 때문이다.

상수는 마스크 내에 있는 계수들이고, 변수는 입력 영상에 있는 화소값이다.


변수에 제곱을 취하여 더하거나 어떤 비선형 규칙을 적용해 결과값을 정한다면 비선형 연산이 된다.

대표적인 비선형 연산은 메디안(median filter)이다. - 평균값 필터

메디안 필터는 가우시안과 마찬가지로 스무딩 효과를 준다. 이웃과 차이가 큰 잡음이 있을 경우,

이웃 화소의 메디안을 취하여 차이를 줄여주기 때문이다. 또한 솔트 페퍼 잡음(salt and pepper noise)-소금 후추 잡음

제거에 매우 효과적이다.

[그림 6]을 보면 솔트 페퍼 잡음을 제거하기 위해 메디안 필터와 가우시안 필터를 적용한 그림이다.


                                          [그림 6 - 가우시안필터와 메디안 필터 비교]


둘을 세밀히 살펴보면 물체의 경계 부근에 차이가 있음을 알 수 있다.

가우시안은 잡음이 덜 제거되는데, 더 제거 하고 싶으면 필터의 크기를 키우면 된다.

(필터의 크기를 키우면 블러 현상이 심해진다. 영상이 뭉개짐)

이런 특성 때문에 메디안필터를 엣지보존(edge preserving)스무딩 필터 라고도 한다.


출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

기하 연산  (0) 2014.10.10
bilateral filter  (0) 2014.10.10
화소 연결성  (0) 2014.10.09
이진영상  (0) 2014.10.09
히스토그램  (0) 2014.10.09

화소 연결성

컴퓨터비전/영상처리 2014. 10. 9. 23:04

각각의 화소에 대한 연결성은 어떻게 표시해야 할까?

이진영상으로 아래 그림과 같은 영상이 들어왔다고 했을때


                [그림1 이진영상]


                 [그림2 4-연결성]


                 [그림3 8-연결성]


연결요소를 찾아 번호를 붙이려면 범람채움(flood fill)알고리즘을 사용한다. 

아래 제시된 코드는 4연결성 flood-fill 알고리즘이다.

만약 8-연결성 flood-fill 알고리즘으로 바꾸려면 flood_fill4함수에 대각선 4방향을 추가하여 8번 호출하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
Flood fill(4-연결성 버전)
입력 : 이진영상 b(j,i), 0≤j≤M-1, 0≤i≤N-1
출력 : 번호를 매긴 영상 I(j,i), 0≤j≤M-1, 0≤i≤N-1
*/
 
b를 I로 복사한다. 이때 0은 0, 1은 -1로 복사 // -1은 아직 번호를 안붙였음을 의미
I의 탐색 경계 설정(이미지 크기), j = 0, j = M-1, i = 0, i = N-1인 화소를 0으로 설정
 
label = 1;
for(j=1 to M-2)
  for(i=1 to N-2)
     if(I(j,i) == -1) { // 번호를 아직 안붙였을 때
        flood_fill4(I, j, i, label);
        label++;
     }
    
    
// 4-연결성 flood-fill 함수
function flood_fill4(l, j, i, label) {
   if(l(j,i) == -1) { // 번호를 안붙인 화소이면
     l(j, i) = label;
     flood_fill(l, j, i-1, label); // left    
     flood_fill(l, j, i+1, label); // right
     flood_fill(l, j-1, i, label); // top
     flood_fill(l, j+1, i, label); // bottom
    }
}
 


출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
이진영상  (0) 2014.10.09
히스토그램  (0) 2014.10.09
영상처리란 무엇인가?  (0) 2014.10.09

이진영상

컴퓨터비전/영상처리 2014. 10. 9. 21:53

이진영상이란?

영상이 백과 흑 혹은 0과 1과 같이 두 가지 값만 가진 영상을 말한다.


어떻게 화소의 명암값을 흑과 백 중의 하나로 결정할 수 있을까?

간단한 방법은 값이 크면 백으로, 작으면 흑으로 바꾸는 것이다. 하지만 크고 작고를 어떻게

구분할지에 대한 의문이 남는다. 결국 두 구간을 가르는 임계값(Threshold) T가 필요한데, 

가장 간단한 방법은 히스토그램을 분석하여 두 봉우리 사이의 계곡 지점을 T로 취하고

그것보다 큰 화소는 백(1)으로 그렇지 않는 화소는 흑(0)으로 바꾸는 것이다.

아래와 같은 수식으로 표현 가능하다.


                           


[그림 1]은 임계값을 통한 이진화 영상이다. 임계값을 50으로 설정하고

50보다 작은 화소를 갖는 값은 0으로, 50보다 큰 화소를 갖는 값은 255로 설정한 것이다. 


                               [그림 1 - 임계값을 통한 이진화]


임계값 방법은 단순한 반면 문제점이 있다. 사람의 경우 눈대중으로 대강 임계값을 설정할 수 있지만,

컴퓨터가 적절한 임계값을 찾지 못하는 것이다. 컴퓨터가 히스토그램을 보고 임계값을 대강 50으로 설정하는 것은

생각보다 쉽지 않다. [그림1]의 히스토그램에서 0과 30, 125와 175 사이의 작은 계곡이 방해 요인이 될 것이다.



오츄 알고리즘

오츄는 아주 효과적인 이진화 알고리즘을 제시했다. 임계값 t를 기준으로 화소를 두 집합으로

나누엇을 때, 각 집합의 명암 분포가 균일할수록 좋다는 점에 착안하여 균일성이 클 수록 t에게 높은 점수를 준다.

균일성은 그룹의 분산으로 측정하는데, 분산이 작을수록 균일성이 높다.

 ※ 분산이란 평균과 떨어저 있는 정도의 범위를 말한다. 따라서 분산이 크면 평균값과 많이 떨어져있는 것 이다.

가능한 모든 t에 대한 점수를 계산한 후 가장 좋은 t를 최종 임계값으로 취한다.

일종의 최적화 알고리즘(optimization algorithm)이다.


아래 수식은 오츄 알고리즘의 핵심이다. 가 목적함수 역할을 하는데, 두 분산의 가중치 합으로 정의한다.

  [수식 1]


   [수식 2]


  ,     

  ,                                           



를 최소화하는 문제는 를 최대화 하는 것과 같다. 

이에 따라 [수식 2]를 다음과 같이 바꾸어 쓸 수 있다.

 [수식 3]


 [수식 4]


          [수식 5]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
입력 : 영상 f(j,i), 0≤j≤M-1, 0≤i≤N-1
출력 : 이진 영상 b(j,i), 0≤j≤M-1, 0≤i≤N-1
*/
 
영상의 정규 히스토그램 h를 만든다.
[수식 5]를 이용해 초기값 w0과 u(0)을 계산한다.
 
for(j=1 to L-1) {
   [수식 5]의 순환식을 이용해 w0(t) 와 u0(t), u1(t)를 계산한다.
   [수식 4]를 계산하여 V를 계산한다.
}
 
앞의 for 루프에서 가장 큰 V(t)를 보인 t를 임계값 T로 취한다.

      

 

위 그림은 오츄 알고리즘을 적용한 이진화 결과이다.


임계값 k개를 사용하여 k+1개의 구간으로 구분하는 다중 임계값으로 적용하면 

좀더 나은 결과를 낼수 있을 것이다.



출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
화소 연결성  (0) 2014.10.09
히스토그램  (0) 2014.10.09
영상처리란 무엇인가?  (0) 2014.10.09

히스토그램

컴퓨터비전/영상처리 2014. 10. 9. 16:18

히스토그램이란?

영상에서 [0, L-1] 사이의 명암 값이 각각 영상에 몇 번 나타나는지 표시하는것을 말한다.

히스토그램 계산은 다음과 같은 방법으로 구할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
/*
입력 : 명암 영상 f(j, i), 0≤j≤M-1, 0≤i≤N-1
출력 : 히스토그램 h(I)와 정규 히스토그램 H(I), 0≤I≤L-1
*/
for(I=0 to L-1) 
   h(l) = 0; // 초기화
 
for(j=0 to M-1)
   for(i=0 to N-1) // f의 화소 (j, i) 각각에 대한 처리
      h(f(j, i))++; // 명암 값에 해당하는 히스토그램 칸을 1만큼 증가
 
for(I=0 to L-1)
   H(I) = h(I)/(MxN); // 정규화

5행은 모든 명암값의 히스토그램 h(x) 를 0으로 초기화 한다.

8~10행은 모든 화소에 접근하여 명암값에 해당하는 히스토그램 칸(bin)을 1만큼 증가시킨다.

12~13행은 모두 더하면 1.0 이 되도록 h(x)를 정규화 한다.


다음과 같은 식으로 표현 가능하다. (h = 히스토그램, H = 정규화 히스토그램)


명암 영상에서의 히스토그램 계산 예)

M과 N이 8이고 L = 8인 아주 작은 영상이다. 이 영상에서 명암값인 2인 화소는 13개 이므로 h(2) = 13이다.

다른 명암값에 대해서도 화소의 개수를 세어보면 h=(0,0,13,18,19,10,4,0)이고, 

H(I) = (0, 0, 0.203, 0.281, 0.297, 0.156, 0.063, 0)이다.

이것을 그래프로 그리면 다음 그림과 같다.


                 [그림1 - 2차원 배열 히스토그램 표현]


히스토그램은 어디서 사용할까? 여러 용도중 하나는 영상의 특성을 파악하는 것이다.

아래 그림을 보게 되면 히스토그램을 보고 그림의 특성을 파악할수 있다.

첫번째 그림은 히스토그램의 명암값이 낮은 값에 주로 위치하고 있다. 따라서 영상은 어두운 영상이다.

두번째 그림은 영상의 명암값이 골고루 푼보되어있다. 

세번째 그림은 어두운 부분과 밝은 부분 2가지로 되어있다.


                   [그림2 - 영상 명암에 따른 히스토그램 분포도]


히스토그램의 또 다른 용도는 조작을 통한 영상 품질 개선이다.

가장 대표적인 연산은 히스토그램 평활화(Histogram equalization)이다.

이 연산은 히스토그램을 균등하게 분포시킨다.

이렇게 하면 영상이 사용하는 명암의 범위, 즉 동적 범위가 늘어나 영상이 이전보다 선명해진다.



위 식은 입력영상 f를 평활화하여 출력 영상g 를 만드는 데 사용하는 변환 식이다.

여기에서 c()는 누적 히스토그램이고, round()는 반올림 연산이다.

T()는 입력영상 f의 명암 값 I(in)을 출력영상 g의 명암값I(out)으로 변환하는 매핑 함수이다.

이 매핑 함수는 누적 히스토그램에 (L-1)을 곱하고 결과를 반올림하면 된다.


출력영상 g를 생각해 보면, 이 영상은 히스토그램이 평평하므로 어떤 명암 I를 기준으로

생각해 보면 그것보다 작은 명암을 갖는 화소의 비율은 I/L이어야 한다.

평활화를 수행하는 과정에서 사용한 누적 히스토그램이 정확히 그런 역할을 한다.

다시 말해 누적 히스토그램은 비율이 I/L인 점을 I로 매핑해 준다.



아래 그림은 실제 영상에 히스토그램 평활활르 적용한 결과이다. 얼룩말의 줄무늬가 훨씬 선명하고

숲에 있는 나무도 훨씬 잘 보인다.


                                      [그림3 - 히스토그램 평활화]


히스토그램 역투영

히스토그램 역투영(Histogram backprojection) 연산과 이를 활용하여 물체를 검출할 수 있다.

히스토그램을 매핑 함수로 사용하여, 화소 값을 신뢰도 값으로 변환하는 과정이다.

물체의 모양은 무시하고 단순히 컬러 분포만으로 검출하는 방법으로, 히스토그램은 컬러 분포를

표현하는 데 사용된다.


                       [그림4 - HS공간 히스토그램]


히스토그램역투영시 명암 채널만 이용하는 1차원이 아니라, 최소 2차원 이상을 사용해야 한다.

왜나하면 명암은 조명에 따라 쉽게 변할 뿐만 아니라 얼굴과 비슷한 명암을 갖는 다른 영역이 

여러 군데 존재 할 가능성이 높기 때문에 명암만 사용하면 피부에 해당하는 영역을 구별하기 어렵기 때문이다.

따라서 RGB색 공간 영역을 HSI공간으로 변환한 다음, I채널(명암-Intensity)은 무시하고, H채널(색상-hue)과

S채널(채도-Saturation)을 사용한다.



H와 S축을 각각 I단계로 나누면 2차원 히스토그램의 전체 칸 수는 L^2이 되어 넓은 공간이 된다.

축 하나를 표현하는데 1바이트를 사용하면 L = 256이므로 히스토그램 칸 수는 65,536이다.


예를 들어 얼굴 영상은 원래 영상에서 오래낸 것이므로 크기는 100 × 80이다. 

따라서 8,000개의 화소를 65,536개의 칸을 가진 2차원 히스토그램에 뿌리면 

대부분의 칸이 0을 갖는 매우 희소한 공간이 될 것이다.

이런 상황에서는 L단계를 양자화 하여 q단계로 줄이는 것이 좋다. 

아래 코드의 10번째 줄에 나타나 있는 양자화 함수는 아래와 같다.


   (괄호는 소수점 버리는 연산)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
입력 : H와 S채널 영상 fH(j,i), fS(j,i), 0≤j≤M-1, 0≤i≤N-1
출력 : 히스토그램 h(j,i)와 정규 히스토그램 H(j,i), 0≤j,i≤q-1 //L단계를 q단계로 양자화
*/
 
h(j,i), 0≤j,i<q-1을 0으로 초기화
 
for(j=0 to M-1)
   for(i=0 to N-1) // f의 화소 (j, i) 각각에 대한 처리
      h((quantize(fH(j,i)), quantize(fS(j,i))++; // 해당 칸을 1 증가시킴
 
for(j=0 to q-1)
   for(i=0 to q-1) 
   H(j,i) = h(j,i)/(MxN) // 정규화


[그림 4]에서의 q는 64이다. 따라서 원래의 히스토그램의 4x4=16칸을 한 칸으로 축소 시키는 셈이다.


위와 같은 방법으로 히스토그램을 만들었을 때 만든 히스토그램을 Hm이라고 했을때,

새로운 영상 g가 주어지면 Hm을 이용하여 얼굴을 찾아낼 수 있다.


기본 원리는 간단하다. g의 어떤 화소 (j, i)의 H와 S채널값을 (a, b)라고 했을때,

즉 a=gh(j, i)와 b = gs(j, i)일 때  Hm(a, b)의 값이 큰 값을 가지면 그 픽셀은 얼굴일 가능성이 높고

반대면 가능성이 낮다고 볼 수 있다. 다시 말해 Hm은 화소의 값을 얼굴에 해당할 신뢰도 값으로 반환해 준다.


1
2
3
4
5
6
7
8
9
10
11
/*
입력 : H와 S채널 영상 gh(j, i), gs(j, i), 0≤j≤M-1, 0≤i≤N-1 // 얼굴을 검출하려는 영상
       모델 히스토그램 Hm(j, i), 0≤j, i≤q-1
출력 : 가능성 맵 o(j, i), 0≤j≤M-1, 0≤i≤N-1
*/
 
검색 영상을 gh, gs를 위 알고리즘 이용해 정규 히스토그램 Hi를 만든다.
 
for(j=0 to M-1)
  for(i=0 to N-1)
     o(j,i) = Hr(quantize(gh(j,i)), quantize(gs(j,i))); // 역투영


       


아래 그림은 입력영상에 대한 모델 히스토그램을 역투영 하여 얻은 신뢰도 맵(confidence map)을 보여준다.

           

                             [그림5 - 히스토그램 역투영 결과]


흰 영역이 모델 히스토그램과 높은 신뢰도 즉 유사성이 높은 부분이다. 

예상대로 얼굴 부분에서 큰 값을 갖는것을 확인할 수 있다.

또한 손 영역에서 큰 값을 가지는데, 손과 얼굴 색이 비슷하기 때문이다.

만약 피부와 비슷한 색 분포를 갖는 다른 물체나 배경 영역이 있다면 그것도 높은 값을 가지게 

되어 검출 오류가 발생할 것이다. 또한 검출 대상이 여러가지 색 분포를 가지는 경우에는 여러 개의 모델을

사용해야 하며, 결과적으로 검출 오류가 발생할 가능성도 높아진다.

따라서 물체 검출 문제를 풀 때 모양 특징을 주로 사용하며, 상황에 따라 색 분포 정보를 보조로 활용한다.

이런 문제점에도 불구하고 히스토그램 역투영을 적용할 때의 장점도 있다. 히스토그램은 물체의 이동과 회전에 

불변하다. 즉, 이동이나 회전이 발생해도 히스토그램은 변하지 않는다. 따라서 히스토그램 역투영은 같은 

배경 아래에서 물체가 이동하거나 회전해도 성능이 유지된다. 또한 물체의 일부가 가려진 경우에도 잘 작동한다.

배경을 균일하게 꾸밀 수 있는 상황이라면 히스토그램 역투영을 유용하게 활용할 수 있을 것이다.


출처 : 컴퓨터비전(오일석)

'컴퓨터비전/영상처리' 카테고리의 다른 글

bilateral filter  (0) 2014.10.10
영상처리의 기본연산  (0) 2014.10.10
화소 연결성  (0) 2014.10.09
이진영상  (0) 2014.10.09
영상처리란 무엇인가?  (0) 2014.10.09