Study/CxImage2009. 3. 18. 15:27

Jitter 효과(View 클래스)

  - 메뉴에 사용자 메뉴를 만든 후 관련 함수 생성.

  - 코드삽입

   CKDY013Doc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // Jitter() 함수 호출
   long radius = 4;
   pDoc->m_pImage->Jitter(radius);

   //화면 갱신
   Invalidate(FALSE);

 

클립보드 복사(Doc 클래스)

  - 새로운 함수 생성 후 코드 삽입

  - 매개변수 CxImage* pCopyImage

   HANDLE hDIB = m_pCopyImage->CopyToHandle();

   // 클립보드 열기
   if(::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
   {
    // 클립보드 초기화
    if(::EmptyClipboard())
    {
     // 클립보드에 전송
     if(::SetClipboardData(CF_DIB, hDIB) == NULL)
     {
      AfxMessageBox("클립보드 데이타 전송 오류");
     }
    }
   }
   // 클립보드 닫기
   ::CloseClipboard();

 

  - ID_EDIT_COPY 아이디 함수 재정의 후 코드 삽입 (View 클래스)

 

   CKDY013Doc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // 클립보드에 복사하기
   pDoc->CopyClipBoard(pDoc->m_pImage);

 

클립보드 붙이기(App 클래스)

  - ID_EDIT_PASTE 아이디 함수 재정의 후 코드 삽입

   POSITION pos = GetFirstDocTemplatePosition();
   CDocTemplate *pTemplate = GetNextDocTemplate(pos);

   CKDY013Doc* pDoc = (CKDY013Doc*)pTemplate->OpenDocumentFile(NULL);
 
   if(pDoc)
   {
    HANDLE hBitmap = NULL;
 
    // 클립보드에서 데이터 가져오기
    if(::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
    {
     hBitmap = ::GetClipboardData(CF_DIB);
    }
 
    if(hBitmap)
    {
     // 클립보드에서 얻은 데이터로부터 CxImage 생성
     pDoc->m_pImage = new CxImage();
   
     pDoc->m_pImage->CreateFromHANDLE(hBitmap);
   
     POSITION pos = pDoc->GetFirstViewPosition();
   
     CKDY013View *pView = (CKDY013View*)pDoc->GetNextView(pos);
   
     CSize sizeTotal = CSize(pDoc->m_pImage->GetWidth(), pDoc->m_pImage->GetHeight());
   
     pView->SetScrollSizes(MM_TEXT, sizeTotal);
     pView->ResizeParentToFit(FALSE);
    }
    // 클립보드 닫기
    ::CloseClipboard();
   }

 

  - ID_EDIT_PASTE 아이디의 Update함수 추가 후 코드 삽입

   if(!IsClipboardFormatAvailable(CF_DIB))
   {
    pCmdUI->Enable(FALSE);
   }

 

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
CxImage 소개 및 기본 설치  (0) 2009.03.11
Posted by 열ㅇl
Study/CxImage2009. 3. 18. 13:58

영상 파일을 읽어 오기 (Doc 클래스)

  - CxImage* m_pImage 변수 정의

  - 가상함수 정의창에서 OnOpenDocument() 함수 재정의

  - 코드 삽입

   m_pImage = new CxImage();
   m_pImage->Load(lpszPathName, 0);

 

종료시 메모리 해제 (Doc 클래스)

  - 가상함수 정의창에서 DeleteContents()함수 재정의

  - 코드삽입

     if(m_pImage)
    {
      delete m_pImage;
    }

 

파일 열기 함수 (App 클래스)

  - Class Wizard에서 ID_FILE_OPEN 선택후 OnFileOpen() 함수 재정의.

  - 메시지 맵에서 ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) 주석처리

  - 코드 삽입

   char szFilter[] = "지원 영상처리 파일(*.bmp, *.jpg, *.gif, *.png, *.tif) |*.bmp; *.jpg; *.gif; *.png; *.tif|| ";
   CFileDialog fileDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY, szFilter);

   if(fileDlg.DoModal() == IDOK)
   {
      OpenDocumentFile(fileDlg.GetPathName());
   }

 

