成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenCV中的KMeans算法介紹與應用

開發 后端 算法
KMeans算法是MacQueen在1967年提出的,是最簡單與最常見的數據分類方法之一。它做為一種常見數據分析技術在機器學習、數據挖掘、模式識別、圖像分析等領域都有應用。如果從分類角度看,KMeans屬于硬分類即需要人為指定分類數目,而MeanSift分類方法則可以根據收斂條件自動決定分類數目。

我是51CTO學院講師賈志剛,在51CTO學院 “4.20 IT充電節”(4月19~20日) 到來之際,和大家分享一下《OpenCV中KMeans算法應用》的經驗。正文來啦~~~

OpenCV中的KMeans算法介紹與應用

一、KMeans算法介紹

KMeans算法是MacQueen在1967年提出的,是最簡單與最常見的數據分類方法之一。它做為一種常見數據分析技術在機器學習、數據挖掘、模式識別、圖像分析等領域都有應用。如果從分類角度看,KMeans屬于硬分類即需要人為指定分類數目,而MeanSift分類方法則可以根據收斂條件自動決定分類數目。從學習方法上來說,KMeans屬于非監督學習方法即整個學習過程中不需要人為干預的學習方法,自動完成整個數據集合分類。對于給定的數據集合DS (Data Set)與輸入的分類數目K,KMeans的整個工作原理可以描述如下:

    1. 根據輸入的分類數目K定義K個分類,每個分類選擇一個中心點

    2. 對DS中每個數據點做如下操作:

- 計算它與K個中心點之間的距離

- 把數據點指定屬于K個中心點中距離最近的中心點所屬的分類

    3. 對K個分類中每個數據點計算平均值得到新的K個中心點

    4. 比較新K個中心點之間與第一步中已經存在的K個中心差值

- 當兩者之間的差值沒有變化或者小于指定閾值,結束分類

- 當兩者之間的差值或者條件不滿足時候,用新計算的中心點值做為K個分類的新中心點,繼續執行2~4步。直到條件滿足退出。

從數學的角度來說KMeans就是要找到K個分類而且他們的中心點到各個分類中各個數據的之間差值平方和最小化,而實現這個過程就是要通過上述2~4步不斷的迭代執行,直到收斂為止。公式表示如下:

以上是KMeans算法的基本思想,想要實現或者應用該算法有三個注意點值得關注:

1. 初始的K個分類中每個分類的中心點選擇,多數的算法實現都是支持隨機選擇與人工指定兩種方式,OpenCV中的KMeans實現同樣支持這兩種方式。

2. 多維數據支持,多數時候我們要分類的特征對象的描述數據不止一個數據特征,而是一個特征向量來表示,OpenCV中通過Mat對象構建實現對多維數據KMeans分類支持。

3. 收斂條件 - 一般情況下在達到指定的迭代次數或者兩次RSS差值小于給定閾值的情況下,結束執行分類處理,輸出最終分類結果。

下圖是一個例子,黑色的點代表數據點,十字表示中心點位置,初始輸入的分類數目K=2時,KMeans各步執行結果:

 

二、OpenCV中KMeans相關函數說明

KMeans是OpenCV核心模塊的一個API函數。

各個參數的詳細解釋如下:

- data表示輸入的數據集合,可以一維或者多維數據,類型是Mat類型,比如:

Mat points(count, 2, CV_32F)

表示數據集合是二維,浮點數數據集。

- K表示分類的數目,最常見的是K=2表示二分類。

-bestLabels表示計算之后各個數據點的最終的分類索引,是一個INT類型的Mat對象。

-criteria表示算法終止的條件,達到最大循環數目或者指定的精度閾值算法就停止繼續分類迭代計算。

- attempts表示為了獲得最佳的分類效果,算法要不同的初始分類嘗試次數

- flags表示選擇初始中心點選擇方法用哪一種

KMEANS_RANDOM_CENTERS 表示隨機選擇中心點

KMEANS_PP_CENTERS 基于中心化算法選擇

KMEANS_USE_INITIAL_LABELS第一次分類中心點用輸入的中心點

- centers表示輸出的每個分類的中心點數據。

三、應用案例-利用KMeans實現圖像分割

KMeans在圖像處理中經典應用場景就是根據用戶輸入的分類數目實現圖像自動區域分割,本例就是基于OpenCV KMeans函數實現圖像的自動分割, 對彩色圖像來說,每個像素點都有RGB三個分量,整個圖像可以看成是一個3維數據集合,只要把這個三維數據集作為輸入參數傳給KMeans函數即可,算法執行完畢之后,根據分類標記的索引設置不同的顏色即可。所以演示程序的實現步驟如下:

1. 將輸入圖像轉換為數據集合

2. 使用KMeans算法對數據實現分類

3. 根據每個數據點的分類索引,對圖像重新填充顏色,顯示分割后圖像。

運行效果如下:

