기하 연산

컴퓨터비전/영상처리 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

영상처리란 무엇인가?

컴퓨터비전/영상처리 2014. 10. 9. 15:20

영상 처리란?

  • 주어진 목적을 달성하기 위해 원래 영상을 새로운 영상으로 변환하는 작업을 말한다.
  • 컴퓨터 비전의 전처리 과정이라고도 불린다.


카메라를 통해 입력받은 이미지는 샘플링과 양자화 단계를 거친다.
  • 2차원 영상 공간을 M x N 으로 샘플링(M x N은 이미지의 해상도(Resolution))
  • 명암을 L단계로 양자화(L을 명함 단계라 부름, 즉 명암은 [0, L-1] 사이에 푼포
  • 아래 사진의 경우 M = 12, N = 12, L = 10인 경우

   다음 사진과 같은 모델링 결과를 얻을수 있다.


보통 영상 처리에서는 영상 좌표계(2차원 좌표)를 사용하며 화소 위치는 x = (i, j) 또는 

x = (y,x)로 표기한다. 영상은 f(x) 또는 f(j, i)  (0 ≤ j ≤ M-1, 0 ≤ i < N-1)로 표기한다.


컬러 영상은 RGB 3채널일 경우 fr(x), fg(x), fb(x)의 세 채널로 구성한다.


영상의 표시 방법은 아래 사진과 같은 각 픽셀값에 따른 2차원 배열로 표시한다.


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

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

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

Android NEON type could not be resolved at Eclipse

프로그래밍/NEON(ARM) 2014. 9. 23. 15:57
  • Make a new C++ project
  • Default options for everything
  • Once created, right-click the project and go to "Properties"
  • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put-std=c++0x at the end . ... instead of GCC C++ Compiler I have also Cygwin compiler
  • C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Click "Add..." and paste__GXX_EXPERIMENTAL_CXX0X__ (ensure to append and prepend two underscores) into "Name" and leave "Value" blank.
  • Hit Apply, do whatever it asks you to do, then hit OK.
  • I had the same problem. It could be resolved by flushing the Eclipse indexer.
    I used the projects context menu and selected Index->Rebuild and Index->Freshen All Files. The last removed the error messages.


'프로그래밍 > NEON(ARM)' 카테고리의 다른 글

NEON 수학, 이항, 스칼라 연산  (0) 2014.09.03
NEON 변환 연산  (0) 2014.09.03
NEON 비교 연산과 절대값  (0) 2014.09.03
NEON 비트와 시프트 연산  (0) 2014.09.03
NEON 레인 설정과 조회  (0) 2014.08.31

2015년 상반기 삼성소프트웨어 멤버십 회원 선발

카테고리 없음 2014. 9. 23. 03:50

[삼성전자 소프트웨어멤버십 회원 선발 공고]

삼성소프트웨어멤버십에서 2015년도 상반기 신입회원을 선발 합니다.
  
1. 모집 요강
  □ 모집대상 : IT분야 연구개발에 ‘재능’과 ‘열정’있는 국내 정규 4년제 대학(원)생
  □ 해당지역 : 서울, 수원, 대전, 대구, 부산, 광주, 전주
  □ 접수방법 : 온라인 접수( www.secmem.org )
  □ 모집일정
    * 서류접수 : 2014. 11. 3 ~ 2014. 11. 12 / 오후 3시까지
    * 기술면접 : 2014. 11. 24 ~ 2014. 11. 28
    * 결과발표 : 2014. 12월 중 예정
    ※ 2015년 하반기 서류접수/기술전형 : 2015년 5월 예정

2. 지원 자격
  □ IT 연구개발에 재능과 열정이 있는 자
  □ 정규 4년제 대학(원)생 (1~4학년, 석사)
  □ 전공 학과 불문
  □ 국내외 공모전 수상자 우대
  □ 대학 졸업 전 1년 이상 회원 활동이 가능한 자(대학 졸업과 동시에 수료)

3. 전형 방법
  1차|서류전형 (Portfolio 및 보유기술소개서)
  - 공모전 수상작, 학교 텀 프로젝트 등, 본인이 직접(공동)개발한 작품에 대한 소개 및
    본인이 보유하고 있는 Software 관련 기술/이력 작성전공 학과 불문

  2차|보유 기술 면접 (Portfolio 및 Software 응용개발능력 면접)
  - 서류전형 합격 후 개발한 작품 및 본인 이력을 통한 보유 기술 면접 진행

  3차|코딩 풀이 면접 (Software 언어 문제 풀이 면접)
  - Software 언어를 활용한 코딩/알고리즘 풀이 진행

4. 선발 인원 : 약 ○○○명

5. 회원 혜택
  □ 연구개발 활동 및 환경 지원
  회원 활동 수료 후 입사 희망 시 SSAT 면제
   ※ 보다 자세한 사항은 홈페이지( www.secmem.org )를 참조하세요.


[삼성소프트웨어멤버십이란?]
1. 설립목적
  삼성소프트웨어멤버십이란, S/W 및 관련 분야에 대한 재능과 열정이 있는
  대학생들에게 연구, 개발에 필요한 모든 것들을 지원하여 창의적이고
  실력 있는 삼성의 Software 전문가가 되도록 지원하는 프로그램입니다.

2. S/W멤버십에서 바라는 인재상
  열정적이고 창의적인, Software 에 재능이 있는 학생들입니다.
  학년, 나이, 학교, 전공, 성별에 구애 받지 않고 S/W 분야에 대한
  열정, 그리고 그 열정을 꽃 피울만한 실력이 갖춰진 학생이라면
  S/W멤버십 회원이 될 수 있습니다.

3. S/W멤버십 Program 이란?
  S/W멤버십 회원이 되기 위한 절차를 거쳐 모든 시험과정에 합격한 뒤
  회원이 되어 활동 과정을 수료하는 사람에 한해 삼성전자에 입사할 수
  있는 특전이 주어지는 제도입니다.


▷▶▷삼성소프트웨어멤버십 홈페이지 바로가기
▷▶▷삼성소프트웨어멤버십 블로그 바로가기
▷▶▷삼성소프트웨어멤버십 페이스북 바로가기

Newton_Raphson Method

수학 2014. 9. 3. 21:00

Newton's  method


수치해석부분에서 Newton's method(혹은 Newton-Raphson Method)라고 알려저 있는 방법은

Isaac Newton과 Joseph Raphson이 발견한 함수의 근사값이나 실제값을 찾는 가장 효과적인 방법이다.


찾고자 하는 함수 식을 f(x)라고 할때, 이 함수의 미분f'(x)를 구해 처음 근사값 x(0) 으로 시작하여

좀더 나은 x(1)을 찾는 방식이다. 아래과 같은 수식에 대입하여


x1 값을 얻고, 이러한 과정을 반복적으로 수행(n번째 x를 넣어 n+1을 찾음)하여

근사값을 구하는 방법이다.


식을 다시 정리하면 다음과 같다.




출처 : http://en.wikipedia.org/wiki/Newton%27s_method



'수학' 카테고리의 다른 글

분산과 표준편차 구하기  (0) 2014.10.17
고유값, 고유벡터  (0) 2014.10.14
다각형 나머지 한점 구하기(다각형의 넓이)  (1) 2014.03.02
사인법칙  (0) 2014.02.26
함수의 극값 구하기  (0) 2014.01.29