OpenCV - 이미지 연산OpenCV - 이미지 연산

Posted at 2008.11.13 19:26 | Posted in Team Project

세번째 과제 이미지 연산.

두 이미지를 각각 덧셈, 뺄셈, 곱셈, 나눗셈, 그레이->Threshold 연산하는것

OpenCV내장 함수를 이용해 금방 뚝딱뚝딱~ 히히힛

이번엔 중복도 없고 나름 깔끔하게 코딩함 후후후훗 -ㅅ-

Threshold함수가 있다는걸 알려준 경섬군에게 감사하는 바입니다

사용자 삽입 이미지

OpenCV - 컬러 변환OpenCV - 컬러 변환

Posted at 2008.11.12 20:11 | Posted in Team Project

두번째 과제 컬러변환하기.

이미지를 3채널로 분리하여 각각 RGB, YCrCb, HSV, HLS, XYZ, Lab, Luv로 나타내는 것이다

실력이 허접해서 소스는 무쟈게 길지만 그리 어렵지 않았던거같다

이걸 c로 코딩하려면 무쟈게 오래걸릴텐데... 역시 OpenCV는 좋구나아아~ -_ㅠ


사용자 삽입 이미지

RGB 채널분리모습


OpenCV - 이미지 줄이기 & RGB변환OpenCV - 이미지 줄이기 & RGB변환

Posted at 2008.11.10 04:44 | Posted in Team Project

오랫만에 OpenCV를 만져보면서 처음 시작한 과제.

이미지 파일을 출력하여 마우스 좌표 두곳을 입력받은후 그 범위에서

RGB평균값을 구해 새창에 출력하는 과제였다

역시 생각만큼 잘 되지 않았고 RyuiSaka군의 도움이 아니었다면 호롤대며 오그라졌을 과제지만

그래도 하나 끝내니 기분은 뿌듯하다

그러나 아직 갈길이 멀다 힘내자!!!

사용자 삽입 이미지



색상모델색상모델

Posted at 2008.05.13 04:35 | Posted in Team Project

1. RGB (Red Green Blue)

RGB 가산혼합
은 빛의 삼원색을 이용하여 을 표현하는 방식이다. RED, GREEN, BLUE 세종류의 광원(光源, 영어: light source)을 이용하여 색을 혼합하며 색을 섞을수록 밝아지기 때문에 '가산혼합'이라고 한다. 디지털 이미지에서 사용되는 RGB 가산혼합의 종류로는 sRGB, 어도비 RGB등이 있다.

  • 알기 쉬운 실험
세개의 손전등에 각각 빨강, 녹색, 파랑의 셀로판지를 겹쳐놓고 불을 비추면 오른쪽의 그림 '가산혼합의 원리'와 비슷한 결과를 얻을 수 있다.
  • RGB 큐브 모델과 표현 원리
오른쪽의 그림 'RGB의 큐브 모델'과 같이 하나의 색은 삼원색을 기준선으로 하는 삼차원 직교 좌표계의 한 점으로 나타낼 수 있다.
예를 들어 검정은 세 광원 모두 빛이 없는 상태이며 좌표(0,0,0)으로 표현할 수 있다.

체널별 값 혼합결과와 좌표
RED GREEN BLUE 혼합색 좌표
0 0 0 검정 (0,0,0)

각 광원의 최대값을 255라고 한다면 빨강은 좌표(255,0,0)과 같이 표현되며 RED 광원만이 최대값을 갖고 GREEN 광원과 BLUE광원은 빛이 없는 상태를 의미한다.

체널별 값 혼합결과와 좌표
RED GREEN BLUE 혼합색 좌표
255 0 0 빨강 (255,0,0)

좌표(80,0,0)과 같이 GREEN 광원과 BLUE 광원이 여전히 빛이 없는 상태에서 RED 광원이 약하게 비춰진다면 고동색이 될것이다.

체널별 값 혼합결과와 좌표
RED GREEN BLUE 혼합색 좌표
80 0 0 고동색 (80,0,0)

주황색은 좌표(255,127,0)으로 나타낼 수 있으며 RED 광원이 최대값을 갖는 상태에서 GREEN 광원이 중간 정도로 섞인 상태라고 할 수 있다.

