K-means在opencv中进行聚类

时间:2012-06-15 13:12:03

标签: opencv k-means

好的,所以我必须说OpenCV提供的样本K-means algo程序非常混乱。即使花了整整一个下午也没有全面了解情况。这些是我想问的几个问题:

1)如何将给定图像转换为单列矩阵,因为K-means函数只需要输入这样的矩阵?我知道我必须使用CvMat函数,但不能弄清楚究竟是怎样的。

2)是否可以根据颜色强度进行聚类,使用一些预先确定的强度作为种子值?

最后但并非最不重要,它会很高;如果有人可以提供任何解释K-means的链接,那么我们会感激不尽。我已经完成了遗嘱和aishack的解释,仍然存在疑虑。在此先感谢!!

这正是我想要做的事情: 假设这是提供的图像

enter image description here

我的代码输出应该是这样的:

enter image description here

正如您所看到的,在第二个图像中,由于阴影导致的效果被删除,我们得到的图像具有明确的颜色层。

现在,我正在应用以下方法 首先,我根据图像的相应LAB值选择种子颜色。然后在获得种子值之后,我尝试使用K均值聚类将相似的颜色聚类成确定的颜色层。 (如上图所示)。

1 个答案:

答案 0 :(得分: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 } */