2012-06-29 2 views
2

openCV (C 사용)의 이미지에 kmeans 클러스터링을 구현하려고합니다. 클러스터 된 이미지 대신 일부 색상 레이어를 사용하는 대신 출력이 꽤 이상합니다. 또한 코드를 디버깅하려고 시도했지만 잘못 된 부분을 이해할 수 없었습니다.opencv kmeans 잘못된 출력 클러스터

여기 입력 및 출력 이미지가 있습니다.

enter image description here

올바른 출력 인 왼쪽 중 하나는 입력 화상이다.

image = cvLoadImage("pic65.png", CV_LOAD_IMAGE_UNCHANGED); 
sample = cvCreateMat(image->height*image->width, 5, CV_32FC1); 
clusters = cvCreateMat(image->height*image->width, 1, CV_32SC1); 

data = (uchar *)image->imageData; 
for(i=0;i<image->height;i++) 
{ 
          for(j=0;j<image->width;j++) 
          { 
          cvSetReal2D(sample, k, 0, i); 
          cvSetReal2D(sample, k, 1, j); 
          b = data[i*image->widthStep + j*image->nChannels +0]; 
          g = data[i*image->widthStep + j*image->nChannels +1]; 
          r = data[i*image->widthStep + j*image->nChannels +2]; 
          cvSetReal2D(sample, k, 2, b); 
          cvSetReal2D(sample, k, 3, g); 
          cvSetReal2D(sample, k, 4, r); 
          k++; 
          } 
} 
count = get_clusters(); 

cvKMeans2(sample,count,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,100,0)); 

for (x = 0; x < image->height; x++) 
{ 
for (y = 0; y < image->width; y++) 
{ 
    index = x * image->width + y; 
    cluster_index = cvGetReal2D(clusters,index,0); 
    data[x*image->widthStep + y*image->nChannels +0] = cl[cluster_index][0]; 
    data[x*image->widthStep + y*image->nChannels +1] = cl[cluster_index][2]; 
    data[x*image->widthStep + y*image->nChannels +2] = cl[cluster_index][2]; 
} 
} 

get_clusters 방법은이 경우에 30이다 임계 값에 따라 입력 화상의 색상 클러스터의 수를 반환한다 : 여기

코드이다. 필요한 경우 get_clusters 코드도 제공 할 수 있지만 올바른 것이라고 생각합니다.

누군가 잘못 이해할 수 있습니까? 모든 종류의 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

편집이 : 내 원하는 출력이 아래와 같습니다 : 당신의 "원하는 출력"이미지를 판단

enter image description here

+0

달성하려는 목표는 무엇입니까? 출력은 코드와 일치하는 것처럼 보입니다 : cluster (x, y, r, g, b). 비슷한 색의 지리적 인 이웃들도 같은 클러스터에 있습니다. cl을 정의하지 않았다는 것 외에는. – Antoine

+0

실제로 cl은 get_clusters 메소드에서 얻은 클러스터의 개별 색상입니다. – bluechill

+0

게다가 다른 색상의 색조가 없도록 이미지를 클러스터하고 싶습니다. 그래서 특정 객체에 해당하는 개별 색상 레이어를 얻을 수 있습니다. 원하는 출력이 모든 사람에게 분명하도록 질문을 편집 중입니다. – bluechill

답변

1

, kmeans의 사용량은 잘못된 것입니다. 픽셀 좌표는 클러스터링에서 아무런 역할을하지 않아야합니다. 컬러 세 쌍을 kmeans에만 건네 야합니다. 데이터를 설정할 때

sample = cvCreateMat(image->height*image->width, 3, CV_32FC1); 

...

    for(j=0;j<image->width;j++) 
         { 
         b = data[i*image->widthStep + j*image->nChannels +0]; 
         g = data[i*image->widthStep + j*image->nChannels +1]; 
         r = data[i*image->widthStep + j*image->nChannels +2]; 
         cvSetReal2D(sample, k, 0, b); 
         cvSetReal2D(sample, k, 1, g); 
         cvSetReal2D(sample, k, 2, r); 
         k++; 
         } 

그런 다음 당신은 또한 도로의 아래 더 인덱싱 버그가 있습니다.