[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*kmeans(InputArray samples, int clusterCount, InputOutputArray labels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray() )
Parameters: |
|
---|
輸入樣本的浮點矩陣,每個樣本一行
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);
得到影象效果如下:
將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網路後自己算是鬆懈了很多,好長的時間都沒有堅持再更新部落格了。“腐敗”生活了這麼久,還是要找到自己一點樂趣吧,於是想了一想,決定把《機器學習》的演算法研究過得都重新梳理一遍,於是就從無監督學習——聚類