2016-02-27 3 views
-2

Я изложу свой вопрос, потому что это было недостаточно ясно. Итак, кластеризация k означает разбиение «n наблюдений» на k кластеров, в которых каждое наблюдение относится к кластеру с ближайшим средним значением. В моем случае «наблюдения» - «двоичные образы»; действительно, я хочу сгруппировать набор двоичных изображений в кластер k, потому что этот набор изображений близок. Я хочу разбить их на k closter, чтобы представлять каждый кластер на одно изображение (характеристическое изображение). Я пытаюсь реализовать предложение @ Miki («матрица» MxN, где N = image.rows * image.cols). Но я не знаю, как преобразовать «матрицу» в cv :: InputArray, чтобы использовать метод k -средства opencv. Это часть моего кода:Как использовать k-средство между двоичными изображениями?

CString numImage 
int i,j,k,val,Nx,Ny,***matrice; 
FILE *fsource,*fdist; 
//memory allocation 
matrix = (int***)malloc(100*sizeof(int**)); //100 binary images 
for (int q=0 ;q < 100;q++) 
{ 
    numImage.Format("%d",q); 
    fsource = fopen("path_to_image" + numImage + ".txt","r");   
    fscanf(fsource,"%d %d",&Nx,&Ny); 

    //memory allocation 
    matrice[q] = (int**)malloc(Nx*sizeof(int*)); 
    for(i = 0 ; i < Nx ;i++) 
     matrice[q][i] = (int*)malloc(Ny*sizeof(int)); 

    // Loading data 
    for(i = 0 ; i < Nx ; i++) 
    { 
     for(j = 0 ; j < Ny ; j++) 
      { 
       fscanf(fsource,"%d",&val); 
       matrice[q][i][j] = val; 
       } 
    } 
} 
+2

певце не применяются kmeans к изображениям, но и на точках в N-мерном пространстве. Поэтому, пожалуйста, уточните, что вы пытаетесь сделать. В настоящее время не имеет никакого смысла – Miki

+0

k - означает, что кластеризация нацелена на разделение «n наблюдений» на k кластеров, в которых каждое наблюдение относится к кластеру с ближайшим средним значением. В моем случае «наблюдения» - «двоичные образы»; действительно, я хочу сгруппировать набор двоичных изображений в кластер k, потому что этот набор изображений близок. Я хочу разбить их на кластер K для представления позже, каждая группа с одним характерным изображением. Надеюсь, что мой вопрос ясен. – Ilyass

+0

Итак, каждая из ваших N-мерных точек - это _unrolled_ изображение, где N = image.rows * image.cols. Вы можете кормить kmeans матрицей MxN, где M - количество ваших изображений. Обратите внимание, что если ваши изображения большие (большой N), вам понадобится очень большое количество изображений (M), чтобы иметь какой-то смысл, или вы понесете в _curse размерности_ – Miki

ответ

0

это часть моего кода:

 CString numImage 
    int i,j,k,val,Nx,Ny,***matrice; 
    FILE *fsource,*fdist; 
    //memory allocation 
    matrix = (int***)malloc(100*sizeof(int**)); //100 binary images 
    for (int q=0 ;q < 100;q++) 
    { 
     numImage.Format("%d",q); 
     fsource = fopen("path_to_image" + numImage + ".txt","r");   
     fscanf(fsource,"%d %d",&Nx,&Ny); 

     //memory allocation 
     matrice[q] = (int**)malloc(Nx*sizeof(int*)); 
     for(i = 0 ; i < Nx ;i++) 
      matrice[q][i] = (int*)malloc(Ny*sizeof(int)); 

     // Loading data 
     for(i = 0 ; i < Nx ; i++) 
     { 
      for(j = 0 ; j < Ny ; j++) 
       { 
        fscanf(fsource,"%d",&val); 
        matrice[q][i][j] = val; 
        } 
     } 
    } 
+0

Пожалуйста, отредактируйте исходный вопрос. Не ставьте изменения как «ответы», потому что это явно не ответ! – Rook

+0

жаль, что я новичок в этом форуме, я переформулировал свой вопрос. – Ilyass

Смежные вопросы