2012-06-15 7 views
2

Хорошо, поэтому я должен сказать, что программа-алгоритм программы K-mean, предоставляемая OpenCV, довольно запутанна. Даже проведя весь день, он не получил всю картину. Вот несколько вопросов, которые я хотел бы задать:K-означает кластеризацию в opencv

1) Как преобразовать заданное изображение в одну матрицу столбцов, поскольку функция K -средства принимает только такую ​​матрицу, как вход? Я знаю, что мне нужно использовать функцию CvMat, но не могу понять, как именно.

2) Можно ли группировать в зависимости от интенсивности цвета, используя некоторую заранее определенную интенсивность в качестве начальных значений?

Последнее, но не менее важное: это было бы высоко, я бы оценил, может ли кто-нибудь предоставить любую ссылку, которая объясняет К-средства в деталях. Я уже пережил объяснения, и все еще сомнения остаются. Заранее спасибо !!

Это именно то, что я пытаюсь сделать: Пусть это изображение при условии

enter image description here

Вывод мой код должен быть примерно так:

enter image description here

As вы можете видеть, что во втором изображении эффекты из-за затенения удаляются, и мы получаем изображение с определенными цветовыми слоями.

Теперь для этого я применяю следующий метод: Сначала я выбираю цвета семян на основе соответствующих значений LAB изображения. Затем, после получения значений семян, я пытаюсь сгруппировать аналогичные цвета в определенный цветовой слой с использованием кластеризации K-mean. (как показано на рисунке выше).

+0

Что именно вы пытаетесь сделать с KMeans и Image? Каковы ожидаемые результаты (логически?)? – penelope

ответ

0
//Aim:To implement Kmeans clustering algorithm. 
    //Program 
    import java.util.*; 
    class k_means 
    { 
    static int count1,count2,count3; 
    static int d[]; 
    static int k[][]; 
    static int tempk[][]; 
    static double m[]; 
    static double diff[]; 
    static int n,p; 

    static int cal_diff(int a) // This method will determine the cluster in which an element go at a particular step. 
    { 
    int temp1=0; 
    for(int i=0;i<p;++i) 
    { 
    if(a>m[i]) 
    diff[i]=a-m[i]; 
    else 
    diff[i]=m[i]-a; 
    } 
    int val=0; 
    double temp=diff[0]; 
    for(int i=0;i<p;++i) 
    { 
    if(diff[i]<temp) 
    { 
    temp=diff[i]; 
    val=i; 
    } 
    }//end of for loop 
    return val; 
    } 

    static void cal_mean() // This method will determine intermediate mean values 
    { 
    for(int i=0;i<p;++i) 
    m[i]=0; // initializing means to 0 
    int cnt=0; 
    for(int i=0;i<p;++i) 
    { 
    cnt=0; 
    for(int j=0;j<n-1;++j) 
    { 
    if(k[i][j]!=-1) 
    { 
    m[i]+=k[i][j]; 
    ++cnt; 
    }} 
    m[i]=m[i]/cnt; 
    } 
    } 

    static int check1() // This checks if previous k ie. tempk and current k are same.Used as terminating case. 
    { 
    for(int i=0;i<p;++i) 
    for(int j=0;j<n;++j) 
    if(tempk[i][j]!=k[i][j]) 
    { 
    return 0; 
    } 
    return 1; 
    } 

    public static void main(String args[]) 
    { 
    Scanner scr=new Scanner(System.in); 
    /* Accepting number of elements */ 
    System.out.println("Enter the number of elements "); 
    n=scr.nextInt(); 
    d=new int[n]; 
    /* Accepting elements */ 
    System.out.println("Enter "+n+" elements: "); 
    for(int i=0;i<n;++i) 
    d[i]=scr.nextInt(); 
    /* Accepting num of clusters */ 
    System.out.println("Enter the number of clusters: "); 
    p=scr.nextInt(); 
    /* Initialising arrays */ 
    k=new int[p][n]; 
    tempk=new int[p][n]; 
    m=new double[p]; 
    diff=new double[p]; 
    /* Initializing m */ 
    for(int i=0;i<p;++i) 
    m[i]=d[i]; 

    int temp=0; 
    int flag=0; 
    do 
    { 
    for(int i=0;i<p;++i) 
    for(int j=0;j<n;++j) 
    { 
    k[i][j]=-1; 
    } 
    for(int i=0;i<n;++i) // for loop will cal cal_diff(int) for every element. 
    { 
    temp=cal_diff(d[i]); 
    if(temp==0) 
    k[temp][count1++]=d[i]; 
    else 
    if(temp==1) 
    k[temp][count2++]=d[i]; 
    else 
    if(temp==2) 
    k[temp][count3++]=d[i]; 
    } 
    cal_mean(); // call to method which will calculate mean at this step. 
    flag=check1(); // check if terminating condition is satisfied. 
    if(flag!=1) 
    /*Take backup of k in tempk so that you can check for equivalence in next step*/ 
    for(int i=0;i<p;++i) 
    for(int j=0;j<n;++j) 
    tempk[i][j]=k[i][j]; 

    System.out.println("\n\nAt this step"); 
    System.out.println("\nValue of clusters"); 
    for(int i=0;i<p;++i) 
    { 
    System.out.print("K"+(i+1)+"{ "); 
    for(int j=0;k[i][j]!=-1 && j<n-1;++j) 
    System.out.print(k[i][j]+" "); 
    System.out.println("}"); 
    }//end of for loop 
    System.out.println("\nValue of m "); 
    for(int i=0;i<p;++i) 
    System.out.print("m"+(i+1)+"="+m[i]+" "); 

    count1=0;count2=0;count3=0; 
    } 
    while(flag==0); 

    System.out.println("\n\n\nThe Final Clusters By Kmeans are as follows: "); 
    for(int i=0;i<p;++i) 
    { 
    System.out.print("K"+(i+1)+"{ "); 
    for(int j=0;k[i][j]!=-1 && j<n-1;++j) 
    System.out.print(k[i][j]+" "); 
    System.out.println("}"); 
    } 
    } 
    } 
    /* 
    Enter the number of elements 
    8 
    Enter 8 elements: 
    2 3 6 8 12 15 18 22 
    Enter the number of clusters: 
    3 

    At this step 
    Value of clusters 
    K1{ 2 } 
    K2{ 3 } 
    K3{ 6 8 12 15 18 22 } 
    Value of m 
    m1=2.0 m2=3.0 m3=13.5 

    At this step 
    Value of clusters 
    K1{ 2 } 
    K2{ 3 6 8 } 
    K3{ 12 15 18 22 } 
    Value of m 
    m1=2.0 m2=5.666666666666667 m3=16.75 

    At this step 
    Value of clusters 
    K1{ 2 3 } 
    K2{ 6 8 } 
    K3{ 12 15 18 22 } 
    Value of m 
    m1=2.5 m2=7.0 m3=16.75 

    At this step 
    Value of clusters 
    K1{ 2 3 } 
    K2{ 6 8 } 
    K3{ 12 15 18 22 } 
    Value of m 
    m1=2.5 m2=7.0 m3=16.75 

    The Final Clusters By Kmeans are as follows: 
    K1{ 2 3 } 
    K2{ 6 8 } 
    K3{ 12 15 18 22 } */ 
+0

попытайтесь отформатировать свой ответ. Это увеличивает вероятность быстрого принятия ответа. Пожалуйста, обратитесь к документации для форматирования ответа. –

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