영상 출력하기 (View 클래스)

  - OnDraw()함수에 코드 삽입

  if(pDoc->m_pImage)
  {
    CRect rect = CRect(0, 0, (int)pDoc->m_pImage->GetWidth(), (int)pDoc->m_pImage->GetHeight());
    GetClientRect(&rect);

    pDoc->m_pImage->Draw(pDC->GetSafeHdc(), rect, 0);
  }

 

영상 크기에 따른 스크롤 지원하기 (View 클래스)

  - OnInitialUpdate() 함수에 코드삽입

    CKDY013Doc* pDoc = GetDocument();

    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    if(pDoc->m_pImage)
    {
        sizeTotal = CSize(pDoc->m_pImage->GetWidth(),
        pDoc->m_pImage->GetHeight());
    }
    else
    {
       sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);
    ResizeParentToFit(FALSE);

 

처음 실행시 나타나는 창 제거하기 (App 클래스)

  - Instantance() 함수 ParseCommandLine(cmdInfo); 다음에 코드 삽입

    CKDY013Doc* pDoc = GetDocument();

    CScrollView::OnInitialUpdate();

    CSize sizeTotal;


    if(pDoc->m_pImage)
    {
        sizeTotal = CSize(pDoc->m_pImage->GetWidth(),
        pDoc->m_pImage->GetHeight());
    }
    else
    {
       sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);
    ResizeParentToFit(FALSE);

 

드래그 앤 드롭으로 영상 파일 열기 (APP 클래스)

  - Instantance() 함수  if (!ProcessShellCommand(cmdInfo)) return FALSE; 다음에 코드 삽입

  pMainFrame->DragAcceptFiles();

 

영상의 크기에 맞춰 보여주기 (Frame 클래스)

  - 가상함수 정의창에서 ActivateeFrame 함수 선택

  - Frame 클래스에 Doc헤더파일 추가

  - 코드 삽입

   CRect rect, rectClient;
   GetWindowRect(&rect);
   GetClientRect(&rectClient);

   CxImage *m_pImage = ((CKDY013Doc *)GetActiveDocument())->m_pImage;

   if(m_pImage)
   {
     int height = (int)m_pImage->GetHeight() + rect.Height() - rectClient.Height() + 5;
     int width = (int)m_pImage->GetWidth() + rect.Width() - rectClient.Width() + 5;

     SetWindowPos(NULL, 0, 0, width, height, SWP_NOMOVE | SWP_SHOWWINDOW);
   }

 

영상 저장(Doc 클래스)

  - 가상함수 정의창에서 OnSaveDocument() 함수 재정의.

  - 코드 삽입

   int format_type = 0;
 
   // 확장자명을 찾기
   char *ext = (char*)strstr(lpszPathName, ".");

  // 소문자로 변환하기
   ext = strlwr(ext);
 
  // 확장자명을 기준으로 저장한다.
   if(!strcmp(ext, ".bmp"))
   {
      format_type = CXIMAGE_FORMAT_BMP;
   }
   else if(!strcmp(ext, ".gif"))
  {
      format_type = CXIMAGE_FORMAT_GIF;
  }
  else if(!strcmp(ext, ".jpg"))
  {
     format_type = CXIMAGE_FORMAT_JPG;
  }
  else if(!strcmp(ext, ".png"))
  {
     format_type = CXIMAGE_FORMAT_PNG;
  }
  else
  {
     AfxMessageBox("CXIMAGE_FORMAT을 확인하여 주십시요.", MB_OK |

                              MB_ICONSTOP);
     return TRUE;
  }
 
  return m_pImage->Save(lpszPathName, format_type);

 

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
CxImage 소개 및 기본 설치  (0) 2009.03.11
Posted by 열ㅇl
Study/AI System2009. 3. 18. 01:08

