태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
 

 


 

'Programming/Image Processing'에 해당되는 글 4

  1. 2009/03/03 Chain Code
  2. 2009/03/03 Watershed 알고리즘 적용 예
  3. 2009/03/03 GDI함수 BitBlt사용예제
  4. 2009/03/03 크로마키 기법
 

Chain Code

Programming/Image Processing | 2009/03/03 20:44 | Posted by 엉이엉이
출처 helloktk의 블로그 | 드라곤
원문 http://blog.naver.com/helloktk/80028100631

이미지에서 여러 처리과정을 거쳐서 물체의 영역이 얻을 수 있다. 많은 경우에 물체영역의 경계정보만을 가지고도 여러가지 형태적인 정보를 추정해 낼 수 있다. 물체의 경계선을 얻기 위해서는 경계에 있는 점에서 출발하여서 영영을 4방향 또는 8방향 연결성을 이용하여서 추적해 나가면 된다. 이렇게 얻은 경계선은 각각 좌표로 표현이 되는데, 이것 보다도 보다 간단한 표현방법이 있다. 경계의 인접점간의 관계는 거리와 방향으로 주어지는데, 사용한 연결성이 정해지면 거리관계는 방향에 의존해서 고정이 되므로, 초기의 위치에서 출발하여 인접경계점의 방향만을 기술하면 되어서, 경계선을 저장하는데 필요한 메모리 공간을 줄일 수 있다(8방향연결성을 고려하는 경우에 3비트만 있으면 된다). 이렇게 경계선을 포현하는데 있어서 인접경계점간의 방향정보만(처음 출발좌표포함)를 이용하여 표현하는 것을 chain code라고 한다. 체인코드는 좌표의 평행이동이 불변인 특성을 가진다.

 

아래의 예제에서는 8방향 연결성을 이용하고, 체인코드는 양의 x축에서 시작하여서 시계방향으로 돌도록 작성이 된 것이다.

#define RANGE(x,y) ((x)>=0 && (y)>=0 && (x)<width && (y)<height)

 

int chainCode(BYTE *image, int width, int height,

             int startX, int startY,
             std::vector<POINT>& vecPts, /* debugging only;*/
             std::vector<int>& vecCode)
{
    static int dirY[9]={0,-1,-1,-1, 0, 1, 1, 1},
                 dirX[9]={1, 1, 0,-1,-1,-1, 0, 1};

      
    int lastdir = 4;
    int x=startX, y=startY;
    BYTE val=image[startY*width+startX];
    BOOL found;
    do {
        found=FALSE;
        for (int dir=lastdir+1; dir<lastdir+8; dir++) {
            int ccode = dir%8;
            int xx=x+dirX[ ccode ];
            int yy=y+dirY[ ccode ];
            if (RANGE(xx,yy) && image[ yy*width+xx ] == val) {
                lastdir=(ccode+5)%8 ;
                x=xx; y=yy;
                found=TRUE;
                vecPts.push_back(POINT(x,y));
                vecCode.push_back(ccode);
                break;
            }
        }      
    } while ( (found==TRUE) &&((x!=startX) || (y!=startY)) );

    return vecCode.size()>0;
}

/* 해당 chain_code로 기술이 되는 영역의 둘레길이를 얻는다;*/

/* 8방향연결이므로 chain_code가 홀수인 경우에는 길이가 sqrt(2)로 주어진다;*/

double ccPerimeter(int ccode[], int N){

    double perimeter=0.;

    for(int i=0; i<N; ++i){

         if(ccode[i]&1) perimeter+= SQRT2; //sqrt(2);

         else perimeter+= 1.;

     }

     return perimeter;

}


저작자 표시 비영리

'Programming > Image Processing' 카테고리의 다른 글

Chain Code  (0) 2009/03/03
Watershed 알고리즘 적용 예  (0) 2009/03/03
GDI함수 BitBlt사용예제  (0) 2009/03/03
크로마키 기법  (0) 2009/03/03

TRACKBACK ADDRESS : http://smartiz.co.kr/trackback/21 관련글 쓰기

댓글을 달아 주세요

Watershed 알고리즘 적용 예

Programming/Image Processing | 2009/03/03 20:43 | Posted by 엉이엉이
출처 helloktk의 블로그 | 드라곤
원문 http://blog.naver.com/helloktk/80051779331

(1) cell image : 원본 영상을 이진화(Otsu 알고리즘)시킨  결과이다. 두 군데서 셀이 겹쳤다. 단순히 connected component labelling을 적용하여서는 이것을 분리 할 수 없다.

 

(2) distance transform : distance 변환 결과에 블러링을 추가한 결과이다. distance 변환은 셀 외부는 셀로부터의 거리를, 셀내부는 배경으로부터의 거리의 음의 값을 취하고, 전체적으로 다시 리스케일링한 것이다.  블러링은 워터쉐드 알고리즘이 보다 정확히 동작하는데 필요하다.

 

(3) watershed segmentation: 분할된 영역의 라벨이 나온다(경계라벨=0). 이 라벨을 가지고  false coloring을 한 결과이다. 이 알고리즘은 "The Watershed Transform: Definitions, Algorithms and Parallelization Strategies", Jos B.T.M. Roerdink and Arnold Meijster에 따라서 구현이 된것이다. 픽셀연결성은 8방향을 이용하였다.

 

