1. 程式人生 > >[opencv]K-means聚類演算法分割影象

[opencv]K-means聚類演算法分割影象

1.K-means演算法

K-means是一種經典的無監督聚類演算法。

演算法原理: (1)從N個數據物件中取K個點作為聚類中心。 (2)計算N個數據物件到各個聚類中心的距離,將N個數據物件劃分到距離最近的中心,形成K個聚類。 (3)計算每個聚類的中心,將新的中心代替原來的中心。 (4)檢查新老聚類中心的距離,重複(2)-(3)直到距離小於規定閾值。

2.opencv函式

cvKMeans2(const CvArr* samples, int nclusters, CvArr* labels, CvTermCriteria criteria, int attempts=1, CvRNG*
rng=0, int flags=0, CvArr* centers=0, double* compactness=0)

kmeans(InputArray samples, int clusterCount, InputOutputArray labels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray() )

Parameters:
  • samples – Floating-point matrix of input samples, one row per sample.
  • clusterCount
     – Number of clusters to split the set by.
  • labels – Input/output integer array that stores the cluster indices for every sample.
  • criteria – The algorithm termination criteria, that is, the maximum number of iterations and/or the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of the cluster centers moves by less than criteria.epsilon
     on some iteration, the algorithm stops.
  • attempts – Flag to specify the number of times the algorithm is executed using different initial labelings. The algorithm returns the labels that yield the best compactness (see the last function parameter).
  • flags –

    Flag that can take the following values:

    • KMEANS_RANDOM_CENTERS Select random initial centers in each attempt.
    • KMEANS_PP_CENTERS Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].
    • KMEANS_USE_INITIAL_LABELS During the first (and possibly the only) attempt, use the user-supplied labels instead of computing them from the initial centers. For the second and further attempts, use the random or semi-random centers. Use one of KMEANS_*_CENTERS flag to specify the exact method.
  • centers – Output matrix of the cluster centers, one row per each cluster center.
sample

輸入樣本的浮點矩陣,每個樣本一行

clusterCount

給定的聚類數目 

labels

輸出整數向量:每個樣本對應的類別標識 

criteria

迭代終止條件:迭代最大次數和精度

attempts

執行K-means的次數,取結果最好的聚類為最終聚類,和flags一起使用

flags

KMEANS_RANDOM_CENTERS每次嘗試選取隨機初始化中心

KMEANS_PP_CENTERS  使用Arthur and Vassilvitskii演算法進行中心初始化

KMEANS_USE_INITIAL_LABELS使用使用者自定義初始點

3.實現

處理影象:

將影象的顏色資料進行K-means聚類,這裡有黑、白、紅三色,所以分為3類進行效果測試。

將影象每個畫素三通道值按行存給樣本samples。

	for (int i = 0; i < img->width;i++)
	{
		for (int j = 0; j < img->height;j++)
		{
			CvScalar s;
			s.val[0] = (float)cvGet2D(img, j, i).val[0];
			s.val[1] = (float)cvGet2D(img, j, i).val[1];
			s.val[2] = (float)cvGet2D(img, j, i).val[2];
			cvSet2D(samples,k++,0,s);
		}
	}
nCluster定義為3。

進行K-means聚類分析

	cvKMeans2(samples,nCluster,clusters,cvTermCriteria(CV_TERMCRIT_ITER,100,1.0));
儲存結果給clusters,這裡是根據影象座標對應顏色的聚類結果分別標誌為0,1,2。

測試分類效果:

將影象基於聚類標籤結果進行提取。

(1)提取標籤0

	k = 0;
	int val = 0;

	for (int i = 0; i < img->width;i++)
	{
		for (int j = 0; j < img->height;j++)
		{
			val = (int)clusters->data.i[k++];

			CvScalar s1;
			if (val == 0)
			{
				s1.val[0] = 255;
			}
			else
			{
				s1.val[0] = 0;
			}
			cvSet2D(bin,j,i,s1);
		}
	}
將影象基於bin進行mask複製,顯示標籤0對應的區域
	cvThreshold(bin,bin,200,255,CV_THRESH_BINARY);
	IplImage *img1=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
	cvCopy(img,img1,bin);
	cvShowImage("原圖", img);
	cvShowImage("bin",bin);
	cvShowImage("聚類影象",img1);
	cvWaitKey(0);

得到影象效果如下:



(2)提取標籤1

將val改為1,得到影象效果如下:



(3)提取標籤2

將val改為2,得到影象效果如下:


相關推薦

[opencv]K-means演算法分割影象

1.K-means演算法 K-means是一種經典的無監督聚類演算法。 演算法原理: (1)從N個數據物件中取K個點作為聚類中心。 (2)計算N個數據物件到各個聚類中心的距離,將N個數據物件劃分到距

OpenCV學習筆記 020】K-Means演算法介紹及實現

一、K-Means演算法介紹 在資料探勘中,K-Means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。 問題 K-Means演算法主要解決的問題如下圖所示。我們可以看到,在圖的左邊有一些點,

影象處理】K-means演算法

 原文:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html  K-means也是聚類演算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個演算法是在學習韓爺爺那本資料探勘的

吳恩達老師機器學習筆記K-means演算法(二)

運用K-means聚類演算法進行影象壓縮 趁熱打鐵,修改之前的演算法來做第二個練習—影象壓縮 原始圖片如下: 程式碼如下: X =imread('bird.png'); % 讀取圖片 X =im2double(X); % unit8轉成double型別 [m,n,z]=size

