2

さて、OpenCV が提供するサンプルの K-means アルゴリズム プログラムは非常に紛らわしいと言わざるを得ません。午後全体を過ごした後でも、全体像はわかりませんでした。これらは私が尋ねたいいくつかの質問です:

1) K 平均関数は入力としてそのような行列のみを受け取るため、特定の画像を単一列の行列に変換するにはどうすればよいですか? CvMat 関数を使用する必要があることはわかっていますが、正確な方法がわかりません。

2) シード値として所定の強度を使用して、色の強度に応じてクラスター化することは可能ですか?

大事なことを言い忘れましたが、誰かが K-means を少し詳しく説明するリンクを提供できれば幸いです。私はすでにウィローガレージとアイシャックの説明を受けましたが、まだ疑問が残っています. 前もって感謝します !!

これはまさに私がやろうとしていることです:これが提供された画像であるとします

ここに画像の説明を入力

私のコードの出力は、次のようになります。

ここに画像の説明を入力

ご覧のとおり、2 番目の画像では陰影による影響が取り除かれ、明確な色のレイヤーを持つ画像が得られます。

これを行うために、次の方法を適用します。まず、画像の対応する LAB 値に基づいてシード カラーを選択します。次に、シード値を取得した後、K-means クラスタリングを使用して、類似した色を明確なカラー レイヤーにクラスター化しようとします。(上の図に示すように)。

4

1 に答える 1

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 } */
于 2013-11-22T05:27:45.383 に答える