티스토리 툴바


Savitzky-Golay 필터는 일차원의 데이터에 대해서 일종의 이동평균을 취하는 경우와 동일하게 동작하는 필터이지만, 추정하는 지점의 주변의 모든 점에 동일한 가중치를 주는 방식(이동평균)을 택하지 않고, 그들을 보간하는 다항식을 최소자승법으로 찾아서 해당 지점의 값을 추정하는 방식을 택한다(frequency domain에서 분석을 하면 Savitzky-Golay 필터의 특성, 예를 들면, 피크의 위치나 등이 잘 유지되는 점등, 좀 더 다양하게 볼 수 있다). 이 필터를 쓰기 위해서는 몇 차의 다항식과 얼마의 윈도우 크기를 사용해야 하는지 설정을 해야 한다. (다항식의 찻수가 정해지면 최소의 윈도우 크기가 정해진다).
동일한 방식으로 이차원에 대해서도 Savitzky-Golay를 적용할 수 있다. 이 경우에는 다항식이 (x,y)의 2변수 함수 (2차원 평면에서의 정의되는 곡면)로 주어질 것이다. 이차원의 경우도 국소적인 필터로 사용하여서 영상의 smoothing 필터로 사용할 수 있지만, 필터의 윈도우를 영상전체로 잡아서, 즉 영상을 구성하는 픽셀값을 전 영역에서 보간하는 곡면을 찾을 수도 있다. 이렇게 찾은 곡면은 만들어진 영상의 배경조명이 균일하지 않는 경우에 이 추정된 곡면을 이용하면, 조명에 의한 효과를 예측할 수 있고, 배경조명이 보정된 영상을 만들어서 영상의 인식에 도움을 받을 수 있다. (문서인식에서 문서를 스캔할 때 생기는 균일하지 않은 배경이나, 2차원 코드 인식에서 배경의 추정등 다양한 부분에서 사용할 수 있다. 물론 간단한 경우에는 배경의 변화를 균일하게 기울어진 평면으로 근사를 하여서 추정할 수 있다)  

간단한 경우가 3차 다항식으로 영상을 보간하는 경우:

I(x, y) = a00
         + a
10*x + a01*y
         + a
20*x2 + a11*x*y + a02*y2
         + a
30*x3 + a21*x2*y + a12*x*y2 + a03*y3 
                                                      (x, y) ∈ image 


다항식은 x = [a00, a10,..., a03]T 의 10개의 필터계수를 추정하면 얻어진다. 추가적으로 Savitzky-Golay을 이용하면 영상의 미분값을 쉽게 구할 수 있다. 로컬버전의 필터인 경우에 필터적용값은 윈도우의 중심인 (x, y) = (0, 0)에서 다항식 값인 a00이다. 이 지점에서 x-방향의 편미분값은 a10, y방향의 편미분 값은 a01, 식으로 미분값을 구할 수 있다.

필터의 계수 x는 최소자승법 적용하면 얻어질 수 있다.  위의 다항식에  N (= width * height) 개의 픽셀로 구성된 영상의 각각의 픽셀에서의 좌표와 픽셀값을 대입하면,  N개의 식을 얻는다. 이것을 행렬식으로 쓰면

A.x = b

A는 N x 10 의 행렬로 각 행은 픽셀의 좌표로 구해진다:

A = [1, x0,  y0,  x02,  x0*y0,  y02,  x03,  x02*y0,  x0*y02,  y03]
     [1, x1,  y1,  x12,  x1*y1,  y12,  x13,  x12*y1,  x1*y12,  y13] 
     [1, x2,  y2,  x22,  x2*y2,  y22,  x23,  x22*y2,  x2*y22,  y23] 
     [1, .....................................................................] 
     [1, .....................................................................] 
                       ......................................
     [1, .....................................................................] 

여기서, 영상을 읽을 때, i-번째의 픽셀 위치가 (xi, yi) 로 주어진 경우다.

b 는 N-(열)벡터로 각각의 픽셀 위치에서 픽셀 값을 나타내는 벡터이다:

b = [ I(x0, y0) ]
     [ I(x1, y1) ] 
     [ I(x2, y2) ] 
     [ ............] 
     [ ............]
      ..............
     [.............]  


최소자승법을 적용하면, 추정된 다항식의 계수벡터 x는 

x = (A
T .A)-1.AT.b

임을 알 수 있다.