체널별 값 혼합결과와 좌표
RED GREEN BLUE 혼합색 좌표
255 127 0 주황색 (255,127,0)

세 광원이 모두 같은 값을 갖으면 무채색이 된다.

체널별 값 혼합결과와 좌표
RED GREEN BLUE 혼합색 좌표
192 192 192 은색 (192,192,192)

  • 감산혼합과의 관계
RGB 가산혼합과 달리 CMYK 감산혼합은 물감이나 잉크같은 안료가 서로 섞일 때 일어나는 색의 혼합을 표현하는 방식으로 색을 섞을수록 어두어 지기 때문에 '감산혼합'이라 한다. 가산혼합과 감산혼합은 서로 반대되는 개념으로 보색 관계에 있다.


2. CMYK (Cyan Magenta Yellow blacK)



C는 Cyan(시안)、M은 Magenta(마젠타)、Y는 Yellow(노란색)、K는 Black(검은색)을 말한다. 컬러 팜플렛이나 잡지의 컬러 페이지는 통상 이 4색으로 인쇄된다.

시안을 흔히 녹청색이라 하는데 실제로는 하늘색에 가깝다. 마젠타는 밝은 자홍색. 그리고 일본 국기처럼 붉은 적색은 노랑과 마젠타를 겹인쇄(double printing)하여 만든다. 파랑(감색)은 시안과 마젠타를 더블프린팅한다. 3색을 겹치면 이론상으로는 검정이 되긴 하나 그렇게 하면 색감이 다소 떨어지기 때문에 검정 잉크를 추가한다.

그런데 컴퓨터와 관련하여 이 용어가 등장하는 것은 다음과 같은 두가지의 경우다.
먼저 잉크젯프린터나 컬러레이저프린트에서 컬러 인쇄를 할 경우 역시 이 4색을 사용한다.화질을 중시한 최근의 잉크젯프린트는 시안과 마젠타 잉크를 짙고 엷은 2색씩으로 하여 6색이나 7색의 잉크를 사용하는 기종이 많다. 그러나 인쇄 속도나 비용을 우선하는 기종이라면 CMYK 4색을 사용하는 기종이 많다. 컬러레이저프린트의 경우는 CMYK의 4색 토너(toner)를 사용한다.

화질을 중시한 최근의 잉크젯프린트는 시안과 마젠타 잉크를 짙고 엷은 2색씩으로 하여 6색이나 7색의 잉크를 사용하는 기종이 많다. 그러나 인쇄 속도나 비용을 우선하는 기종이라면 CMYK 4색을 사용하는 기종이 많다. 컬러레이저프린트의 경우는 CMYK의 4색 토너(toner)를 사용한다.

다른 하나는 DTP(desktop publishing) 작업을 할 경우이다. DTP란 컴퓨터를 사용하여 인쇄물을 만드는 것. 예를 들자면 컴퓨터 화면상으로 조정한 사진을 인쇄소로 넘길 때 CMYK 데이터로 변환시키곤 하는 게 그것이다.

컴퓨터 화면은 RGB 3색의 빛으로 이루어져 있다. R은 레드(적), G는 그린(녹), B는 블루(청)를 말한다. 스캐너로 스캔한 사진이나 디지털카메라로 찍은 사진도 이 3색으로 되어 있다. 이것을 어떤 경로든 CMYK의 조합으로 변환시키지 않으면 인쇄가 불가능하다.

그렇기 때문에 어도비포토샵 같은 프로용 그래픽소프트웨어에는 화상을 CMYK 데이터로 변환시키거나 CMYK컬러로 표시하는 기능이 갖추어져 있다.


3. HSI (Hue Saturation Intensity)

색상(Hue), 채도(Saturation), 명도(Intensity)라는 세 가지 특성들이 컬러를 설명하는 데 사용되기 때문에,
이와 대응되는 컬러 모델을 HSI라고 한다.
HSI 컬러 공간을 사용할 때, 어떤 컬러를 만들어 내기 위해서 몇 퍼센트의 파랑색이나 녹색이 필요한지 알 필요가 없다. 진한 빨강색을 분홍색으로 바꾸기 위해 단순히 채도를 조절한다. 어두운 것을 밝게 하려면 명도를 변경한다.
 
