[영상 Geometry #4] Homography 보완

영상처리 2013.07.12 06:53

앞서 설명한 [컴퓨터 비전에서의 Geometry #3] 2D 변환 (Transformations)에 대한 보완 글입니다.


내용상으로는 앞 글에 추가하는게 맞겠으나 이렇게 따로 포스팅하는게 좀더 효과적일 것 같습니다.


앞서 #3 글에서는 두 이미지 간의 2D 변환 모델에 대해 전반적으로 다뤄 보았습니다. 그런데, 앞 글에서도 언급하였지만 affine 변환과 homography는 아래 그림과 같이 비정상적인 형태로 변환이 구해질 수가 있습니다.



뒤집힘(reflection)은 affine, homography에서 모두 발생할 수 있으며 뒤틀림(twist), 오목(concave)는 homography에서만 발생할 수 있습니다.


이들을 비정상적인 형태라 한 이유는 우리가 3차원 공간에서 아무리 물체를 회전시키고 위치를 변경해도 오른쪽 형태와 같은 영상이 나올 수 없기 때문입니다. 물론 뒤집힘의 경우는 발생은 가능하지만 패턴매칭 관점에서는 역시 비정상적인 상황입니다. 평면물체의 모든 3D 변화는 homography로 표현할 수 있지만 반대로 모든 homography 변환이 실제 영상에서 일어날 수 있는 변환인건 아닙니다.


다음은 위와 같은 비정상적인 변환이 발생할 수 있는 시나리오입니다. 영상에서 도로 표지판을 검출하는 알고리즘을 개발하고자 합니다. 먼저, 표지판에 대한 영상에서 특징점(sift, surf 등)을 추출하여 DB에 저장해 둡니다. 이제 입력 영상에서 특징점을 추출한 후에 DB에 저장된 특징점들과 매칭을 수행합니다. 매칭된 특징점들 사이의 변환관계를 RANSAC(RANSAC의 이해와 영상처리 활용 참조)을 이용하여 affine이나 homography로 근사합니다. 이 때 구해진 변환관계는, 원래 매칭이 잘못되었거나 또는 RANSAC이 실패한 경우 위와 같은 뒤집힘, 뒤틀림, 오목 등이 빈번하게 발생합니다.


한 해결법은 구해진 변환이 위 경우(뒤집힘, 뒤틀림, 오목)에 해당하는지를 검사하여 만일 그렇다면 매칭에 실패한 것으로 판단하는 것입니다.


정상적인 변환인지 여부를 판단하는 방법은 다음과 같습니다.


구해진 (h9=1이 되도록 normalized된) 2D homograpy 변환이 다음과 같다고 했을 때,


 --- (1)


보통 다음 조건을 하나라도 만족하면 비정상적인 변환으로 판단합니다.


 ___ (2)


식 (2)에서 D는 처음 2×2 부분행렬([h1 h2; h4 h5])의 행렬식 값(determinant)이고 sx는 x축 스케일 팩터(scale factor), sy는 y축 스케일 팩터, P는 perspective 정도를 나타냅니다.


Homogeneous 형태로 표현된 3×3 2D 변환행렬에서 처음 2×2 부분행렬은 회전, 스케일, shearing, reflection 파트를, [h3, h6]는 평행이동(translation)을, h7, h8은 원근(perspective) 변화를 나타냅니다.


D<0라 함은 점들 사이의 회전 순서가 지켜지지 않았음을 의미하며 뒤집힘 또는 뒤틀림이 발생했음을 의미합니다. sx는 처음 2×2 부분행렬에 의해 x축 단위벡터 [1 0]T가 얼마나 길이가 변했는지를 나타내며 sy는 y축 단위벡터의 길이(scale) 변화를 나타냅니다. 위 조건식에서 sx, sy < 0.1은 원래 물체의 크기에 비해 너무 스케일이 작아졌는지 여부를, sx, sy > 4는 너무 켜졌는지를 검사하는 것입니다. 식 (2)에 있는 스케일 조건은 참고용일 뿐이며 자신의 문제에 따라서 정상 범위를 적절히 조절하면 됩니다. 마지막으로 P는 perspective 효과(사각형이 사다리꼴로 되는 것)가 난 정도를 나타내는데, 이 값이 0이면 perspective 효과가 전혀 나타나지 않음을 의미합니다. 즉, P>0.002는 perspective가 너무 심하게 일어난 경우를 비정상적인 경우로 간주하겠다는 의미이므로 문제에 따라서는 이 조건을 사용하지 않아도 무방합니다 (또는 threshold를 적절히 조절하여 사용해도 됩니다).


단, 오목(concave)한 경우는 위 D<0 조건으로는 검사가 되지 않습니다. 오목한 경우를 알아내기 위해서는 (0, 0), (1, 0), (0, 1), (1, 0) 네 점을 처음 2×2 부분행렬로 변환시킨 후 변환된 결과가 오목한지 여부를 검사해야 합니다. 오목 여부의 판단은 [수학 이야기] - 다각형 도형의 면적(넓이) 구하기 글을 참고하세요.


Affine 변환의 경우에는 h7 = h8 = 0인 경우로서, P는 항상 0입니다. 따라서, affine 변환이 정상적인지 여부는 D, sx, sy를 구해서 위와 마찬가지로 조건을 검사하면 됩니다.


by 다크 프로그래머


  • BlogIcon 곰돌이만세 2013.07.12 09:54 신고 ADDR 수정/삭제 답글

    감사합니다. 제약조건을 걸어주셨네요.
    이 아이디어를 당장 활용할만한 알고리즘이 있어서 확인을 한번 해보겠습니다^^

  • 수제자 2013.07.18 15:30 신고 ADDR 수정/삭제 답글

    그렇지 않아도 호모그라피 평가 방법에 대해 고민하고 있었는데 좋은 자료 감사합니다.
    실례가 되지 않는다면 언급하신 '정상적인 변환인지 여부를 판단하는 방법'에 관한 논문이나 자료 출처를 좀 알수 있을까요?
    항상 좋은 자료 올려주셔서 감사드리며, 저도 도움이 좀 되고 싶은데 아직은 실력이 미진하여 죄송할 따름입니다.
    열심히 매진하겠습니다.
    감사합니다.

    • BlogIcon 다크pgmr 2013.07.18 18:11 신고 수정/삭제

      조건식 (2)는 http://cvlab.epfl.ch/research/detect/dbrief에서 다운받을 수 있는 DBrief_demo를 참조한 것입니다.
      위 조건식에 대한 해석이나 설명은 나름 정리한 것이라 따로 출처는 없습니다. 관련 내용이 정리된 문서나 자료가 있는지 여부는 저도 잘 모르겠네요..

  • 열공학생 2013.08.26 11:20 신고 ADDR 수정/삭제 답글

    안녕하세요 현재 opencv의 Homography과 cvWarpPerspective를 공부하는 학생입니다.
    cvWarpPerspective를 이용하여 이미지를 변환하는것에는 성공을 했지만 변환에 따라 이미지가
    짤리는 현상이 생겨 검색중에 이곳에 찾아오게 되었습니다.
    Homography의 h3과 h6부분이 평행이동을 나타낸다는 글을 보고 이미지가 짤리는 만큼의 값을 h3,h6에 더해주었는데 전체 이미지가 이동만이 아닌 변형이 일어나 질문을 드리게 되었습니다.
    Homography 매트릭스에 단순한 평행이동을 더해주기 위해서 어떻게 해야 되는지 질문드리고 싶습니다.

    • BlogIcon 다크pgmr 2013.08.26 22:42 신고 수정/삭제

      안녕하세요.
      원근효과(perspective)가 평행이동에도 영향을 미치기 때문으로 생각합니다.
      평행이동하고자 하는 값을 tx, ty, 원래 homography 행렬을 H = [h1, h2, h3; h4, h5, h6; h7, h8, 1]라 했을 때, H' = [h1+h7tx, h2+h8tx, h3+tx; h4+h7ty, h5+h8ty, h6+ty; h7, h8, 1]와 같이 수정해 보시기 바랍니다. 아니면 평행이동된 좌표에 대해서 homography를 새로 구하는 것도 방법이겠네요.
      첫번째 방법은 될거라 생각하지만 직접 테스트해 본 건 아닙니다. 한번 해 보시고 동작하는지 여부를 댓글로 알려주시면 감사하겠습니다.

  • 열공학생 2013.08.27 15:20 신고 ADDR 수정/삭제 답글

    안녕하세요. 어제 질문드렸던 열공학생입니다. ^^
    어제 질문을 드리고나서 해결책으로 대응점에 대한 값을 평행이동시켜 다시한번 homography행렬을
    만들어 해결을 했었습니다. 그래도 homography행렬을 다시한번 만들어야 된다는 점에서 찝찝함을 가지고 있었는데 오늘 달아주신 댓글을 확인하고 적용시켜본결과 결과값이 아주 잘 적용되어 나왔습니다.
    정말 감사합니다. ^^
    그리고 알려주신 수식을 나름대로 생각해 보았는데
    H' = T(3X3 이동매트릭스) H로 계산되어 나온 수식이 맞는것인지 다시한번 여쭤보고 싶습니다.

    • BlogIcon 다크pgmr 2013.08.27 15:18 신고 수정/삭제

      잘 동작한다니 다행이네요 ^^

    • BlogIcon 다크pgmr 2013.08.29 14:45 신고 수정/삭제

      지금보니 수식에 대한 질문이 있었네요.
      알려드린 수식은 X = [x,y,1]에 H를 곱한 결과를 HX = [a,b,w]라 했을 때, 이를 tx, ty만큼 평행이동시킨 [a+w*tx, b+w*ty, w]가 되도록 즉, H'X = [a+w*tx, b+w*ty, w]가 나오도록 H'을 구한 것입니다.

  • 감사합니다 2013.09.25 20:31 신고 ADDR 수정/삭제 답글

    안녕하세요.
    매번 인터넷 검색을 하게 되면 최종 목적지는 이곳인것 같습니다.
    homography를 직접 구현해 보려는 학생입니다.
    현재 특징점 매칭 까지는 끝낸 단계지만, 이후 opencv를 사용하면 한방에 해결되지만 직접
    구현해 보려고 합니다.
    1. 매칭 까지 끝낸 상태에서의 좌표점을 가지고 RANSAC을 이용해 호모그래피를 추정하는것으로 알고있습니다. 기존 이미지의 호모그래피와 투영된 좌표의 호모그래피 2가지 수치를 비교해 임계값 이상이면 올바른 호모그래피로 판단하고 이 결과중 오차가 가장 작은 것을 호모그래피로 판단하는 것이 맞는지 궁금합니다.
    2. 호모그래피를 구할때 투영 변환식의 경우 좌표쌍이 최소 4개 필요한것으로 알고 있습니다. 이러한 좌표쌍을 이용해 호모그래피를 추정할때 4개의 좌표쌍을 선택하는 기준이 있는지 혹은 랜덤 인지요?

    • 감사합니다 2013.09.25 20:48 신고 수정/삭제

      검색을 좀더 해보니 특이값 분해(SVD)를 사용하여 투영변환행렬을 추정한다고 정보검색이 되었습니다..역시 비전은 파면 팔수록 매력있는 분야인것 같네요..

    • 감사합니다 2013.09.25 22:21 신고 수정/삭제

      검색결과 자답합니다.

      http://www.cim.mcgill.ca/~langer/558/2009/lecture19.pdf

      여기에 나름 괜찮은 결과가 있어서 올려 봅니다..

      저와 비슷한 고민하신분 해결되셧으면 좋겠네요

    • BlogIcon 다크pgmr 2013.09.26 06:56 신고 수정/삭제

      안녕하세요. 추석 명절은 잘 보내셨는지요?
      좋은 정보 올려주어서 감사합니다.
      그 동안은 주로 제가 답글을 달았었는데, 이렇게 정보도 공유해 주시고 참 좋습니다 ^^

      원 질문에 대해 부족하나마 답변을 드리면,
      1. 흐름은 거의 맞습니다. 구한 호모그래피로 투영한 좌표와 원래 좌표와의 오차가 임계값 이하인 것들의 개수가 최대인 호모그래피를 최종선택합니다.
      2. 보통은 기준없이 그냥 무작위로 뽑습니다만, RANSAC의 한 변형인 PROSAC처럼 매칭쌍에 score를 매겨서 score가 높은 애들이 뽑힐 확률을 높여주는 방법도 있습니다. score로는 매칭된 local feature 사이의 유사도를 사용하면 됩니다.

  • 감사합니다 2013.10.04 16:35 신고 ADDR 수정/삭제 답글

    안녕하세요~
    호모그래피 정규화에 대해 질문드리고자 합니다.
    https://www.cs.ubc.ca/grads/resources/thesis/May09/Dubrofsky_Elan.pdf 자료를 보고 어느정도 감은 잡혔는데, 정규화 과정이 제가 상상한게 맡는 지 여쭤보고 싶습니다.
    일단 좌표를 랜덤으로 선택한뒤에 투시변환행렬을 구하여 좌표 변경 까지는 코드로 작성한 상태입니다. pdf파일을 보니 좌표 자체가 스케일에 영향을 받으므로 원점으로 이동시켜 유사행렬을 작성한뒤, 해당 좌표를 원점기준으로 회전및 이동한 좌표를 투시 변환행렬(호모그래피 행렬, H)을 구하는것인가요?
    pdf 2.11에 나와있는 정규화 과정 중 1,2번이 가장 이해가 안가는것 같습니다.
    1번이 유사행렬 T를 구하는 과정을 설명한것 같습니다. 기존 좌표와 원점 위치에서 루트(2)만큼, 거리로 따지면 상하좌우 픽셀을 주변 픽셀을 이용해 유사행렬을 구하는 것으로 이해했습니다.
    2번은 그 유사행렬을 이용해 기존 좌표를 변환한뒤 두 좌표를 이용해 호모그래피, 즉 투시행렬을 구하는 것이구요.
    위의 과정이 전반적으로 맞게 상상한? 것인지 조언 부탁드립니다.
    매번 질문만 드려서 정말 죄송합니다..

    • BlogIcon 다크pgmr 2013.10.04 19:34 신고 수정/삭제

      실질적인 구현과 관련된 좋은 질문이십니다.
      그러한 과정을 data normalization이라고 하는데 homography를 구하는데 있어서는 필수 전처리 과정으로 알려져 있습니다 (multiview geometry in computer vision 책의 3.4 transformation invariance and normalization 절 참조).
      데이터 정규화가 필요한 이유는 회전변환과 스케일 변환의 기준점이 좌표축의 원점이기 때문입니다.
      어떤 물체에 대해 이미지 A에서 B로의 변환을 구한다고 할 때, A에 대해 회전변환을 하면 그 물체의 중점을 중심으로 회전이 되는게 아니라 좌표축 원점을 중심으로 회전이 일어납니다. 스케일 변화도 마찬가지입니다.
      따라서 A->B 관계를 직접 근사한 호모그래피 변환은 억지로 매핑을 맞춘 잘못된 변환인 경우가 많습니다. 이를 해결하기 위해 A 좌표들의 중심(평균)을 m, 중심(m)과의 평균거리를 d라고 했을 때, A' = sqrt(2) * (A - m)/d로 정규화하고 B도 B' = sqrt(2) * (B - m(B))/d(B)로 정규화한 후 A'->B'에 대한 homography를 구하면 훨씬 좋은 성능의 호모그래피를 얻을 수 있다는 방식입니다. 이렇게 A'->B'에 대해 변환 H' (즉, B' = H'A')을 구한 후 원래의 변환을 H = T'-1 H' T (단, A' = TA, B' = T'B)로 계산합니다.

      책에는 스케일까지 sqrt(2)로 정규화하라고 되어 있긴 합니다만 개인적인 생각으로는 중심만 원점으로 정규화해 줘도 충분하다고 생각합니다. 다만, A, B 모두 스케일까지 정규화해서 사용하면 RANSAC 등에서 residual 임계치를 잡을 때 물체 크기에 비례한 값을 잡을 수 있다는 장점이 있을 수 있습니다.

    • BlogIcon 다크pgmr 2013.10.07 09:32 신고 수정/삭제

      안녕하세요.
      1. 먼저 opencv에 있는 findHomography 함수에도 좌표 정규화 과정이 사용됩니다. opencv/modules/calib3d/src/fundam.cpp 파일의 int CvHomographyEstimator::runKernel(...) 함수 구현을 보시면 확인 가능합니다.
      2. 좌표 정규화 방법은 A = {(xi,yi)}라 했을 때, mx = mean(xi), my = mean(yi), dx = mean(abs(xi - mx)), dy = mean(abs(yi-my)), xi' = sqrt(2)*(xi-mx)/dx, yi'=sqrt(2)*(yi-my)/dy에 의해 A'={(xi',yi')}로 정규화 됩니다. B도 마찬가지로 과정으로 정규화됩니다. 이렇게 1D로 좌표별로 각자 해도 되고 아니면 2D로 해도 됩니다. 2D로 할 때에는 d = norm{(xi,yi)-(mx,my)}과 같이 계산되고 sqrt(2)도 곱해줄 필요 없을 것입니다.
      3. 마지막으로, opencv와 직접 구현하신 것에 차이가 발생하는 것이 좌표정규화 외에 H를 구하는 방식의 차이, T를 구하는 방식이 맞는지, 또는 RANSAC 과정에서 차이가 발생하는 것인지 등 확인해 보시기 바랍니다.
      4. 만일 보내주신 그림에서 4개의 매칭쌍만 가지고 opencv 결과, 직접 구현 결과 비교하신 거라면, 좀 이상한 부분이 있습니다. 원래 4개의 매칭쌍이 있으면 자표정규화 관계없이 호모그래피가 유일하게 결정되기 때문에 차이가 발생하면 안됩니다. 호모그래피가 유일하지 않고 근사적으로 구해야 하며 좌표정규화나 구하는 방식 등에 따라서 차이가 발생하는 경우는 매칭쌍이 4개보다 많은 경우의 얘기입니다.

    • 감사합니다 2013.10.07 13:59 신고 수정/삭제

      안녕하세요.

      조언해주신것처럼 확인해보니 좌표 정규화 전에도 호모그래피가 일정치 않다는 문제점이 있는것 같습니다.

      좌표를 13개를 기준으로 랜덤으로 선택해서 RANSAC 반복 조건에 의해 오류 거리가 최소가 되는 지점을 선택했는데, 이 부분을 다시한번 검토해 봐야할것 같습니다. 정확히 나오면 좌표 정규화를 통해 좀더 정확한 호모그래피를 추출할수 있도록 시도해 봐야겠습니다.

      조언 감사드립니다.

  • 감사합니다 2013.10.10 23:09 신고 ADDR 수정/삭제 답글

    다크님 조언 덕분에 opencv를 사용하지 않고 호모그래피 구현에 성공했습니다!

    결과를 보니, 좌표를 정규화 한때와 안하고 구한 호모그래피가 거의 차이가 없어서...OTL

    CV보다 10배는 느려서 속도만 개선하면 될것 같습니다.

    이제 코드 최적화를 해봐야겠네요.

    그래도 많은것을 배운것 같습니다.. 감사드립니다.

    • BlogIcon 다크pgmr 2013.10.11 08:25 신고 수정/삭제

      축하합니다 ^^
      좌표 정규화하는 것(차이 나는 부분)에 대해서는 나중에 기회가 되면 답글을 달거나 글을 추가하도록 하겠습니다.

  • 데이 2014.04.25 01:38 신고 ADDR 수정/삭제 답글

    안녕하세요.

    PROSAC에 관해 질문있습니다.

    논문을 읽고 한번 리뷰 중인데, 이해가 잘 안되는 부분이 있어서 여쭤봅니다.

    PROSAC은 data 선택시 inlier일 확률이 높은 것을 먼저 선택한다고 적혀있는데(다크님께선 score를 말씀하셧구요)

    feature의 distance는 어떻게 측정하는 것인가요?
    (local feature의 유사도가 어떤것을 말씀하시는지 궁금합니다)

    • BlogIcon 다크pgmr 2014.04.25 10:06 신고 수정/삭제

      예를 들어, 영상에서 라인을 찾는다고 할 때 과정을 살펴보면 먼저 각 픽셀에 대해 edginess를 조사하고 edginess가 임계값 이상인 픽셀들을 edge 픽셀로 선택합니다. 그리고 이들에 대해 line fitting을 수행합니다. 이 경우 prosac을 적용한다면 edginess가 높은 edge 픽셀들을 먼저 선택하여 line fitting을 시도하는 방식일 것입니다.
      두 영상간의 특징점을 매칭하고 매칭된 특징점 사이의 매핑관계(변환관계)를 찾는 것이 목적일 경우, 매칭된 특징점 사이의 유사도는 어떤 feature를 사용했느냐에 따라 다양하게 측정될 수 있을 것입니다. 보통은 해당 특징점을 중심으로 하는 local 이미지 패치(patch)들 사이의 유사도를 측정하는데, SSD(픽셀 밝기차의 제곱합), NCC등과 같이 두 이미지 패치의 픽셀값을 그대로 비교하는 방법, SIFT 등과 같이 gradient histogram을 비교하는 방법, ... 등등 매우 다양한 방법이 존재합니다.

    • 데이 2014.04.25 11:01 신고 수정/삭제

      추가적인 local 매칭 방법이 필요해서 RANSAC보다 속도면에서 떨어질것으로 예상했는데, gradient 크기를 비교하면 되는것 같네요. 감사드립니다^^

  • 샌달 2014.08.05 14:13 신고 ADDR 수정/삭제 답글

    안녕하세요
    현재 opencv의 Homography과 cvWarpPerspective를 구현해보려고 하는데
    이해력이 많이 딸리는지 약 일주일간 엄두도 못내고 있습니다 ㅠ
    여기 댓글들을 보면 정말 대단하신것 같아요
    댓글다신 모든 분들에게 대면하여 가르침을 받고 싶습니다.(__)
    전국 어디든 가겠습니다.
    혹은 스터디 나가거나 하시는곳이 있으시면 초대 부탁드려요 될까요?
    글 주제에 벗어난점 죄송합니다.

    • BlogIcon 다크pgmr 2014.08.07 11:36 신고 수정/삭제

      해당 함수들에 대한 opencv의 구현 소스코드를 직접 참조해 보시면 도움이 되지 않을까 싶습니다.

  • topme 2014.10.21 05:05 신고 ADDR 수정/삭제 답글

    안녕하세요. 영상처리에 관심을 가지고 공부하는 학생입니다.
    현재 opencv에서 제공하는 findhomography()를 통하여 생성된 homography의 정상여부를 판별하는 방법을 알아보는 중에 이 글을 보게 되었습니다.
    중간에 보면 h9=1로 normalization 된 H에 한해서 판별식을 제안하셨는데, findhomography()를 통하여 얻은 H의 경우 h9 의 값이 1이 아닌데, 이 경우는 위의 판별식이 성립이 안되는 것이 맞는 것인지 궁금합니다.
    또한 이 H에서 h9 =1 로 만들어주는 normalization을 실행 후 적용한다면 될 것이라 생각은 했는데, normalization을 어떻게 해줘야 되는지 모르겠네요.
    댓글 중에서도 homography normalization에 관한 좋은 글이 있는 것 같은데, 이해가 잘 되지 않네요. 실례가 안된다면 쉽게 풀이 좀 부탁드리겠습니다.

    • BlogIcon 다크pgmr 2014.10.21 11:06 신고 수정/삭제

      안녕하세요. h9가 1이 아닐 경우에는 H의 모든 원소를 h9로 나눠주면 됩니다. 그리고 만일 h9가 0이라면 H가 비정상이라고 판단하면 될 것 같습니다.

    • topme 2014.10.21 13:56 신고 수정/삭제

      답변 감사합니다. 덕분에 많은 진전이 있었습니다.
      한가지 더 물어보고 싶은 것이 있는데, 판별할 때 뒤틀림과 뒤집힘을 서로 구분을 할 수 있는지도 문의 드려봅니다.

    • BlogIcon 다크pgmr 2014.10.21 18:13 신고 수정/삭제

      글쎄요.. 어떤 식으로든 구분은 가능하겠지만 간단하게 구분할 수 있는 방법은 잘 떠오르지 않습니다.

  • 오갱 2015.03.10 11:38 신고 ADDR 수정/삭제 답글

    4개의 2차원 매칭쌍으로 간단한 Homography 행렬을 구하여 사용하고 있습니다. 물론 회전 축 및 거리( sqrt(2)를 정규화하였구요. 이에 따라 유일한 Homography 해를 구하였는데, 문제가 있는 것 같습니다. 저는 Homography의 3행 1열 및 2열 즉, Projectivity 에 관심이 있는데, 정규화를 할 경우, Projectivity가 변하게 됩니다. 예를 들어 정사각형 A (10,10)~(-10,10)~(-10,-10)~(10,-10)를 사다리꼴 B (6,10)~(-6,10)~(-10,-10)~(10,-10)으로 변환하는 Homography에서 Normaliza전에는 Y projectivity가 0.25가 나오는 반면, Normalization 된 후에는 Y projectivity가 0.025가 됩니다. 정규화 과정에서 스케일 팩터가 곱해져 나오는 것입니다. 이렇게 되면 Projectivity가 바뀌는데, 정확히 Projectivity의 물리적(수학적) 의미가 무엇인지 문의 드려봅니다. 이를 질문하는 또 한가지 이유는 저의 경우, 동일한 형태의 다운스케일 된 변환 정사각형 C (1,1)~(-1,1)~(-1,-1)~(1,-1)를 사다리꼴 D (0.6,1)~(-0.6,1)~(-1,-1)~(1,-1) 변환시 정규화 전의 Projectivity는 0.25로 동일하고 반면, 정규화 이후에도 0.25가 됩니다. 정사각형 C는 스케일 정규화가 필요없기 때문입니다. 감사합니다.

    • BlogIcon 다크pgmr 2015.03.11 06:14 신고 수정/삭제

      안녕하세요. 데이터를 정규화하여 구한 homography는 원래의 homography가 아니기 때문에 원래의 homography를 다시 복원해 줘야 합니다. 복원 방법은 2013년 10월 4일자 댓글 답변을 참조하시기 바랍니다. projectivity(=perspectivity)는 원근 변환 정도를 나타냅니다. 쉽게 생각하면 사각형이 사다리꼴이 되는 경우인데, 우리가 실제 사물을 보는 것처럼 가까운 것은 크게 보이고 멀리 떨어진 것은 작게 보이는 것을 말합니다. 종이 위에 사각형을 그린후 종이를 옆에서 비스듬하게 보면 사다리꼴 형태로 보일 것입니다. 종이를 수직으로 보면 이러한 원근감이 나타나진 않지만 옆에서 비스듬하게 볼수록 원근감이 커집니다. Homography의 h7,h8은 두 도형 사이의 원근 변화 차이가 얼마나 큰지를 나타냅니다.

  • 오갱 2015.03.11 12:45 신고 ADDR 수정/삭제 답글

    아마도 정규화와 Denormalization간 용어 사용에 문제가 있었나 봅니다. 예를 들어서 정사각형의 좌표 P1~P4를 임의의 사각형 Q1~Q4로 옮기는 Homography(H)를 구함에 있어 Pi들의 정규화 행렬은 T_P, Qi들의 정규화 행렬은 T_Q라고 하겠습니다. 즉, Pi_norm=T_P*Pi 이고 Qi_norm=T_Q*Qi입니다. Pi_norm과 Qi_norm 간의 Homography를 구해 H_norm이라고 하면, Denormalization을 통해 원래 구하려는 H=inv(T_Q)*H_norm*T_P 를 구한다고 이해하고 있습니다. 이 때 제가 구한 H의 Projectivity가 H_norm의 Projectivity와 다르게 되는데요... 이것이 정상인지 알고 싶습니다. 정확히 말씀드리면, 그렇지 않아야 될 것 같은데, h7과 h8이 T_P를 곱하면서 변하게 됩니다.

    • BlogIcon 다크pgmr 2015.03.11 13:49 신고 수정/삭제

      글을 읽다보니 조금 혼동스러운 부분이 있어서 여쭤봅니다. 정규화 없이 구한 H1와 정규화와 denormalization을 거쳐서 구한 H2가 차이가 나는 점을 말씀하시는 건가요? 아니면 H2와 H_norm 간에 차이가 난다는 말씀인가요? 만일 전자라면 저도 확인해 봐야 할것 같고, 후자라면 차이가 나는게 정상일 것 같은데 혹시 같아야 되는 이유에 대해 여쭤봐도 될런지요.

  • 오갱 2015.03.12 11:27 신고 ADDR 수정/삭제 답글

    제가 문의 드리는 점은 후자의 경우입니다. 정규화 없이 구한 homogrphy는 고려하지 않고 있습니다. 예를 들어, 정사각형 A : (10,10), (-10,10), (10,-10), (-10,-10) 와 사다리꼴 B : (6,10), (-6,10), (10,-10), (-10,-10) (윗변만 줄여서...) 간의 homography를 구하는데, H2의 Y projectivity (H2(8))는 0.025, H_norm의 Y projectivity는 0.25로 계산이 되었습니다. 정사각형 윗변의 길이가 20에서 12로 감소하였으므로, 직관적으로는 0.25가 맞는 것 같은데, 제 생각으로는 H_norm보다는 denormalize 된 H2의 Y projectivity를 사용하는 것이 맞다고 생각되므로 문제가 있습니다. 또한 A,B를 열배 축소시켜서 H2와 H_norm의 Y projectivity를 구하면, 그 값이 0.25로 동일합니다. 즉, 제 경우에 H2의 Y projectivity는 사각형 스케일에 영향을 받는 것 같습니다. 어쨌튼 저는 A_norm과 B_norm이 아닌 A와 B 사이에 관계를 구해야 하므로 H2를 사용하는 것이 맞는 것 같은데 Projectivity 값이 저렇게 작게 나오고 스케일에 영향을 받는지 궁금한 상태입니다. 사실 저는 이 분야에서 일하는 사람이 아니라서 주시는 답변이 항상 도움이 됩니다. 감사드립니다.

    • BlogIcon 다크pgmr 2015.03.12 14:51 신고 수정/삭제

      값이 달라지는지 여부는 사실 저는 확인해 보지 않아서 잘은 모릅니다. 하지만 h8의 값에 대해서는 약간 오해가 있으신 것 같습니다. [x',y',w]^t=H[x,y,1]^t 에서 w = h7x+h8y+1 이고 x''=x'/w, y''=y'/w 가 H에 의해 변환된 최종 좌표가 됩니다. 따라서, h7=0이고 h8>0인 경우에 w = h8y+1 이므로 y>0이면 w>1이 되어서 y에 비례하여 x', y'의 값이 줄어들게 되고, y<0면 w<1게 되어서 w로 나누면 x', y'의 값이 늘어나게 됩니다. 사각형이 그려진 종이를 비스듬히 보는 효과가 나오는 것입니다. 그리고 h8이 커지면 커질수록 y값 변화에 대한 민감도가 커질 것입니다. 즉, 사각형 윗변의 길이가 20에서 12로 되었다고 해서 h8 = 0.25인 것은 아닙니다. 데이터를 정규화한 후에 H_norm을 구했을 때 h7, h8이 어떤 영향을 받는지는 저도 직접 계산으로 따져봐야 알 것 같습니다만 제가 설명드린 원리를 참고로 생각해 보시면 좋을 것 같습니다.

  • 오갱 2015.03.13 02:17 신고 ADDR 수정/삭제 답글

    그렇다면 저의 질문은 Projectivity 값의 물리적 의미가 무엇인가가 되는 것 같습니다. 아마 이것이 영상처리에서는 중요한 질문이 아닌가 봅니다. 한변이 20인 정사각형의 윗변이 12로 줄었을 때 Y Projectivity의 값이 정확히 무엇인지를 안다면 제가 H2의 값을 사용할지 H_norm의 값을 사용할지 좀 더 명확해질 수 있을 것 같습니다. 당연히 H2를 사용해야 할 것 같지만, 0.025는 좀처럼 물리적으로 와닿지가 않는 값이라서요. 또한 열배 작은 사각형에서는 0.25가 구해지는 등 스케일에 영향을 받기도 하고요. 책과 자료들을 찾아보고 있는데, 이 분야에 계시는 분들보다는 접근성이 좀 떨어지는 것 같습니다. 혹시나 쉽게 계산 가능하시면 부탁드립니다. 염치 없이 계속 질문 드리는군요. 감사드립니다.

    • BlogIcon 다크pgmr 2015.03.13 17:13 신고 수정/삭제

      어렵네요.. 저도 테스트를 해 보니 p' = Hp라 할 때 H의 원근성분(h7, h8)이 p의 스케일에 영향을 받는 것 같습니다(p의 스케일에 반비례). 그리고 재미있는 것은 또 p'의 스케일에는 영향을 받지 않습니다. 그렇다면 원근정도에 대한 기하학적인 해석을 위해서는 H_norm의 h7, h8 값을 이용하는 것이 맞을 것 같습니다. 구체적인 기하학적 수식화는 저도 알지 못합니다. 다만, 아시겠지만 어떤 고정된 카메라와 평면이 있고 평면 위에 도형이 있을 때, 이 평면 위에서 도형이 이동하고, 크기가 변하고, 회전하고, 옆으로 늘어나고 하는 등의 변화는 원근변화가 아닙니다. 원근변화는 도형이 놓여져 있는 평면 자체가(또는 카메라가) 움직이는 것으로서, 평면 A가 평면 B로 변했을 때 두 평면 사이의 사잇각이 얼마나 큰지가 원근변화의 크기 정도를 나타냅니다. 그런데 이 값이 실제 호모그래피의 h7, h8에는 어떤 정도로 반영될지는 실험을 해봐야 알 것 같습니다.

  • 오갱 2015.03.14 01:21 신고 ADDR 수정/삭제 답글

    정말 감사드립니다. 두 가지 사각형간 변환을 통해 나오는 값들로, 제가 대충 이해한 것인데 정확한 것은 모르겠지만, 적어도 설명은 할 수가 있는 것 같습니다.
    (1) 한변 길이 20의 정사각형 -> 윗변을 12 : Y projectivity = 0.025 (in denormalized H)
    따라서, Centroid지나는 X길이 :16
    (16-12)/16/10=0.025
    (2) just 스케일 다운 : 길이 2의 정사각형 -> 윗변을 1.2 : Y projectivity =0.25 (in denormalized H)
    따라서, Centroid지나는 X길이 :1.6
    (1.6-1.2)/1.6/1=0.025
    따라서 Y projectivity는 Centroid를 지나는 X 방향의 길이가 단위 거리의 Y 방향 진행에 따라 감소하는 비율을 나타내는 거 같습니다.
    즉, (1)에서 16의 길이는 Y 방향으로 1만큼 이동했을 때, 16*0.025 만큼 줄어들어서 16-16*0.025가 되고 Y가 10인 위치에서는 16-16*0.025*10만큼 줄어서 12가 되는 스토리인 것 같습니다.
    따라서 변환 전 정사각형의 크기가 Y Projectivity에 영향을 주는 것 같습니다.
    왜 이렇게 사용하는지는 모르겠는데 (2)에서도 이렇게 하면 맞긴 맞습니다. 글로 하기에는 참 길고 두서없는 질문이었는데 너무 성실히 답변해 주셔서 아주 많은 도움이 되었습니다. 혹시나 저도 더 알게 되는 것이 있으면, 다시 댓글 달겠습니다. 다시 한번 감사드립니다.

    • BlogIcon 다크pgmr 2015.03.14 09:11 신고 수정/삭제

      감사합니다. 덕분에 저도 많이 배웠고 막연히 알고 있었던 homography의 원근성분에 대해 좀더 깊게 생각할 수 있는 계기가 되었습니다. 지식을 추구하는 사람으로써 그 끝을 추구해야 함에도 현실적인 이유로 시간에 많은 제약을 받는 것 같습니다.
      설명해 주신 해석에 대해서도 이해하였고 충분히 타당한 해석이라고 생각합니다. 거기에 제가 이해하고 있는 내용을 조금 더 덧붙여 보고자 합니다.
      : Homography에서 원근변환 성분은 일종의 가변적 스케일(scale) 변환이라고 볼 수 있습니다. 일반적인 스케일 변환은 s*(x, y) = (s*x, s*y)와 같이 (x, y) 좌표에 관계없이 어떤 고정된 상수 스케일 s에 대해 일괄적으로 도형의 스케일이 변하는 것이지만, 원근변환은 스케일 자체가 (x, y)에 대한 함수로 결정되는 형태로서 s(x,y)*(x, y) = (s(x,y)*x, s(x,y)*y)와 같이 (x, y) 좌표에 따라서 스케일이 달라지는 변환입니다. 그리고 실제 homography에서 그 스케일 함수는 s(x,y) = 1/(h7*x + h8*y + 1)로 주어집니다. 따라서, h8>0인 경우에 y가 커지면 s(x,y)가 작아지므로 도형의 스케일이 y에 비례하여 줄어들고 반대로 y가 작아지면(y<0) 스케일 s(x,y)가 증가하여 도형이 확장되는 효과가 발생합니다. 그리고 h8의 절대값이 크면 클수록 조그만한 y 변화에도 급격한 s(x,y)의 변화가 발생하기 때문에 훨씬 심한 y축 방향으로의 perspective 효과가 나타나게 됩니다. 마찬가지로 x축 방향으로는 h7에 의해서 perspective 효과 정도가 결정되게 됩니다. *
      오갱님이 해석하신 내용을 좀더 확장하여 도형의 공간 전체가 자신의 y 좌표에 비례하여 축소 또는 확장하는 것으로 이해하시면 좋을 것 같습니다.