이진 영상에서 전경의 경계를 저장하는 함수다. 전경의 최외각을 8-방향 연결성을 체크하면서 추적하도록 설계되었다(chain code를 참조하면 된다). 전경의 두께가 1 픽셀이더라도 항상 닫힌 윤곽선을 형성하게 만들었다(다르게 행동하도록 바꿀 수 있다). 전경에 서로 연결되지 않은 blob가 여러 개 있는 경우도 쉽게 처리할 수 있게 출력은 벡터 컨테이너를 사용했다.
struct Cntr {
int x, y ; //position;
int idirn ;//chain-code;
Cntr() {}
Cntr(int x_, int y_, int idirn_) : x(x_), y(y_), idirn(idirn_){}
};
typedef std::vector<Cntr> CntrVector;
#define FGVAL 255
#define BGVAL 0
#define VISITED 33 /* pixel value on accepted contour */
int GetNextCntr (BYTE** image, int *x, int *y, int *idirn);
int ContourTrace (BYTE** image/*binary image(FGVAL,BGVAL)*/, int width, int height,
std::vector<CntrVector* > &CntList) {
/* CAUTION:: one-pixel border should have BGVAL!!!!*/
for (int x = width; x-->0;) image[0][x] = image[height-1][x] = BGVAL;
for (int y = height; y-->0;) image[y][0] = image[y][width-1] = BGVAL;
for (int y = height-1; y-->1;) {
for (int x = width-1; x-->1;) {
if (image[y][x] == FGVAL && image[y][x - 1] == BGVAL) {
CntrVector *pCntrVec = new CntrVector ;
int idirn = 2;
int xStart = x, yStart = y;
pCntrVec->push_back(Cntr(x, y, idirn));
do {
image[y][x] = VISITED; /* set the default value to VISITED */
GetNextCntr (image, &x, &y, &idirn);
pCntrVec->push_back(Cntr(x, y, idirn));
} while (!(x == xStart && y == yStart));
CntList.push_back(pCntrVec);
}
}
}
return CntList.size();
};
/* 다음 픽셀을 검사. 체인 코드; */
int GetNextCntr (BYTE** image, int *x, int *y, int *idirn);
728x90
'Image Recognition' 카테고리의 다른 글
Gaussian Mixture Model (2) | 2008.06.07 |
---|---|
Rasterizing Voronoi Diagram (0) | 2008.05.26 |
RANSAC Algorithm (0) | 2008.05.24 |
Gausssian Scale Space (0) | 2008.05.22 |
Watershed Algorithm 적용의 예 (2) | 2008.05.21 |