(4) final cell segmentation; watershed 결과를  마스크로 이용하여서 cell이미지를 분할한 것이다. 겹친 cell들이 분리되었다.

 

다른 예::

저작자 표시 비영리

'Programming > Image Processing' 카테고리의 다른 글

Chain Code  (0) 2009/03/03
Watershed 알고리즘 적용 예  (0) 2009/03/03
GDI함수 BitBlt사용예제  (0) 2009/03/03
크로마키 기법  (0) 2009/03/03
TAG Watershed

TRACKBACK ADDRESS : http://smartiz.co.kr/trackback/20 관련글 쓰기

댓글을 달아 주세요

GDI함수 BitBlt사용예제

Programming/Image Processing | 2009/03/03 20:35 | Posted by 엉이엉이

출처 : 데브피아

 

Textbox를 capture

화면에 Textbox 하나와 button 하나를 생성하셔서 아래 소스를 테스트 해보세요. bmp로 저장합니다.

 

Public Class Form1

    <System.Runtime.InteropServices.DllImport("gdi32.dll", CharSet:=Runtime.InteropServices.CharSet.Auto)> _

    Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, _

    ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean

    End Function

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim g1 As Graphics = Me.TextBox1.CreateGraphics()

        Dim MyImage = New Bitmap(Me.TextBox1.ClientRectangle.Width, Me.TextBox1.ClientRectangle.Height, g1)

        Dim g2 As Graphics = Graphics.FromImage(MyImage)

        Dim dc1 As IntPtr = g1.GetHdc()

        Dim dc2 As IntPtr = g2.GetHdc()

        BitBlt(dc2, 0, 0, Me.TextBox1.ClientRectangle.Width, Me.TextBox1.ClientRectangle.Height, dc1, 0, 0, 13369376)

        g1.ReleaseHdc(dc1)

        g2.ReleaseHdc(dc2)

        MyImage.Save("c:\aaa.bmp")

        MessageBox.Show("Finished Saving Image")

    End Sub

 

End Class


저작자 표시 비영리

'Programming > Image Processing' 카테고리의 다른 글

Chain Code  (0) 2009/03/03
Watershed 알고리즘 적용 예  (0) 2009/03/03
GDI함수 BitBlt사용예제  (0) 2009/03/03
크로마키 기법  (0) 2009/03/03
TAG bitblt, GDI

TRACKBACK ADDRESS : http://smartiz.co.kr/trackback/16 관련글 쓰기

댓글을 달아 주세요

크로마키 기법

Programming/Image Processing | 2009/03/03 20:19 | Posted by 엉이엉이
출처 뒹굴뒹굴~exword의 방 | 띠굴여사
원문 http://blog.naver.com/exword/4751213

  움직이는 피사체를 다른 화면에 합성하는 텔레비전의 화면합성기법.

  사람이 커피잔 속에 들어가거나 하늘을 날거나 외국거리에서 연기를 하는 장면 등 움직이는 인간을 그대로 화면에 끼워 넣는 특수한 기술이다. 뉴스의 자막이나 어린이 프로그램에 많이 쓰이며, 흑백 텔레비전에서 사용하는 것은 크로마몽타주라 한다.

  컬러텔레비전의 카메라에서 얻을 수 있는 삼원색(赤·綠·靑) 신호를 이용하여 그 색(크로마)의 차이롤 키(key)로 하여 빼내고 싶은 피사체와 배경을 분리하고, 그것을 다른 화면에 끼워넣는 것이 그 원리이다.

  빼내고자 하는 피사체가 인물인 경우, 살색과 보색인 청색 배경 앞에 인물을 세워 카메라로 촬영하고 그 출력에서 청색 성분을 제거하면 배경은 검게 되고 인물만을 빼낼 수 있다. 이때 인물의 의상이나 소지품 등에 청색계통의 색을 이용하면 그 부분이 없어진 피사체를 빼낼 수 있다. 청색 의상을 입으면 얼굴과 손발만 빼낼 수도 있다.

  한편 다른 카메라로 끼워 넣을 화면을 촬영해 두고, 그 영상 신호와 앞서 빼놓은 피사체 신호를 전자회로로 합성한다. 얼마 전까지는 합성화면 경계에 부자연스러운 톱니모양의 선이나 테두리가 생기는 일이 많아 드라마 등에 사용되지 않았으나, 최근에는 소프트크로마키방식이라 하여 피사체의 그림자와 유리 및 담배연기와 같이 엷고 섬세한 피사체도 선명하게 뽑아낼 수 있는 기술을 개발, 드라마에서도 질 좋은 합성화면이 가능하다.

  이 기술과정은 전자회로로 이루어지므로 스위치 조작만으로도 순간적으로 합성할 수 있다. 같은 원리에 의한 화면합성이 영화제작에서도 이루어지는데 이때는 며칠간의 작업일정과 숙련된 기술이 필요하다. 미국의 NBC, RCA 등에서 고안되었다.

 


저작자 표시 비영리

'Programming > Image Processing' 카테고리의 다른 글

Chain Code  (0) 2009/03/03
Watershed 알고리즘 적용 예  (0) 2009/03/03
GDI함수 BitBlt사용예제  (0) 2009/03/03
크로마키 기법  (0) 2009/03/03

TRACKBACK ADDRESS : http://smartiz.co.kr/trackback/6 관련글 쓰기

댓글을 달아 주세요