색상 : 0도 에서 360도의 범위를 가진 각도로 표현한다.
채도 : 0에서 1까지의 범위를 가지는 반지름에 해당한다.
명도 : z축에 해당하는데 0일 때는 검정색을, 1일때는 흰색을 나타낸다.

사용자 삽입 이미지


*채도가 1일때 , 그 컬러는 원뿔기반의 모형의 꼭대기 가장자리에 위치한다. 채도가 강할수록 그 컬러는 명도에 따라서 흰색/회색/검정색이 된다.

*색상의 조절은 각도에 따라 0도에서는 빨강색, 120도에서는 녹색 , 240도에서는 파랑색, 그리고 360도에서는 다시 빨강색으로 변한다.

*명도가 0이면 컬러는 검정색이어서 색상은 정의 되지 않는다.

*채도가 0이면 컬러는 명암도 등급이 된다. 색상은 이러한 경우에도 정의되지 않는다.

*명도를 조절함으로써, 컬러는 어둡게 또는 밝게 될 수 있다.

*채도를 1로 유지하고 명암도를 저절하면, 그 컬러의 농도를 변화 시킬 수 있다.


<RGB 에서 HSI로의 변환>

사용자 삽입 이미지
 

RGB
CMY
HSI
Red(빨강)
1,0,0
0,1,1
0°,1,0.33
Green(초록)
0,1,0
1,0,1
120°,1,0.33
Blue(파랑)
0,0,1
1,1,0
240°,1,0.33
Cyan(청록)
0,1,1
1,0,0
180°,1,0.66
Magenta
1,0,1
0,1,0
300°,1,0.66
Yellow(노랑)
1,1,0
0,0,1
60°,1,0.66


 
※변환관련 프로그램 소스코드는 다음과 같다

void CHsiView::rgbToHsi(unsigned char R[][320],unsigned char G[][320],unsigned char B[][320],float H[][320],float S[][320],float I[][320], unsigned char outH[][320],unsigned char outS[][320], unsigned char outI[][320])

{

        float min;

        float angle;

        float r,g,b;

        r=g=b=0;

 

        for(int y=0; y<240; y++)

        {

               for(int x=0; x<320; x++)

               {

                       r=R[y][x]/255.0f;                     //RGB색상의 정규화

                       g=G[y][x]/255.0f;

                       b=B[y][x]/255.0f;

 

                       if((r<=g) && (r<=b))          //S의 연산을 위한 최소값을 구함

                              min=r;

                       else if((g<=r) && (g<=b))

                              min=g;

                       else

                              min=b;

 

                       I[y][x]=(r+g+b)/3.0f;

 

                       if((r==g) && (g==b))          //흑백일 경우 H S의 값 설정

                       {

                              S[y][x]=0.0f;

                              H[y][x]=0.0f;

                              continue;

                       }

                       else

                       {

                              S[y][x]=1.0f-(3.0f/(r+g+b))*min;     //S의 계산

                              angle=(0.5f*((r-g)+(r-b))) /
                              sqrt((r-g)*(r-g)+(r-b)*(g-b));

                              H[y][x]=acos(angle);                 //H의 계산

                              H[y][x]*=57.29577951f;               //Radian 으로 변환

                       }

                       if(b>g)

                              H[y][x]=360.0f-H[y][x];

               }

        }

       

        int ih=0;

 

        for(int y=0; y<240; y++)

        {

               for(int x=0; x<320; x++)

               {

                       ih=(int)(H[y][x]*255.0f/360.0f);  
                       //0~255
사이에 올수 있도록 정규화

                      

                       outH[y][x]=(unsigned char)ih;

                       outS[y][x]=(unsigned char)(S[y][x]*255.0f);

                       outI[y][x]=(unsigned char)(I[y][x]*255.0f);

               }

        }

}

