openCV (C 사용)의 이미지에 kmeans 클러스터링을 구현하려고합니다. 클러스터 된 이미지 대신 일부 색상 레이어를 사용하는 대신 출력이 꽤 이상합니다. 또한 코드를 디버깅하려고 시도했지만 잘못 된 부분을 이해할 수 없었습니다.opencv kmeans 잘못된 출력 클러스터
여기 입력 및 출력 이미지가 있습니다.
올바른 출력 인 왼쪽 중 하나는 입력 화상이다.
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 코드도 제공 할 수 있지만 올바른 것이라고 생각합니다.누군가 잘못 이해할 수 있습니까? 모든 종류의 도움을 주시면 감사하겠습니다. 미리 감사드립니다.
편집이 : 내 원하는 출력이 아래와 같습니다 : 당신의 "원하는 출력"이미지를 판단
달성하려는 목표는 무엇입니까? 출력은 코드와 일치하는 것처럼 보입니다 : cluster (x, y, r, g, b). 비슷한 색의 지리적 인 이웃들도 같은 클러스터에 있습니다. cl을 정의하지 않았다는 것 외에는. – Antoine
실제로 cl은 get_clusters 메소드에서 얻은 클러스터의 개별 색상입니다. – bluechill
게다가 다른 색상의 색조가 없도록 이미지를 클러스터하고 싶습니다. 그래서 특정 객체에 해당하는 개별 색상 레이어를 얻을 수 있습니다. 원하는 출력이 모든 사람에게 분명하도록 질문을 편집 중입니다. – bluechill