K均值演算法opencv 分割應用

2021-08-23 14:07:13 字數 2509 閱讀 3954

2023年11月02日 23:00:51

k均值(k-means)演算法是一種無監督的聚類學習演算法,他嘗試找到樣本資料的自然類別,分類是k由使用者自己定義,k均值在不需要任何其他先驗知識的情況下,依據演算法的迭代規則,把樣本劃分為k類。k均值是最常用的聚類技術之一,通過不斷迭代和移動質心來完成分類,與均值漂移演算法的原理很相似。

k均值演算法的實現過程:

k均值的核心就是不斷移動類別劃分的中心點,直到該點穩定下來或者達到所設定的最大迭代次數,這時當前中心點所劃分的類別就是最終的k均值對樣本資料的聚類。

下圖是對k-means迭代過程的簡單演示。假設有n 個資料樣本需要進行分類,這裡k取值 為2:

(a)初始資料集合

(b)隨機選取兩個點作為初始聚類中心

(c)計算每個點到聚類中心的距離,並聚類到離該點最近的聚類中去

(d)計算每個聚類中所有點的座標平均值,並將這個平均值 作為新的聚類中心

(e)重複(c),計算每個點到聚類中心的距離,並聚類到離該點最近的聚類中去

(f) 重複(d),計算每個聚類中所有點的座標平均值,並將這個平均值作為新的聚類中心,直到滿足迭代條件。

雖然k-means演算法原理簡單,也有自身的缺陷:

以下是用k-means演算法對一幅影象進行分割的**實現:

#include

#include

#include

#include

#include

using

namespace cv;

using

namespace

std;

intmain

(int argc, char* argv)

}int clustercount =

4; mat centers

(clustercount, 1, samples.type());

kmeans(samples, clustercount, labels,

termcriteria( cv_termcrit_eps+cv_termcrit_iter,

10,

1.0),

3, kmeans_pp_centers, centers);

//我們已知有3個聚類,用不同的灰度層表示。

mat img1

(img.rows, img.cols, cv_8uc1)

;

float step=

255/(clustercount -

1);

k=0;

for(i=

0; i < img1.rows; i++)

}namedwindow(

「k-means分割效果」,

0);

imshow(

「k-means分割效果」, img1);

waitkey();

return

0;

}

原始影象:

由於原影象素大小是4160x2336,計算時候也沒有進行壓縮,所以k-means的迭代消耗時間也是很可觀的,在我的機器上整個耗時約60s。

對影象進行分割,採用k=2效果:

k=3效果:

k=4效果:

非學,無以致疑;非問,無以廣識

k均值演算法

k-means

影象分割

個人分類:

機器學習

所屬專欄:

opencv下的機器學習

opencv與

opencv取整

opencv斷言

opencv生長

opencv修復

▼檢視關於本篇文章更多資訊

K均值演算法 應用

1.應用k means演算法進行壓縮 讀取一張 觀察檔案大小,佔記憶體大小,資料結構,線性化 用kmeans對畫素顏色進行聚類 獲取每個畫素的顏色類別,每個類別的顏色 觀察壓縮的檔案大小,佔記憶體大小 原圖大小 image.size 7 print 原圖記憶體 sys.getsizeof image...

K 均值演算法

動態聚類方法是模式識別中一種普遍採用的方法,它具有以下3個要點 1 選定某種距離度量作為樣本間的相似性度量 2 確定某個評價聚類結果質量的準則函式 3 給定某個初始分類,然後用迭代演算法找出使準則函式取極值的最好的聚類結果 k means演算法 輸入 聚類個數k,以及包含 n個資料物件的資料庫。輸出...

K均值演算法

假設需要聚成k個類 演算法先會隨機從資料集中選取k個點,把他們當做k個聚類的中心點 依次計算資料集中的每乙個點與各個中心點的距離,離哪個中心點近,就劃分到那個中心點對應的聚類下 計算分到同一類簇下,所有點的均值,更新中心點,重複 直至達到迭代結束條件 import numpy as np impor...