퍼셉트론

  - 1957년 미국의 Rosenblatt가 단순히 패턴을 인식하기 위해 제안한 모델.

  - 입력 패턴이 두 개의 클래스 중 어느 하나에 속함을 결정할 때 주로 사용되는 모델.

  - 입력값이 정확하지 않고 다른 클래스에 대한 분포가 평균값에서만 차이가 난다는 점에서 최대유사 가우시안 분류기와 개념상 유

    사.

  - 이동,확대,중복 및 회전된 패턴인 경우 결정 경계선이 계속적으로 진동함으로써 정확히 분류되지 못하는 단점.

  - 이점을 보완하고자 최소 평균 자승 알고리즘 또는 Widrow-Hoff방법이 제시,

  - 이 방법은 원하는 출력값과 실제 출력값과의 평균 자승 오류를 최소화 시킨 것.

  - 3층의 퍼셉트론 모델에서는 활성화 함수로써 시그모이드 함수를 이용한 학습 방법이 오류 역전파 알고리즘.

 

  문제점:

  - XOR문제나 패리티 비트 문제 등의 학습이 불가능함.

  - 즉, 두가지 패턴을 동시에 선형 분리할 수 없다는 것.

 

다층 퍼셉트론

  - 입력층과 출력층 사이에 하나 이상의 계층을 갖는 신경 회로망

  - 예) 3층 퍼셉트론은 입력층과 출력층 사이에 하나의 은닉층을 갖음.

  - 단층 퍼셉트론의 단점을 해결하기 위해 제안된 모델.

  - 적당한 학습 알고리즘이 없다는 이유로 많이 사용되지는 못하였지만 새로운 알고리즘의 개발로 많이 사용되고 있음.

  - 그것이 오류 역전파 알고리즘.

 

오류 역전파 알고리즘

  - 델타 규칙에 하나 이상의 은닉층이 있는 3층 이상의 신경 회로망으로 확장한 학습 방법. (일반화된 델타 규칙)

  - 일반화된 LMS알고리즘.

  - 원하는 출력값과 실제 출력값과의 차이의 제곱을 가장 최소화 하고자 경사 하강 방법 적용.

  - 입력 노드와 관련없는 클래스의 모든 노드의 원하는 출력값은 점점 낮아지고 반대인 경우는 점점 높아짐.

  - XOR문제나, 음성 인식 및 합성 문제, 시각 패턴 인식 문제 등에 많이 이용되어 좋은 결과를 보여줌.

 

  몇가지 문제점

  - 첫째, 수렴을 위해 필요한 훈련 데이터의 입력 횟수가 대개 100번 이상으로 매우 많음.(특히 음성의 경우)

  - 둘째, 가중치가 수렴하지 않고 발산하는 경우 심각한 문제점을 초래할 수 있음.

 

다층 오류 역전파 알고리즘의 문제점

  - 지역 최소점에 빠질 위험이 있다.

  - 포화 영역에서 잘 동작하지 않는다.

  - 전방향 방식으로 입출력이 진행된다. (고차원 시스템 구현시 문제가 될수 있다.)

  - 기타 문제점: 학습이 완료되기까지 많은 횟수의 반복 학습이 필요.

                      응용분야에 따라 학습 파라미터의 조절이 필요.

                      추가 학습시 전체적인 재학습이 필요한 문제.

                      학습의 완료시점을 예측할 수 없다는 문제점.

 

다층 오류 역전파 알고리즘의 문제점에 대한 개선 방법

  - 일괄 수정법

  - 출력값의 제한 방법

  - 모멘텀 방법

  - 수정 모멘텀 방법

  - 학습 계수의 최적화 방법

  - 복잡도 방법

  - 선택적 재학습 방법

  - 연결 강도 개수의 축소방법

 

'Study > AI System' 카테고리의 다른 글

Multilayer Perceptron을 이용한 Zoo 데이터 분류  (0) 2009.05.23
홉필드 신경회로망을 이용한 연상 메모리  (0) 2009.03.23
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.17
Posted by 열ㅇl