728x90

이미지에서 Voronoi diagram으로 영역을 분할할 때 각 픽셀이 어느 Voronoi cell에 포함되는가를 알아야 하는 경우가 있다. 보통은 Voronoi 다이어그램으로 구한 cell을 폴리곤으로 표현하고, 해당 픽셀이 어느 폴리곤에 들어가는 가는 체크 해야 한다. 그러나, 이 과정은 복잡하고 계산이 많이 발생한다. 이미지에 만들어진 Voronoi diagram의 경우 cell mask를 이용하면 해당 픽셀이 어느 cell에 들어있는지를 바로 판단할 수 있다. 특히, cell의 개수가 적은 경우 mask를 gray 이미지로 처리할 수 있어서 메모리 사용도 줄일 수 있다.

Voronoi diagram의 이미지화 과정은 Voronoi 알고리즘을 이용할 필요는 없고 단지 각 cell을 형성하는 픽셀들은 그 cell의 중심까지 거리가 다른 cell보다 가깝다는 사실만 이용한다.

void rasterize_voronoi(POINT vorocenter [], int N, BYTE *image, int width, int height) {
    // RGB 컬러이미지이므로 image는 적어도 (3 * width * height) 크기의 버퍼를 가져야 한다.
    // make color lookup table;
    DWORD *color = new DWORD [N]; //RGBQUAD;
    // 랜덤 컬러 LUT;
    for (int i = 0; i < N; i++) 
        color[i] = (rand() % 256) << 16 | (rand() % 256) << 8 | (rand() % 256);
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int min_id = 0; 
            int dist2_min = INT_MAX; //caution overflow;
            for (int k = 0; k < N; k++) {
                int dx = x - vorocenter[k].x;
                int dy = y - vorocenter[k].y;
                int ds2 = dx * dx + dy * dy;
                if (ds2 < dist2_min) {
                    dist2_min = ds2;
                    min_id = k;
                }
            }
            // set pixel value(here,we use RGB-color) wih verocenter[i]'s id
            *image++ = (color[min_id] >> 16) & 0xFF;   //B;
            *image++ = (color[min_id] >> 8)  & 0xFF;   //G;
            *image++ = (color[min_id])       & 0xFF;   //R;
        }
    };
    // draw cell center;
    delete[] color ;
};

사용자 삽입 이미지

 

'Image Recognition' 카테고리의 다른 글

EM Algorithm: Line Fitting 예  (0) 2008.06.29
Gaussian Mixture Model  (2) 2008.06.07
Rasterizing Voronoi Diagram  (0) 2008.05.26
RANSAC Algorithm  (0) 2008.05.24
Contour Tracing  (0) 2008.05.22
Gausssian Scale Space  (0) 2008.05.22
Posted by helloktk

댓글을 달아 주세요