C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[49257] Re:비트맵 파일 외각선 추출 관련
머슴.한석복 [han8783] 2108 읽음    2007-05-14 14:49
정구일 님이 쓰신 글 :
: 안녕하세요.
: 비트맵 파일 외각선 추출에 관해서 질문이 있어서 이렇게 질문드립니다.
: 비트맵 파일을 불러와서 외각선을 추출해야 합니다.
: 그래서 bmp 파일 rgb 값을 사용하여 외각선을 추출하려고 합니다.
: 방법은 우선 배경은 하얀색이라는 가정을 두고 시작했습니다.
: 배경이 하얀색이기 때문에 하얀색 이외의 색은 모두 검은색으로 만듭니다.
: 그리고 rgb 값을 읽어 하얀색 rgb 값 다음 rgb 값이 검은색이면
: 그 곳이 경계선이 되게 했습니다.
: 그런데 약간의 문제가 있는지 생각 처럼 잘 되지 않습니다.
: 무엇이 잘 못 되었는지 봐주시면 감사하겠습니다.
:
: /*
:     비트맵 파일 이미지를 불러와서 그 이미지에 외각선을 추출한다.
:     그 이미지에 배경색은 하얀색이다.
: */
:
: #include <stdio.h>
:
: #define BYTE unsigned char
: #define MAX 1000                // 비트맵에 크기를 자동으로 계산 하는 방법을 모르겠습니다.
:
: struct BMP_DATA                    // 비트맵 RGB값
: {
:     BYTE    r;
:     BYTE    g;
:     BYTE    b;
: };
:
: void main()
: {
:     static struct BMP_DATA rgb[MAX];
:     int i = 0;
:     FILE *fp;
:     fp = fopen ("test.bmp", "w");
:
:     while (i < MAX)                // 비트맵 배경이 하얀색이지만 완전 하얀색이 아닐수 있으므로 완전 하얀색을 만든다.
:     {
:         if (rgb[i].r > 220)
:         {
:             rgb[i].r = 255;
:         }
:         if (rgb[i].g > 220)
:         {
:             rgb[i].g = 255;
:         }
:         if (rgb[i].b > 220)
:         {
:             rgb[i].b = 255;
:         }
:         i++;
:     }
:
:     while (i < MAX)                // 배경이 아니라면 검은색으로 바꾼다.
:     {
:         if (rgb[i].r != 255)
:         {
:             rgb[i].r = 0;
:         }
:         if (rgb[i].g != 255)
:         {
:             rgb[i].g = 0;
:         }
:         if (rgb[i].b != 255)
:         {
:             rgb[i].b = 0;
:         }
:         i++;
:     }
:
:     while (i < MAX)                // 하얀색 다음 검은색이라면 그 곳이 경계 이므로 색을 바꾼다.
:     {
:         if (rgb[i].r == 255 || rgb[i].g == 255 || rgb[i].b == 255)
:         {
:             if (rgb[i+1].r == 0 || rgb[i+1].g == 0 || rgb[i+1].b == 0)
:             {
:                 rgb[i].r = 100;
:                 rgb[i].g = 100;
:                 rgb[i].b = 100;
:             }
:         }
:         i++;
:     }
:     fclose(fp);
: }
소스상에는 흰색에서->검은색인경우에는 Detection이 되겠지만, 그 반대의 경우에는 Detection이 안되겠군요.

예를들어서, 정사각형의 상자라고 한다면 왼편은 소스상에서 구현된바와 같이 흰색->검은색으로 배열이 되어 있겠지만, 반대쪽은 검은색->흰색의 순서로 배열이 되어 있겠죠. 이미 아시는 바 일수도 있겠지만요.

그리고, 이러한 에지를 구하는 알고리즘의 경우에는 픽셀단위( 한픽셀 단위 )로 연산을 하는 것은 오류가 생길 가능성이 있어 보입니다. 일반적으로 주변 픽셀들과의 평균을 구한 후, 그 차이값에 의해 구하는 것이 일반적인 방법인것 같습니다. 그리고 만약, 이미지 프로세싱에 대해서 연습을 하시는 중이라면, 이런 RGB이미지보다 RAW 포맷의 이미지로 연습을 하시는 것이 좋지 않을까 생각 됩니다.( 8 bit 이미지 )

+ -

관련 글 리스트
49245 비트맵 파일 외각선 추출 관련 정구일 1866 2007/05/14
49271     Re:비트맵 파일 외각선 추출 관련 2456 2007/05/16
49278         Re:Re:비트맵 파일 외각선 추출 관련 정구일 1593 2007/05/16
49283             Re:Re:Re:비트맵 파일 외각선 추출 관련 1455 2007/05/17
49290                 Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 정구일 1422 2007/05/17
49293                     Re:Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 1292 2007/05/17
49299                         Re:Re:Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 정구일 1295 2007/05/17
49301                             Re:Re:Re:Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 1373 2007/05/18
49302                                 Re:Re:Re:Re:Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 정구일 1405 2007/05/18
49300                             Re:Re:Re:Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 1311 2007/05/18
49284                 Re:Re:Re:Re:비트맵 파일 외각선 추출 관련 - scanline으로 하면 빨라요 장성호 1684 2007/05/17
49261     Re:비트맵 파일 외각선 추출 관련 장성호 2256 2007/05/14
49270         Re:Re:비트맵 파일 외각선 추출 관련 정구일 1453 2007/05/15
49257     Re:비트맵 파일 외각선 추출 관련 머슴.한석복 2108 2007/05/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.