작성한 프로그램은 두 장의 영상을 웹캠으로 캡쳐하여 각각 HSI컬러 모델로 변환한다.
H는 6가지의 색상, S는 2종류로 양자화 하여 해당 색상에 대한 히스토그램을 구한 후 유클리디언 거리 차를 이용한 벡터를 구한다.
구해진 벡터를 이용하여 영상의 오차 정도를 판단하게 된다.


MFC에서 VFW를 이용한 웹캠영상받기MFC에서 VFW를 이용한 웹캠영상받기

Posted at 2008.05.13 02:46 | Posted in Team Project

OpenCV를 이용하지않고 MFC를 사용한 웹캠영상받기이다.

VFW는 Video For Window의 약자로서 윈도우에서 비디오 장치를 연결하여 출력 하게끔 해주는 라이브러리다.

또 리눅스에서도 연결 하게 해주는 VFL(Video For Linux) 가 있다.

아래 내용을 펴보면 VFW라이브러리를 이용한 비디오 캡쳐방법을 확인 할 수 있다.

펴기


우선 이 라이브러리를 사용하기 위해 라이브러리 링크를 걸어야 하는데 링크를 거는 화면은 다음과 같다. 


사용자 삽입 이미지

위의 그림에서 유심히 봐야 할것은 vfw헤더 파일 인클루드와 vfw32.lib 파일을 추가 시키는 것이다.

그리고 웹캠연결을 위한 소스는 다음과 같다.

void CCamTestView::initCam()
{
      BITMAPINFO BmInfo;
      m_HCam=capCreateCaptureWindow("Capture Window",WS_CHILD | WS_VISIBLE,
      20,20,320,240,this->m_hWnd , NULL);
 
      if(capDriverConnect(m_HCam,0)==false)
      {
             return ;
      }
      capGetVideoFormat(m_HCam, &BmInfo, sizeof(BITMAPINFO));
      if(BmInfo.bmiHeader.biBitCount!=24)
      {
            BmInfo.bmiHeader.biBitCount=24;
            BmInfo.bmiHeader.biCompression=0;
            BmInfo.bmiHeader.biSizeImage=BmInfo.bmiHeader.biWidth*BmInfo.bmiHeader.biHeight*3;
            capSetVideoFormat(m_HCam,&BmInfo, sizeof(BITMAPINFO));
      }
 
      capPreviewRate(m_HCam, 10);
      capOverlay(m_HCam, false);
      capPreview(m_HCam, true);
}

위의소스는 웹캠연결만을 위한 소스 이며 실제로 위의 소스만 가지고는 웹캠으로 들어 오는 영상을 가지고
영상 처리를 하기에는 부적합하다.
위의 방식에다 콜벡함수에 영상 데이터를 넘겨 주는 방식이 있는데, 그 방식을 사용하면 쉽게 영상의
실제 데이터를 실시간으로 획득 할 수 있으며 쉽게 영상을 처리 할 수 있게 된다.

위에 VFW라이브러리 함수에도 설명되어있지만 위 소스에 나온 함수를 다시한번 살펴보면 다음과 같다.

===================================================================
HWND capCreateCaptureWindow(name, style, x, y, width, height, hWnd, id);
- 이 함수는 캡쳐 윈도우를 만든다.
매개 변수는 순서대로 윈도우 이름, 스타일, 윈도우 좌측 상단 좌표, 캡쳐윈도우 크기, 부모 윈도우 핸들값, 윈도우 식별 번호 를 입력을 하면 된다.
캡쳐 윈도우가 정상적으로 생성되면 캡쳐 윈도우 핸들이 반환 되고 그렇지 않다면 NULL이 반환 된다.
 
BOOL capDriverConnect(hWnd, index);
- 이 함수는 캡쳐윈도우를 드라이버에 연결을 한다.
매개 변수는 순서대로 윈도우 핸들, 캡쳐 드라이버 번호를 나타낸다.
성공하면 TRUE를 그렇지 않다면 FALSE를 반환한다.
 
DWORD capSetVideoFormat(hWnd, format, format_size);
- 이 함수는 캡쳐된 비디오 데이터 형식을 설정한다. 데이터 형식이 캡쳐 장치에서 지원 가능하면
TRUE, 그렇지 않다면 FALSE값을 반환한다
매개 변수는 순서대로 윈도우 핸들, 비디오 데이터 구조(BITMAPINFO 구조체), 구조체의 크기를 입력하면 된다.
capGetVideoFormat함수는 설정이 아니라 설정된 값을 가져 오는 함수라 생각하면 된다.
 
