|
정구일 님이 쓰신 글 :
: 안녕하세요.
: 비트맵 파일 외각선 추출에 관해서 질문이 있어서 이렇게 질문드립니다.
: 비트맵 파일을 불러와서 외각선을 추출해야 합니다.
: 그래서 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 이미지 )
|