完整的代碼實現如下:

  1. #include<opencv2/opencv.hpp> 
  2. #include<iostream> 
  3.  
  4. usingnamespace cv; 
  5. usingnamespace std; 
  6.  
  7. int main(intargc, char** argv) { 
  8.     Mat src = imread("D:/vcprojects/images/toux.jpg"); 
  9.     imshow("input", src); 
  10.     int width = src.cols; 
  11.     int height = src.rows
  12.     int dims = src.channels(); 
  13.  
  14.     // 初始化定義 
  15.     int sampleCount = width*height; 
  16.     int clusterCount = 4; 
  17.     Mat points(sampleCount, dims, CV_32F, Scalar(10)); 
  18.     Mat labels; 
  19.     Mat centers(clusterCount, 1, points.type()); 
  20.  
  21.     // 圖像RGB到數據集轉換 
  22.     int index = 0; 
  23.     for (int row = 0; row < height; row++) { 
  24.         for (int col = 0; col < width; col++) { 
  25.             index = row*width + col; 
  26.             Vec3b rgb = src.at<Vec3b>(row, col); 
  27.             points.at<float>(index, 0) = static_cast<int>(rgb[0]); 
  28.             points.at<float>(index, 1) = static_cast<int>(rgb[1]); 
  29.             points.at<float>(index, 2) = static_cast<int>(rgb[2]); 
  30.         } 
  31.     } 
  32.  
  33.     // 運行K-Means數據分類 
  34.     TermCriteria criteria = TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0); 
  35.     kmeans(points, clusterCount, labels, criteria, 3, KMEANS_PP_CENTERS, centers); 
  36.  
  37.     // 顯示圖像分割結果 
  38.     Mat result = Mat::zeros(src.size(), CV_8UC3); 
  39.     for (int row = 0; row < height; row++) { 
  40.         for (int col = 0; col < width; col++) { 
  41.             index = row*width + col; 
  42.             int label = labels.at<int>(index, 0); 
  43.             if (label == 1) { 
  44.                 result.at<Vec3b>(row, col)[0] = 255; 
  45.                 result.at<Vec3b>(row, col)[1] = 0; 
  46.                 result.at<Vec3b>(row, col)[2] = 0; 
  47.             } 
  48.             elseif (label == 2) { 
  49.                 result.at<Vec3b>(row, col)[0] = 0; 
  50.                 result.at<Vec3b>(row, col)[1] = 255; 
  51.                 result.at<Vec3b>(row, col)[2] = 0; 
  52.             } 
  53.             elseif (label == 3) { 
  54.                 result.at<Vec3b>(row, col)[0] = 0; 
  55.                 result.at<Vec3b>(row, col)[1] = 0; 
  56.                 result.at<Vec3b>(row, col)[2] = 255; 
  57.             } 
  58.             elseif (label == 0) { 
  59.                 result.at<Vec3b>(row, col)[0] = 0; 
  60.                 result.at<Vec3b>(row, col)[1] = 255; 
  61.                 result.at<Vec3b>(row, col)[2] = 255; 
  62.             } 
  63.         } 
  64.     } 
  65.     imshow("kmeans-demo", result); 
  66.     //imwrite("D:/vcprojects/images/cvtest.png", result); 
  67.     waitKey(0); 
  68.     return 0; 
  69.  

作者介紹

賈志剛:圖書作者,51CTO學院簽約講師,專注于圖像處理相關領域,精通OpenCV、ImageJ等開發框架。

51CTO學院 4.20 IT充電節

(19-20號兩天,100門視頻課程免單搶,更有視頻課程會員享6折,非會員享7折,套餐折上8折,微職位立減2000元鉅惠)

活動鏈接:http://edu.51cto.com/activity/lists/id-47.html?wenzhang

相關視頻教程:

《OpenCV視頻分析與對象跟蹤實戰教程》

http://edu.51cto.com/course/course_id-8837.html 

責任編輯:龐桂玉 來源: 51CTO.com
相關推薦

2024-08-29 09:48:41

2015-09-21 09:20:55

2011-05-27 17:28:27

nofollowSEO

2010-05-24 09:24:15

MySQL 備份

2010-03-10 19:25:04

python多線程

2011-07-15 15:47:02

JAVA

2013-12-12 10:27:35

通信網絡OSPF優化

2017-11-30 18:05:18

2014-05-15 09:43:11

CloudaMobile WebANodejs

2021-04-15 09:36:44

Java數據結構算法

2011-07-20 17:16:50

C++重載函數

2019-06-06 08:52:00

2010-03-17 15:58:08

Python環境

2025-04-10 08:20:00

OpenCV圖像處理計算機視覺

2024-10-10 15:51:50

2010-06-07 19:57:36

UML和模式應用

2010-02-02 17:11:10

2011-08-04 16:17:39

iPhone 開發工具

2011-08-04 16:28:01

iPhone 開發工具 Accessoriz

2010-03-16 15:16:48

無線ZigBee技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久在线 | 日韩中文字幕一区二区 | 欧美男人天堂 | 成人欧美一区二区三区在线播放 | 成人免费观看男女羞羞视频 | 久久精品手机视频 | 日本人和亚洲人zjzjhd | 国产伦一区二区三区视频 | 国产精品久久精品 | 天天人人精品 | 美日韩中文字幕 | 久热久| 久操av在线| 天天操,夜夜爽 | 日本精品一区二区三区在线观看视频 | 亚洲成人高清 | 久久久久久成人 | 日本精品视频一区二区 | 韩国欧洲一级毛片 | 色一阁| 涩涩片影院 | 日韩精品| 精品免费国产一区二区三区四区介绍 | 久久成人亚洲 | 视频一区在线观看 | 在线播放国产视频 | 国产久视频 | 日本免费小视频 | 欧美一区二区三区在线视频 | 日韩精品人成在线播放 | 在线观看国产www | 成人午夜免费在线视频 | 日韩视频国产 | 午夜一区二区三区视频 | 99re99| a在线观看 | 在线免费观看成年人视频 | 97精品久久 | 久久人 | 国产福利在线视频 | 国产午夜精品一区二区三区在线观看 |