이동, 대칭, 회전, 워핑 09 장기하학적변환 영상의이동기하학적변환 영상의대칭기하학적변환 영상의회전기하학적변환 영상의워핑기하학적변환 한빛미디어 ( 주 )
학습목표 9 장. 이동, 대칭, 회전, 워핑기하학적변환 이동의기하학적변환을공부한다. 대칭기하학적변환을공부한다. 회전기하학적변환의원리를학습한다. 회전기하학적변환에고려할사항을소개한다. 워핑을이해하고수행방법과응용분야를소개한다. 2
Section 01 영상의이동기하학적변환이동 (Translation) 기하학변환 디지털영상을평면의한위치에서원하는다른위치로옮기는연산디지털영상의크기나형태등이바뀌지않아원본영상과결과같음. 3
[ 실습하기 9-1] 이동기하학변환프로그램 1 ResourceView 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 메뉴추가 2 [MFC ClassWizard] 대화상자를이용해추가된메뉴에서영상이동을실행하는함수추가 3 Doc 클래스에다음프로그램추가 4
[ 실습하기 9-1] 이동기하학변환프로그램 void CImageProcessingDoc::OnTranslation() { int i,j; int h_pos = 30, w_pos = 130; double **temparra; m_re_height = m_height; m_re_width = m_width; m_re_size = m_re_height * m_re_width; m_outputimage = new unsigned char [m_re_size]; m_tempimage = Image2DMem(m_height, m_width); temparra = Image2DMem(m_Re_height, m_re_width); for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_tempimage[i][j] = (double)m_inputimage[i*m_width + j]; 5
[ 실습하기 9-1] 이동기하학변환프로그램 for(i=0 ; i<m_height - h_pos ; i++){ for(j=0 ; j<m_width - w_pos ; j++){ temparra[i + h_pos][j + w_pos] = m_tempimage[i][j]; // 입력영상을 h_pos, w_pos만큼이동 for(i=0 ; i< m_re_height ; i++){ for(j=0 ; j< m_re_width ; j++){ m_outputimage[i* m_re_width + j] = (unsigned char)temparra[i][j]; delete [] m_tempimage; delete [] temparra; 6
[ 실습하기 9-1] 이동기하학변환프로그램 4 View 클래스에다음프로그램추가 void CImageProcessingView::OnTranslation() { CImageProcessingDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); pdoc->ontranslation(); Invalidate(TRUE); 7
5 프로그램실행결과영상 [ 실습하기 9-1] 이동기하학변환프로그램 결과영상이오른쪽아래로이동함. 8
Section 02 영상의대칭기하학적변환대칭 (Mirroring) 기하학변환 영상을가로축이나세로축으로단순히뒤집는것세로축을중심으로뒤집는것 좌우대칭가로축을중심으로뒤집는것 상하대칭 9
좌우대칭 좌우대칭 영상을세로축을중심으로뒤집는것 즉, 영상내의한수직선을중심으로왼쪽화소와오른쪽화소를서로교환하는것 x ' ' ( x x0 x0 ) 0 10
[ 실습하기 9-2] 좌우대칭기하학변환프로그램 1 ResourceView 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 메뉴추가 2 [MFC ClassWizard] 대화상자를이용해추가된메뉴에서영상좌우대칭을실행하는함수추가 3 Doc 클래스에다음프로그램추가 11
[ 실습하기 9-2] 좌우대칭기하학변환프로그램 void CImageProcessingDoc::OnMirrorHor() { int i,j; m_re_height = m_height; m_re_width = m_width; m_re_size = m_re_height * m_re_width; m_outputimage = new unsigned char [m_re_size]; for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_outputimage[i*m_width + m_width - j - 1] = m_inputimage[i*m_width + j]; // 입력영상의배열값을출력영상을위한 // 배열의수평축뒷자리부터저장 12
[ 실습하기 9-2] 좌우대칭기하학변환프로그램 4 View 클래스에다음프로그램추가 void CImageProcessingView::OnMirrorHor() { CImageProcessingDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); pdoc->onmirrorhor(); Invalidate(TRUE); 13
[ 실습하기 9-2] 좌우대칭기하학변환프로그램 5 프로그램실행결과영상 거울에비치는효과와같다고해서좌우대칭을거울영상이라고함. (a) 입력영상 (b) 좌우대칭영상 14
15 상하대칭상하대칭영상을가로축을중심으로뒤집는것즉, 영상내의한수평선을중심으로위쪽의화소와아래쪽의화소를교환하는것 0 0 0 ) ( ' ' x x
[ 실습하기 9-3] 상하대칭기하학변환프로그램 1 ResourceView 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 메뉴추가 2 [MFC ClassWizard] 대화상자를이용해추가된메뉴에서영상상하대칭을실행하는함수추가 3 Doc 클래스에다음프로그램추가 16
[ 실습하기 9-3] 상하대칭기하학변환프로그램 void CImageProcessingDoc::OnMirrorVer() { int i,j; m_re_height = m_height; m_re_width = m_width; m_re_size = m_re_height * m_re_width; m_outputimage = new unsigned char [m_re_size]; for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_outputimage[(m_height - i -1)*m_width + j] = m_inputimage[i*m_width + j]; // 입력영상의값을출력영상을위한배열의수직축뒷자리부터저장 17
[ 실습하기 9-3] 상하대칭기하학변환프로그램 4 View 클래스에다음프로그램추가 void CImageProcessingView::OnMirrorVer() { CImageProcessingDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); pdoc->onmirrorver(); Invalidate(TRUE); 18
[ 실습하기 9-3] 상하대칭기하학변환프로그램 5 프로그램실행결과영상 입력영상이상하로서로뒤집힘. 19
회전 (Rotation) 기하학변환 Section 03 영상의회전기하학적변환 영상을임의의방향으로특정한각도 θ 만큼회전시키는것 x dest dest cos sin sin x cos source source 20
영상의회전기하학변환 ( 계속 ) 21
홀문제를해결하는방안 먼저회전기하학변환을역방향사상으로수행 영상의회전방향은원하는목적에따라다름 회전의방향을반시계방향으로설정한예 전방향사상에서회전방향은반시계방향, 역방향사상에서회전방향은시계방향이됨 22
회전결과보이는부분이줄어드는것을방지하는방법 회전결과 : 화소의좌표값이음 (-) 실제화소좌표는음의값일수없으므로해당부분은잘려안보이게됨. 23
회전결과보이는부분이줄어드는것을방지하는방법 ( 계속 ) 회전하려는영상의중심점이 (Cx, C) 이고, 이중심점을기준으로회전 하는전방향사상공식 x dest dest cos sin sin x cos source source C C x C C x 더효율적으로회전하기위해역방향사상을고려한공식 x source source cos sin sin x cos dest dest C C x C C x 24
올바른회전방향이되게하는해결방안 영상화소에서좌표를표시할때는왼쪽위가원점 ( 수학좌표에서는왼 쪽아래가원점 ). 25
올바르게회전하도록하려면화면좌표를수학적좌표로변환하여회전한뒤다시화면좌표로변환해야함. 이과정을반영한전방향사상공식 H 는영상의높이에서 1 을뺀값 H x dest dest 올바른회전방향이되게하는해결방안 ( 계속 ) imageheight ( x ( x source source C C x x 1 )cos (( H )sin ( H (( H source ) C source )sin C ) C x )cos ) C 역방향사상공식 x source source ( x dest ( x dest C x C )cos (( H x )sin ( H dest (( H ) C )sin C dest ) C x )cos ) C 26
올바른회전방향이되게하는해결방안 ( 계속 ) 27
출력영상의크기를고려한회전변환 회전기하학변환에서입력영상과출력영상의크기를같게하면출력영상에서잘려나가는부분이발생 회전의기준을원점에서영상의중심점으로변경하면이런문제를어느정도해결할수는있지만그래도잘려나가는부분발생 출력영상에서잘려나가는부분이없게하려면출력영상의크기를미리계산해야함. 출력영상의크기를구하는공식 ( 회전각도로계산 ) H, W : 원본영상의높이와너비 H, W : 회전한출력영상의높이와너비 W ' H' H cos(90 ) cos H cos W cos(90 ) 28
출력영상의크기를고려한회전변환 ( 계속 ) 29
[ 실습하기 9-4] 영상의회전기하학변환프로그램 1 ResourceView 창에서 [Menu]-[IDR_IMAGETYPE] 더블클릭 메뉴추가 2 [MFC ClassWizard] 대화상자를이용해추가된메뉴에서영상회전을실행하는함수추가 3 Doc 클래스에다음프로그램추가 30
[ 실습하기 9-4] 영상의회전기하학변환프로그램 void CImageProcessingDoc::OnRotation() { int i, j, CenterH, CenterW, newh, neww, degree = 45; // degree = 회전할각도 double Radian, PI, **temparra, Value; m_re_height = m_height; // 회전된영상의높이 m_re_width = m_width; // 회전된영상의너비 m_re_size = m_re_height * m_re_width; m_outputimage = new unsigned char [m_re_size]; PI = 3.14159265358979; // 회전각을위한 PI 값 Radian = (double)degree*pi / 180.0; // degree 값을 radian 으로변경 CenterH = m_height / 2; // 영상의중심좌표 CenterW = m_width / 2; // 영상의중심좌표 m_tempimage = Image2DMem(m_height, m_width); temparra = Image2DMem(m_Re_height, m_re_width); for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_tempimage[i][j] = (double)m_inputimage[i*m_width + j]; 31
[ 실습하기 9-4] 영상의회전기하학변환프로그램 for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ // 회전변환행렬을이용하여회전하게될좌표값계산 newh = (int)((i-centerh)*cos(radian) - (j-centerw)*sin(radian) + CenterH); neww = (int)((i-centerh)*sin(radian) + (j-centerw)*sin(radian) + CenterW); if(newh < 0 newh >= m_height){ // 회전된좌표가출력영상을위한배열값을넘어갈때 Value = 0; else if(neww < 0 neww >= m_width){ else{ // 회전된좌표가출력영상을위한배열값을넘어갈때 Value = 0; Value = m_tempimage[newh][neww]; temparra[i][j] = Value; 32
[ 실습하기 9-4] 영상의회전기하학변환프로그램 for(i=0 ; i< m_re_height ; i++){ for(j=0 ; j< m_re_width ; j++){ m_outputimage[i* m_re_width + j] = (unsigned char)temparra[i][j]; delete [] m_tempimage; delete [] temparra; 33
[ 실습하기 9-4] 영상의회전기하학변환프로그램 4 View 클래스에다음프로그램추가 void CImageProcessingView::OnRotation() { CImageProcessingDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); pdoc->onrotation(); Invalidate(TRUE); 34
[ 실습하기 9-4] 영상의회전기하학변환프로그램 5 프로그램실행결과영상 출력영상의크기를계산해서회전한뒤얻은출력영상으로잘려나간부분이없음. 35
워핑 (Warping) Section 04 영상의워핑기하학적변환 비선형이나왜곡변환을수행 고무시트변환 (Rubber Sheet Transform) 이라고도함. 화소별로이동정도를달리해고무판위에그린영상을임의로구부린듯한효과를냄. 매시워핑 (Mesh Warping) 입력영상을작은삼각형이나사각형격자 (Mesh) 로나눠서변형시켜목적하는결과영상을얻음. 격자의모양인다각형의기하학적변형수행 36
영상의워핑기하학적변환 ( 계속 ) 37
모핑기술 변형 (Metamorphosis) 에서유래된모핑 (Morphing) 은한영상을서서히변화시켜다른영상으로변환하는기술 원본영상과최종영상은물론, 최종영상으로매끄럽게변할수있도록많은중간단계의영상도필요함. 38
Section 04 영상의워핑기하학적변환 중간단계의영상을생성하려면워핑과합병의두단계를거쳐야함. 영상의워핑기술 : 두영상의중요한특징을좀더가깝게정렬하는데사용 합병 : 영상이순차적으로자연스럽게융합되도록하는크로스디졸브 (Cross-dissolve) 로처리됨. 39
Section 04 영상의워핑기하학적변환 워핑과합병처리로모핑을수행하는과정 전이모핑 : 초기영상과최종영상이달라전혀다른내용으로변하는것 왜곡모핑 : 같은내용에서일부분이변하는것, 워핑의개념과비슷하나중간영상을생성하여변하는과정을보여준다는차이가있음. 40
워핑 (Warping) 비선형이나왜곡변환수행 요약 화소별로이동정도를달리해고무판위에그린영상을임의로구부린듯한효과를냄. 매시워핑 (Mesh Warping) 입력영상을작은삼각형이나사각형격자 (Mesh) 로나눠서변형시켜목적하는결과영상을얻음. 격자의모양인다각형의기하학적변형을수행 모핑 (Morphing) 변형 (Metamorphosis) 에서유래 영상을서서히변화시켜다른영상으로변환하는기술 원본영상과최종영상은물론, 최종영상으로매끄럽게변할수있도록많은중간단계의영상도필요함. 41
요약 모핑에서중간단계의영상을생성하려면워핑과합병의두단계를거쳐야함. 워핑기술 : 두영상의중요한특징을좀더가깝게정렬하는데사용 합병 : 영상이순차적으로자연스럽게융합되도록하는크로스디졸브 (Crossdissolve) 로처리됨. 전이모핑 초기영상과최종영상이달라전혀다른내용으로변하는것 왜곡모핑 같은내용에서일부분이변하는것 워핑의개념과비슷하나중간영상을생성하여변하는과정을보여준다는차이가있음. 42
Thank ou