BOOL capPreviewRate(hWnd, rate);
- 이 함수는 프레임 재생 속도를 설정 한다.
매개 변수는 순서대로 윈도우 핸들, rate는 ms의 단위의 시간으로 설정한다.
예를 들어 66으로 설정하면 0.066초마다 프레임을 캡쳐해서 보여준다. 1초에 15개의 프레임을 보여 준다는 것이다.
 
BOOL capOverlay(hWnd, f);
- 이 함수는 비디오 오버레이를 사용 할것인지 아닌지를 설정한다. 설정 성공시 TRUE, 그렇지 않을경우 FALSE를 반환한다.
매개변수는 순서대로 윈도우 핸들, 설정시-true 미설정시 -false
비디오 오버레이를 사용하면 CPU자원이 요구 되지 않아 효과적이라고 한다.
 
BOOL capPreview(hWnd, f);
- 이 함수는 미리보기 모드를 동작 시킬 것인지 아닌지를 설정한다. 설정을 하게 되면 영상 프레임이 시스템의 메모리로 전달되어 GDI함수를 사용하여 캠처 윈도우에 영상을 출력하게 된다.
매개 변수는 순서대로 윈도우 핸들, 설정시 -true, 미설정시 -false
===================================================================

※첨부파일로 OpenCV홈페이지의 관련게시물에서 받은 소스파일을 올리니 참고하기바람.

 

[출처] VFW 라이브러리 설명|작성자 마인드온
[출처] MFC에서 VFW를 이용한 웹캠 연동 (간단!)|작성자 봉봉월드


위의 내용이 복잡하다면 플래시로 만든 동영상 강의도 있다. (다보진않았다 -_-;;)
아래 주소로 가서 동영상을 본다면 좀더 쉽게 구현할수 있을것이다.

보러가기

레나레나

Posted at 2008.05.04 06:04 | Posted in Team Project

SoC 자료를 뒤지다보니 심심찮게 나오는 여자가 있었다.

사용자 삽입 이미지

바로 이분! 이여자분은 뭐길래 대체 모든 그래픽, 영상부분에 예제로 나오는것일까? 그래서 찾아보니

레나(Lenna)는 플레이보이 잡지 1972년 11월자의 센터폴드에 실린 스웨덴 누드 모델 레나 소더버그(1951년 3월 31일 - )의 사진의 일부분을 말한다.

얼굴과 어깨만 취한 이 그림 파일은 영상 압축 알고리즘을 위한 시험용 이미지로 널리 쓰인다. 실제로 대부분의 영상처리, 신호처리 교과서에는 레나의 사진을 이용한 결과 비교가 나온다. 일부에서는 이 사진이 외설스러운 것이며, 한때 플레이보이가 이 사진을 사용하는데 저작권을 행사하려 한 적이 있다며 반감을 가지기도 한다. 실제로 플레이보이는 저작권 소송을 하려 했었지만 뒤에 이를 철회했다.

1996년 1월판 IEEE Transactions on Image Processing의 편집장이던 David C. Munson은 레나 사진을 영상처리에 널리 사용하는 이유에 대해 다음과 같이 밝혔다.

First, the image contains a nice mixture of detail, flat regions, shading, and texture that do a good job of testing various image processing algorithms. It is a good test image! Second, the Lena image is a picture of an attractive woman. It is not surprising that the (mostly male) image processing research community gravitated toward an image that they found attractive.

사진의 실제 주인공인 레나 소더버그는 1997년 50th annual Conference of the Society for Imaging Science in Technology에 게스트로 초대받았다.

한편 플레이보이에 따르면 레나를 등장시켰던 잡지는 현재까지 가장 많이 팔린 기록(7,161,561부)을 가지고 있다고 한다.

라고 위키피디아가 친절히 알려주었다 -_-

플레이보이 잡지에 실린 사진이라곤 하지만 실제로 우리가 본것은 오직! 저부분밖에 없다