이렇게 추정된 2차원 곡면은 영상에서 추정된 배경의 픽셀 값 분포를 의미한다. 문자인식의 예를 들면, 보통의 경우에 흰 배경에 검정색 활자를 인식한다. 스캔된 영상에 검정색 활자들 때문에 추정된 곡명은 일반적으로 주어진 픽셀이 만드는 곡면보다도 낮게 된다. 픽셀 값이 추정된 곡면보다 더 낮은 픽셀들은 보통 검정색 문자들을 의미하므로, 이 차이의 평균값을 구하면, 대략적으로 어떤 픽셀이 배경에 속하는지 (곡면과 차이가 평균보다 작고, 또한 픽셀 값이  곡면의 아래에 놓인 경우), 아니면 문자영역인지(곡면과 차이가 평균보다 크고, 픽셀 값이 곡면의 아래에 놓인 경우)를 구별할 있게 된다.  
이제 이 정보들을 이용해서 추정을 다시 하는데 이번에는 1차 추정에서 글자영역으로 분류된 픽셀을 제외하고 배경을 추정하면 좀 더 정확한 배경을 기술하는 곡면을 얻을 수 있다.

로컬버전 필터로 사용할 때는 1차원에서와 마찬가지로 필터계수를 lookup table로 만들어서 사용할 수 있으나, 전영역을 대상으로 할 때는 행렬의 크기가 매우 커져서 연산도 많아진다. 


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
별로 도움은 안되지만,
http://www.phys.huji.ac.il/~barak_kol/HDGR/proceedings/Brustein.pps 
  

f(R) gravity에서 Wald entropy 계산:
D.N. Vollick, Phys. Rev. D76 (2007) 124001, "Noether charge and black hole entropy in modified theories of gravity". http://arxiv.org/abs/0710.1859
 ==> based on the Palatini formalism. connection이 일반적으로 metric compatible 하지 않음. 따라서 covariant derivative에 compatible인 새로운 metric을 이용해서 connection을 표현해야 한다. 이 새로운 metric을 이용하면 metric formalism을 그대로 적용가능함.


R. Brustein, D. Gorbonos, M. Hadad and A.J.M. Medved, Phys.Rev. D84 (2011) 064011, "Evaluating the Wald entropy from two-derivative terms in quadratic actions". http://arxiv.org/abs/1106.4394   

horizon에서 벗어난 영역에서의 Wald entropy 계산: 
R. Brustein, and A.J.M. Medved, "Gravitational entropy and thermodynamics away from the horizon", http://arxiv.org/abs/1201.5754

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
http://www.ihes.fr/~vanhove/Slides/deruelle-ihes-apr2010.pdf
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
http://homepages.mcs.vuw.ac.nz/~visser/Seminars/NZ-seminars/sotiriou-at-canterbury.pdf
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
웹캠의 영상에 들어오는 QR코드의 FinderPattern (topLeft, topRight, bottomLeft ==> 붉은색 십자)와 Alignment pattern(==>초록색 색자)을 찾고, 이들을 이용해서 perspective 변환을 구해서 code의 bounding box을 찾는다. Alignment Pattern을 못찾는 경우에는 bottomRight의 코너(==>초록색 십자)를 찾고, 그마저도 실패하면, FinderPattern 3개을 이용하여서 Affine 변환으로 bounding box을 찾는다.

웹  카메라:  이미지 형식: RGB24만 지원 (마이크로소프트의 vx-1000으로 테스트함)
                  이미지 크기: 640x480만 지원
                  영상을 보여주는 Callback함수 내에서 알고리즘을 호출하여서
                                       빠른 컴퓨터에서는 마크가 보이지 않을 수 있음.

테스트용이므로 상업적사용을 허용하지 않음.
 



실행화일 (detector + decoder 포함):


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
32비트 머신에서 float 형의 변수는 4바이트의 메모리 공간을 차지한다. 즉, int 와 같은 메모리가 할당이 된다. 그리고, 4바이트의 최상위 비트가 1로 세팅이 되면, 이 float형의 변수는 음수를 의미한다. 따라서, float 형의 변수의 절대값을 구하고 싶으면, 메모리에 접근해서 4바이트를 얻어 온 후에, 최상위비트만 0으로 만들고 나머지는 그대로 두어야 한다. 따라서 비트마스크를 이용해서 이 과정을 수행하고 싶으면, and 연산의 비트마스크를 