吳恩達老師機器學習筆記K-means演算法(一)

今天接著學習聚類演算法 以後堅決要八點之前起床學習!不要浪費每一個早晨。 K-means聚類演算法聚類過程如下: 原理基本就是先從樣本中隨機選擇聚類中心,計算樣本到聚類中心的距離,選擇樣本最近的中心作為該樣本的類別。最後某一類樣本的座標平均值作為新聚類中心的座標,如此往復。 原

使用Java實現K-Means演算法

第一次寫部落格,隨便寫寫。 關於K-Means介紹很多,還不清楚可以查一些相關資料。 個人對其實現步驟簡單總結為4步: 1.選出k值,隨機出k個起始質心點。  2.分別計算每個點和k個起始質點之間的距離,就近歸類。  3.最終中心點集可以劃分為k類,

機器學習 (十二)讓你輕鬆理解K-means 演算法

前言        你還記得菜市場賣菜的嗎?書店賣書的或者是平時去超市買東西時的物品,它們是不是都根據相似性擺放在一起了呢,飲料、啤酒、零食分佈在各自區域,像這樣各級事物的相似特點或特性組織在一起的方法,在機器學習裡面即成為

K-means演算法原理簡單介紹

K-means演算法 (1. 剛開始隨機選擇兩個點作為簇重心,然後計算每個資料點離這個重心的距離並把這些點歸為兩個類) (上一步的結果如下圖,所有離藍色叉近的點被標為藍色了,紅色亦然)

【機器學習】接地氣地解釋K-means演算法

       俗話說“物以類聚,人以群分”,這句話在K-means聚類演算法裡面得到了充分的繼承。而K-means演算法的實際應用範圍可謂是大到無法估量,基本可以說,只要你想不到,沒有聚類聚不起來的東西!       &nbs

吳恩達機器學習 筆記八 K-means演算法

1. 代價函式   K-means演算法是比較容易理解的,它屬於無監督學習方法,所以訓練樣本資料不再含有標籤。我們假設有樣本資料x(1),x(2),⋯,x(m)x(1),x(2),⋯,x(m),我們選擇設定KK個聚類中心u1,u2,⋯,uKu1,u2,⋯,uK

吳恩達機器學習第七次作業Part1: K-means演算法

這是習題和答案的下載地址,全網最便宜,只要一積分哦~~~ 0.綜述 學習K-means聚類演算法,並對一幅影象進行畫素壓縮。 1.Find Closest Centroids 這是指令碼 %% ================= Part 1: Find Clo

ML-61: 機器學習之K均值(K-Means)演算法含原始碼

機器學習之K均值聚類演算法1 演算法原理2 演算法例項3 典型應用參考資料 機器學習分為監督學習、無監督學習和半監督學習(強化學習)。無監督學習最常應用的場景是聚類(clustering)和降維(dimension reduction)。聚類演算法包括:K均值

K-means演算法——機器學習

聚類屬於無監督學習,以往的迴歸、樸素貝葉斯、SVM 等都是有類別標籤 y 的,也就 是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定 y,即監督樣本。 在聚類問題中,給我們的訓練樣本是{?(1),…,?(?)},每個?(?) ∈ ℝ?,沒有了 y。  K-mean

機器學習 K-means 演算法 C++

筆記: 尚未解決的問題 :     1. 只支援二維,而不支援三維或更高,需要模板元     2. 尚未實現如何刪除極端點, 即預處理     3. 尚未視覺化 編譯環境 Ubuntu gcc 5.4 編譯選項  g++ -std=c++14 #include &l

K-Means演算法小結

1.基本概念 K-Means演算法是一種很典型的基於距離的聚類演算法,採用距離作為相似性的評價標準,認為兩個物件的距離越近,那麼相似度就越大。把簇作為距離靠近的物件組成的,最終得到的是緊湊和獨立的簇。對於聚類分析來說,用於發現數據物件之間的關係。組內的相似性越大,組間的相似

單機環境及分散式環境下K-Means演算法的執行例項

  單機環境下的K-Means聚類演算法執行例項 參考書籍《Mahout in Action》:要資源的可以找我~(中英文都有) 在eclipse平臺上實現K-Means例項 程式碼如下: package kmeans; import java.io.File; im

Python實現K-Means演算法

       宣告:程式碼的執行環境為Python3。Python3與Python2在一些細節上會有所不同,希望廣大讀者注意。本部落格以程式碼為主,程式碼中會有詳細的註釋。相關文章將會發布在我的個人部落格專欄《Python從入門到深度學習》,歡迎大家關注~

深入理解K-Means演算法

概述 什麼是聚類分析 聚類分析是在資料中發現數據物件之間的關係,將資料進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。 不同的簇型別 聚類旨在發現有用的物件簇,在現實中我們用到很多的簇的型別,使用不同的簇型別劃分資料的結果是不同的,如下的

java實現K-means演算法k-means演算法原理

/** * 需要所有point 以及族中心list * * @author:Yien * @when:2018年5月20日下午3:14:09 * @Description:TOD

【無監督學習】1:K-means演算法原理

前言:粗略研究完神經網路基礎——BP、CNN、RNN、LSTM網路後自己算是鬆懈了很多,好長的時間都沒有堅持再更新部落格了。“腐敗”生活了這麼久,還是要找到自己一點樂趣吧,於是想了一想,決定把《機器學習》的演算法研究過得都重新梳理一遍,於是就從無監督學習——聚類