|
안녕하세요...
님의 프로그램을 실행해 보지 않아서 정확히 알 수는 없으나,
제가 봐서는 현재 배경이 빨강, 녹색, 파랑 색일 경우에도 하얀 색으로 될듯 합니다.
그리고 경계구하는 부분에서 정사각형을 그려서 Test하면 왼쪽면 왼쪽 라인만 검출 될듯 하구요...
자....일단 영상 Test하는 방법부터 바꾸심이 어떠하실지.
폼하나 만들고 이미지 하나 만들고 이미지 로딩하는 버튼 하나 만들어서
BMP 파일을 불러서 이미지에 넣어서 Test 하시는 것이 좋습니다.
자...이제 링을 상상해 봤을 때 모든 edge를 다 검출 할지 아니면 링의 외곽만 검출 할지를 먼저 결정합니다.
프로그램 상으로는 모든걸 검출 하는게 쉽죠....
모든걸 검출 할때는 for문으로 영상의 폭, 높이 만큼 돌리고 현재 픽셀이 clWhite 면 4방 검사 ( 상하좌우 ), 할지
8방(인접 8방향 )에 대해 검출 할지를 결정 하고,
4방이면 상하좌우 중 검은색이 있는지 검사 합니다.
만약 외곽만 하고 싶다면 for문으로 각 방향에서 반대 방향으로 검사를 진행 하고 edge가 보이면 라인을
넘어 가는 형태로 짜시믄 외곽만 되죠...물론 원을 찾는데도 문제 없고
아....결과를 바로 원영상에 뿌리지 말고 같은 Image를 하나 만들어서 결과 이미를 따로 display 하세요...
나중에 좀 아실거 같을때 포인터로 처리 하시고 영상도 scanline 쓰시면 속도에 문제 없을듯.
다른 분이 지적한거 처럼 노이즈가 문제가 될경우에는 일단 생각하지 마세요....
그거 보다 많은 문제들이 있을테니 해결 하고 나면 노이즈는 없어져요....
예를 들면 edge 길이 구할려고 하면하는데 중간에 끊어졌다거나 gray가 서로 다르게 차이 난다거나...하시면서 느끼시길...
하다가 안되믄 회신 주세요....sample program 하나 짜 드리죠...
정구일 님이 쓰신 글 :
: 안녕하세요.
: 비트맵 파일 외각선 추출에 관해서 질문이 있어서 이렇게 질문드립니다.
: 비트맵 파일을 불러와서 외각선을 추출해야 합니다.
: 그래서 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);
: }
|