01111111 11111111 11111111 11111111 = 2^31 - 1 = 0x7F FF FF FF 

처럼 잡으면 된다.

float  fast_abs(float fx) {
    int  ix = *(int *)&fx ;   // 4바이트 얻어 오기;
    ix &= 0x7FFFFFFF;    // MSB 지우기
    return *(float *)&ix ;   // float 형으로 되돌려 줌;
}

 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
두 영상간의 perspective 변환은 8개의 매개변수(a,b,c,d,e,f,g,h)에 의해서 다음의 식처럼 기술이 된다. (see, http://kipl.tistory.com/86)

x =  (a * u + b * v + c) / (g * u + h * v + 1) ;
y =  (d * u + e * v + f) / (g * u + h * v + 1) ;


또는

u * a + v * b + c - u * x * g - v * x * h = x ;
u * d + v * e + f - u* y * g - v * y * h = y;

따라서, 매개변수를 찾기 위해서는 두 영상에서 서로 대응하는 점이 4개 이상 주어져야 한다. 만약에 N개의 대응점들이 주어진 경우에

{ (uk, vk) } --> { (xk, yk) },        k=0, 1, 2,...,N-1;

위의 식을 각각의 대응점에 넣어서 정리하면 아래의 행렬식을 얻을 수 있다.
 

또는 간단히 

A.x = b ;

로 쓸 수 있다. 그러나 실제 대응점을 찾을 때 들어오는 noise로 인해서 실제 데이터를 이용하는 경우에는 정확히 등호로 주어지지 않는다. 따라서, 좌변과 우변의 차이의 제곱을 최소로 만드는 x를 찾아야 할 것이다.

x* = argmin ||A.x - b||^2   ;

x^T에 대해서 미분을 하여서,

A^T.A.x = A^T.b ;

를 만족시키는 극값 x*을 구하면 된다.  

A^T.A 는 8x8의 대칭행렬이므로, 대각화가 가능하여, 역행렬을 구할 수 있고 (주어진 점들중 한 직선위에 놓이지 않는 점이 4개 이상이 있어야 한다). 이 경우에,


x* = (A^T.A)^-1. A^T.b ;

로 주어진다.

 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'이미지인식' 카테고리의 다른 글

2차원 Savitzky-Golay Filters 응용  (0) 2012/02/28
webcam용 QR code detector  (0) 2012/02/19
Least Square Estimation of Perspective Transformation  (0) 2012/02/15
Perspective Transformation  (0) 2012/02/14
Integral Image을 이용한 Adaptive Threshold  (0) 2012/02/04
Peak Finder  (0) 2012/02/02
Posted by helloktk
한 평면에서 다른 평면으로 변환 중에서 직선의 직선성을 유지하는 변환은 2차원의 perspective 변환이다. 이 변환의 부분인 어파인 변환은 평행한 두 직선의 평행성을 그대로 유지하면서 변환시킨다. 따라서 이 perspective 변환은 사각형을 사각형으로 변환시키는 특성도 있다. 물론 사각형을 다른 사각형으로 변환시키는 다른 이차원 변환인 bilinear 변환이 있으나 일반적으로 직선의 직선성은 보전하지 못한다. 이 직선성의 보존은 매우 중요한 특성이다. 카메라도 일종의 perspective 변환기로 영상을 맺을 때도 직선은 그대로 직선으로 나타난다.(FOV가 큰 카메라는 렌즈왜곡이 심해서 보존이 안된다) 

평면에서의 변환을 다룰 때는 2x2행렬보다는 3x3 행렬을 이용하는 것이 더 편리하다. 이렇게 하면 평면에서 점의 이동을 행렬의 요소로 넣어서 생각할 수 있다.

(ex) affine 변환:
x = a11 * u + a21 * v + tu 
y = a12 * u + a22 * v + tv;
==> 
[x]   [a11   a21  tu] [u]
[y] = [a12   a22  tv] [v]
[1]   [   0      0   1] [1]

그리고 이것은 perspective 변환이 선형변환임을 명시적으로 보여주어서, 직선성이 보존된다는 사실이 자명해진다. 3x3행렬로 표현할 때, 평면의 좌표는 (x, y ,1)^T 처럼 3번째 좌표의 값은 항상 1로 고정한다( homogeneous coordinate) 
 
카메라로 물체를 촬영할 때, 가까운 거리에서 촬영을 하던, 먼 거리에서 촬영을 하던 두 영상은 크기차이만 있는 동일한 모양의 물체상을 만들어 낸다. perspective 변환은 3차원에 놓인 평면에서 평면으로 변환으로 생각할 수 있는데, 크기의 차이만 있는 경우에 같은 것으로 본다. 3차원에서 행렬변환은 9개의 매개변수에 의해서 기술이 되는데, 전체적인 크기의 차이를 무시하므로 1개 매개변수가 줄어들어서 8개의 매개변수로 표현이 된다.  
perspective 변환을 아래처럼 쓰면 변환된 좌표의 3번쨰 성분은 일반적으로 1이 아니다. 3번째 좌표 w을 구한 후에 이 값으로 x, y를 나누어서 생각하면 된다.

[x]   [ a11  a21 a31 ] [u]
[y] = [ a12  a22 a32 ] [v] 
[w]   [ a13  a23 a33 ] [1]             (a33 = 1)
 
x  = a11 * u +  a21 * v + a31     ==>  x =  x / w;
y  = a12 * u +  a22 * v + a32     ==>  y =  y / w;
w  = a13 * u +  a23 * v + a33  

perspective 변환행렬 [aij]는 4개의 점에 대응하는 출력영상에서의 4개의 점이 주어지면 8개의 방정식을 만들 수 있고, 이것을 이용해서 계수를 구할 수 있다. 그러나, 8차 방정식의 근의 공식이 없는 관계로 일반적으로 수치해석적으로 해결해야 한다. 그리고, 주어진 4점이 (입력 또는 출력) 일직선상에 있으면 답을 구할 수 없고, 그 중에 3개만 일직선상에 있는 경우에는 이 변환은 평행성을 보존하는 affine 변환이 된다.(affine은 6개의 매개변수로 기술되고, 평행이동을 빼면, 4개의 매개변수가 남는데, 4차 방정식의 근의 공식이 있으므로 답을 적을 수 있다)

다행이 정사각형에서 사변형으로 변환은 수치해석에 의존하지 않고도 답을 적을 수 있다.
(0,0) -> (x0, y0);               
(1,0) -> (x1, y1);                         
(1,1) -> (x2, y2);
(0,1) -> (x3, y3);
==>
denom = (x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2);     
a11 = x1 - x0 + a13 * x1 ;
a21 = x3 - x0 + a23 * x3 ;
a31 = x0 ;
a12 = y1 - y0 + a13 * y1;
a22 = y3 - y0 + a23 * y3;
a32 = y0;
a13 = ((x0-x1+x2-x3)*(y3-y2) - (x3-x2)*(y0-y1+y2-y3)) / denom;
a23 = ((x1-x2)*(y0-y1+y2-y3) - (x0-x1+x2-x3)*(y1-y2)) / denom;
a33 = 1.0;


따라서 일반적인 사변형에서 사변형으로의 변환은 

사변형1 --> 정사각형 --> 사변형2


의 2단계 변환의 곱으로 주어진다. 사변형에 정사각형으로 변환의 정사각형에서 사변형으로 변환의 역변환이므로 역행렬을 구해야 하나, 이것 보다는 수치적으로 안정적인 adjoint행렬을 이용하는 것이 낳다(adjoint을 쓰면 determinant로 나누기를 할 필요가 없다). 이것은 perspective변환에서 항상 좌표를 3번째 좌표로 나누어서 사용하기 때문에 가능하다.


 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'이미지인식' 카테고리의 다른 글

webcam용 QR code detector  (0) 2012/02/19
Least Square Estimation of Perspective Transformation  (0) 2012/02/15
Perspective Transformation  (0) 2012/02/14
Integral Image을 이용한 Adaptive Threshold  (0) 2012/02/04
Peak Finder  (0) 2012/02/02
QR-code : decoder  (0) 2012/01/26
Posted by helloktk
양의 정수  x가 주어질 때, 이보다 크거나 같은 가장 작은 2^n의 숫자를 찾아보자. 왜? FFT 때문이다. 물론,  n = (int)ceil(log(x) / log(2.)) 로 계산하거나, 
                    int a = 1;
                    while (a < x) a <<= 1; 
로 찾을 수 있다;

2^(n-1) < x <= 2^n 사이에 있으면, 원하는 답은 2^n이다. x=2^n 인 경우를 제외하고 모두 n번째 비트가 1로 세팅이 된다. 따라서, 통일시키기 위해서 1을 빼면, x-1 은 n 번째 비트가 항상 1로 주어진다.  이제, 남은 일은 n-1 번째에서 0번째까지 모든 비트를 1로 채우면 된다. 그 결과에 1을 더하면 원하는 2^n을 얻는다.  n-번째 비트가 1이고 이를 이용해서 하위비트를 채우기 위해서는 차례로 >> 연산을 한 후에 or 연산을 하면 된다.

a = x - 1
a                   = 1xxxxxxxxxxxxxxxxxxxxxxxx
a >> 1             = 01xxxxxxxxxxxxxxxxxxxxxxx
a >> 2             = 001xxxxxxxxxxxxxxxxxxxxxx 
.......

31번의 >> 연산을 한 후에 or 연산을 하면 n이하의 모든 비트가 1로 채워진다(31은 최대로의 경우다. 사전에 답을 모르므로 31번 >>까지 해야 한다). 이것은 너무 낭비다.  잘 살펴보면,

a | (a>>1) = 11xxxxxxxxxxxxxxxxxxxxxxxxx

형태이어서, 상위 두 자리 비트가 이미 세팅이 되어 있으므로, 이 결과를 다시  >> 2 하여서 이전 결과와 or연산을 하면 상위 4자리의 비트가가 채워지고, 또다시 이 결과를 >>4 하고 난 후에 직전 결과와 or 연산을 하면 상위 8자리의 비트가 1로 채워진다. 이런식으로 하면 >>16까지 하면 32자리를 모두 커버할 수 있다.

따라서, 전체적인 알고리즘은 (x > 0)
 

   x-- ; 
   x |= (x >> 1);  //상위 2 자리 채움
   x |= (x >> 2);  //상위 4자리
 채움 
   x |= (x >> 4);  //상위 8자리
 채움 
   x |= (x >> 8);  //상위 16자리
 채움 
   x |= (x >> 16);//상위 32자리
 채움 

   x++;
   return x;


단, 32비트 머신에서만이다. 64비트 프로그래밍에서는 >>32 도 추가로 해주어야 한다.
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk
FFT를 수행하려면 이미지의 폭이나 높이가 2의 지수승인 경우가 가장 단순하게 주어진다. 따라서  주어진 정수 x가 2의 지수승인가 판별할 수 있어야 한다. x가 양의 정수이고, 2^n으로 표현이 된다면, 2진수로 나타낼 때, (n+1) 번째 비트만 1이고 (0부터 센다), 나머지 비트는 모두 0이다. 그리고 x-1은  n 번째에서 0번째까지 모든 비트가 1이 된
다.  
    x                    x(2진수)            x-1
    1                      1                        0
    2                    10                         1
    4                   100                       11
    8                  1000                     111
     ................................................................
이 표를 보면, x와 x-1사이에는 겹치는 비트가 없다. 따라서 두 수를  and 연산을 하면 0 이 되는 경우에는 2의 지수승이고, 그 이외의 경우에는 0이 아님을 알 수 있다. x = 2의 지수승  판별은    
 

                           return  x & (x - 1) == 0         /* x != 0 인 정수*/
 

인가를 보면 된다. 

그런데 이 판별식은 x = 0 인 경우에는 성립이 안된다. x-1 = -1 이므로 32비트 자리 전부가 1로 채워지므로 x & (x-1) = 0 이어서 2의 지수승으로 판별한다. 따라서 0을 제외하는 방법을 찾아야 한다. (물론 함수 인자에서 양수로 제한을 하면 되지만 폼이 안난다). 음수는 최상위비트가 1로 채워지므로 이 사실을 이용하자. 최상위 비트를 1로 만들려면,

~0U                    =111111111111111..11111111(32개) 
~0U>>1              = 011111111111111..11111111
~(~0U>>1)          =100000000000000..00000000 
~(~0U>>1)|x       = x의 최상위 비트를 항상 1로 채워준다(음수 일때는 자동으로 만족)
                             나머지 비트는 그대로 둔다.

따라서 이 값과 x-1을 and 연산을 하면 0 이하인 수가 들어오면 연산이 결과를 항상 0이 아니게 된다.


                          return  !((~(~0U>>1)|x) & (x - 1))          /*x = 정수 */    
 
0 하나를 예외처리하기 위해서 너무 많은 과정을 거치는 것이 아닌가? 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by helloktk