이미지처리에서 보로노이 다이어그램으로 분할이 된 영역을 이용하여서 해당픽셀이 어느 보로노이 셀에 들어가 있는가를  알아야 하는 경우가 있다. 이 경우에 보로노이 다이어그램을 구하고, 각각의 셀을 폴리곤으로 만든 후 해당 픽셀점이 어느 폴리곤에 들어가는 가는 체크해야 한다. 그러나, 이 과정은 복잡하고, 해당점의 포함 여부를 판별하는 과정에서 계산이 많이 발생한다. 픽셀을 다루기 때문에 보다 간편하게 하는 것은 이미지 마스크를 이용하면, 해당픽셀의 어느 보로노이 셀에 들어있는지를 바로 알 수 있다. 특히 셀의 갯수가 적은 경우에는 마스크를 그레이이미지로 처리할 수 있어서 메모리사용도 줄일 수 있다.

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

void rasterize_voronoi(BYTE *image, int width, int height, POINT vorocenter[], int N) {
       //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=1000000000;//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) &xFF;      //G;
              *image++ = (color[min_id]) & 0xFF;         //R;
         }
     }
     // draw cell center;
     delete[] color ;
}

사용자 삽입 이미지

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

Bayesian Decision Theory  (1) 2008.06.17
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