그래서 뭐.....찾으니 5분도 안되서 나오더라 -_-; 찾기쉬운아줌마였다.

Warning) 19금이므로 볼사람만 보세연 -_-

보기

OpenCVOpenCV

Posted at 2008.05.04 05:46 | Posted in Team Project

OpenCV(영어: Open Computer Vision)은 오픈소스 컴퓨터 비전 C 라이브러리이다. 원래 인텔에서 개발되었다. 현재 버전 1.0이 나와있으며 윈도, 리눅스 플랫폼에서 사용할 수 있다. 실시간 이미지 프로세싱에 중점을 둔 라이브러리이다. 인텔 CPU에서 사용되는 경우 속도의 향상을 볼 수 있는 Intel Performance Primitives (IPP)를 지원한다.

성공적인 애플리케이션

  • 2005년 다르파 챌린지 경주에서 우승한 로봇 자동차 스탠리의 시각 시스템에서 OpenCV를 사용한다.
  • 곤충등의 자취를 추적하는 소프트웨어인 SwisTrack은 OpenCV를 사용한다.


링크

원본 주소 ‘http://ko.wikipedia.org/wiki/Opencv

OpenCV코리아 이곳에 가면 OpenCV와 영상처리에 대한 많은 정보를 얻을 수 있다.

또 OpenCV 라이브러리는 Visual C뿐만 아니라 Python에서도 사용이 가능하다!

관련 포스팅은 여기에 가면 확인할 수 있다. (파이썬 풰인 Raven 덕분에 알았다 -_-;)

영상처리 기초영상처리 기초

Posted at 2008.05.04 05:30 | Posted in Team Project

1. 영상처리란 무엇인가?

그림을 다루는 학문이다. 흔히 컴퓨터 그래픽스와 혼동된다.
영상처리 알고리즘들을 분류하는 기본적인 분류 방법은 네가지가 있다.


포인터 처리-화소의 원래 값이나 위치에 기반한 화소값을 변경한다.

영역처리-화소의 원래의 값과 이웃하는 화소의 값을 기반으로 하여 화소값을 변경한다.

기하학적 처리- 화소들의 위치나 배열을 변화시킨다.

프레임처리-두 개 이상의 영상들에 대한 연산을 기반으로 하여 화소값들을 생성한다.


2. 포인터처리

룩업테이블 - 배열의 인덱스로 화소값을 사용하는 배열이다.
히스토그램 - 영상의 명암값 프로필(profile)을 보여주기 위해 사용되는 도구이다.

2.1 산술연산을 이용한 포인터 처리

             
                  <입력 영상>                                                           <영상 +40>


2.2 히스토그램 평활화(spreading)

- 히스토그램 평활화는 3 단계로 이루어 진다.

1. 히스토그램을 생성한다.
2. 히스토그램의 정규화된 합을 계산한다.
3. 입력영상을 변형하여 결과 영상을 생성한다.

2.3 히스토그램 명세화(specification)

히스토그램 평활화는 히스토그램이 균일한 분포를 가지도록 근사시킨다.

2.4 명암 대비 스트레칭(constrast stretching)

-명암 대비 스트레칭의 두 종류

1.기본 명암 대비 스트레칭 - 특정 부분, 즉 중앙에 명암값이 치우치는 히스토그램을 가진 영상에 가장 잘 적용 된다

       

2.앤드인 탐색(ends-in search) - 모든 범위의 명암값을 갖지만 히스토그램의 특정 부분에 화소들이 치우친 영상에 가장 잘 적용 된다.

 알고리즘은 두 개의 임계값(낮은 임계값 low 와 높은 임계값 high)을 사용하며,
먼저 낮은 임계값을 발견하기 위해서 히스토그램을 조사한다.

2.5 명암 변환

명암 변환은 미리 지정된 함수를 기반으로 하여 이전 화소를 새로운 화소로 변환하는 포인터 처리이다.


3. 기하학적 처리

영상의 기하학적 변환(Geometric Transform)
입력 영상 안에 있는 픽셀들의 좌표값(x,y)를 수학적 변환을 통하여 출력 영상안 의 새로운 값(x’,y’)로 재배치

어파인(Affine) 변환 : 처리된 영상에 굴곡을 가져오지 않는 이동, 회전, 축척 등을 포함하는 선형 기하학적 연산
굴곡(Wraping) 변환 : 처리된 영상에 왜곡을 가져올 수 있는 비선형적 변환
보간법(Interpolation) : 특정위치에서의 픽셀값을 주변 픽셀값의 정보를 이용하여 추정하는 방법
 

영상의 이동 변환

이동 변환(Translation transform)
영상을 특정 크기만큼 가로 또는 세로 방향으로 이동시키는 변환
이동변환에 의해 생겨난 결과 영상의 크기는 원본 영상이 크기와 동일
원본크기를 빠져나가는 픽셀은 없어지고 새로 생겨난 빈 공간들은 특정 픽셀값으로 채워진다.


영상의 크기 변환

크기 변환(Scale transform)
영상의 크기를 원본 영상보다 크게 또는 작게 만드는 변환
 
 - 입력영상의 크기는 w*h
 - 확대된 영상의 크기는 nw*nh
 - Sx(가로방향의 확대비율)=nw/w
 - Sy(세로방향의 확대비율)=nh/h

순방향 매핑(forward mapping)
입력 영상의 각 픽셀을 픽셀 단위로 출력 영상의 새로운 위치로 변환
 
역방향 매핑(Reverse, backward mapping)
출력 픽셀 좌표에서 입력 좌표를 정의하는 좌표변환을 사용
결과 영상의 픽셀에서 입력 영상의 픽셀 위치를 찾아 그 위치에서의 픽셀 값을 복사해오는 방법을 사용 결과 영상 크기 만큼의 for문을 수행하면서 입력 영상의 픽셀 값을 참조
 

순방향 매핑(forward mapping)의 문제점
빈 홀(hall)이 생김  ( 역방향 매핑(backward mapping) 으로 해결 )

for( j = 0 ; j < h ; j++ )
        for( i = 0 ; i < w ; i++ )
        {
         ptr2[2*j][2*i] = ptr1[j][i];
        }



보간법(Interpolation)
실수 좌표 상에서의 픽셀 값을 결정하기 위해 주변 픽셀 값을 이용하여 값을 추정하는 방법
 

최근방 이웃 보간법(Nearest neighbor interpolation)
가장 가까운 위치에 있는 픽셀의 값을 참조하는 방법
예: (50.2, 32.8)  (50, 33)
장점: 빠르고 구현하기가 쉽다
단점: 계단 현상

양선형 보간법(Bilinear interpolation)
실수 좌표를 둘러싸고 있는 네 개의 픽셀 값에 가중치를 곱한 값들의 선형 합으로 결과 영상의 픽셀 값을 구하는 방법
최근방 이웃 보간법에 비해서는 느린 편이지만, 비교적 빠른 편에 속하며 계단 현상이 많이 감소

3차 회선 보간법(Cubic convolution interpolation)
실수 좌표를 둘러싸고 있는 16개의 픽셀 값에 3차 함수를 이용한 가중치를 부여하여 결과 영상 픽셀의 값을  계산


영상의 축소 시 고려할 사항
한 픽셀로 구성된 선분들은 영상을 축소할 때 사라지는 경우가 발생
입력 영상을 부드럽게 필터링한 후 축소
 

영상의 회전 변환


회전 변환(rotation transform)
영상을 특정 각도만큼 회전시키는 변환
영상을 원점 (0, 0)을 기준으로 x만큼 회전하는 경우,
- 양방향 매핑을 사용하여 비어있는 픽셀이 생기지 않도록 한다.


기하학적 변환의 응용

모핑(morphing)
- 한 영상에서 다른 영상으로 부드럽게 변화하여 한 물체가 다른 물체로 점진적으로 변형되는 듯한 착각을 만드는데 사용

디졸브(Dissolve) 기법
- 입력 영상에서 픽셀값을 더하거나 빼서 목표 영상의 픽셀값과 같아질때까지 연산을 계속해서 입력연산을 점진적으로 흐리게 하면서 출력 영상을 점점 밝게 나타나게 하는 것

페이드(fade) 기법