最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV利用K-means實(shí)現(xiàn)根據(jù)顏色進(jìn)行圖像分割

 更新時(shí)間:2022年10月28日 14:08:56   作者:天子驕龍  
K-means是一種經(jīng)典的無監(jiān)督聚類算法---不需要人工干預(yù)。本文將通過K-means算法實(shí)現(xiàn)根據(jù)顏色進(jìn)行圖像分割的效果,感興趣的小伙伴可以嘗試一下

K-means算法分割

K-means是一種經(jīng)典的無監(jiān)督聚類算法---不需要人工干預(yù)。

算法原理:

(1)隨機(jī)選擇兩個(gè)中心點(diǎn);

 (2)計(jì)算每個(gè)點(diǎn)到這兩個(gè)中心點(diǎn)的距離,最近的分成一類(連接起來);

 (3)重新計(jì)算中心點(diǎn)(平均值計(jì)算),計(jì)算新的中心點(diǎn)到舊的中心點(diǎn)的差值如果小于輸入的值,就說明中心的位置發(fā)生了變化,,那么到(2)步重新計(jì)算中心點(diǎn)到每個(gè)點(diǎn)的距離,開始下一次循環(huán);

 (4)執(zhí)行多個(gè)迭代之后,滿足收斂時(shí),得到最終的分類

應(yīng)用:分類

根據(jù)顏色分類

#include<opencv2/opencv.hpp>
#include<iostream>


int main(int argc, char** argv) {

    cv::Mat img(500, 500, CV_8UC3);
    cv::RNG rng(12345);
    cv::Scalar colorTab[] = {
        cv::Scalar(0, 0, 255),
        cv::Scalar(0, 255, 0),
        cv::Scalar(255, 0, 0),
        cv::Scalar(0, 255, 255),
        cv::Scalar(255, 0, 255)
    };
    int numCluster = rng.uniform(2, 5);
    printf("種類數(shù)量 : %d\n", numCluster); 
    //4
    int sampleCount = rng.uniform(2, 1000);//隨機(jī)樣本
    printf("樣本數(shù)量 : %d\n", sampleCount);
    //591
    cv::Mat points(sampleCount, 1, CV_32FC2);
    cv::Mat labels;
    cv::Mat centers;

    for (int k = 0; k < numCluster; k++) {
        cv::Point center;
        center.x = rng.uniform(0, img.cols);//隨機(jī)坐標(biāo)
        center.y = rng.uniform(0, img.rows);
        cv::Mat pointChunk = points.rowRange(k * sampleCount / numCluster, k == numCluster - 1 ? sampleCount : (k + 1) * sampleCount / numCluster);
        //每一類占1/numCluster 行
        //rng.fill(pointChunk, cv::RNG::NORMAL, cv::Scalar(center.x, center.y), cv::Scalar(img.cols * 0.05, img.rows * 0.05));//用隨機(jī)數(shù)填充矩陣
        rng.fill(pointChunk, cv::RNG::UNIFORM, 0, 255);//用隨機(jī)數(shù)填充矩陣
        
    }

    randShuffle(points, 1, &rng);//算法打亂元素排列順序
    kmeans(points, numCluster, labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 10, 0.1), 3, cv::KMEANS_PP_CENTERS, centers);
    /*【根據(jù)參數(shù)1的坐標(biāo)進(jìn)行分類】
    參數(shù)1:為cv::Mat類型,每行代表一個(gè)樣本,即特征,即mat.cols=特征長度,mat.rows=樣本數(shù),數(shù)據(jù)類型僅支持float
    參數(shù)2:K  指定聚類時(shí)劃分為幾類
    參數(shù)3:為cv::Mat類型,是一個(gè)長度為(樣本數(shù),1)的矩陣,即mat.cols=1,mat.rows=樣本數(shù);為K-Means算法的結(jié)果輸出,指定每一個(gè)樣本聚類到哪一個(gè)label中【指定每一個(gè)樣本聚類到哪一類中】
    參數(shù)4:TermCriteria類,算法進(jìn)行迭代時(shí)終止的條件,可以指定最大迭代次數(shù),也可以指定預(yù)期的精度,也可以這兩種同時(shí)指定;
            參數(shù)1:int type 
                    type=TermCriteria::MAX_ITER/TermCriteria::COUNT  迭代到最大或迭代次數(shù)終止
                    type= TermCriteria::EPS   迭代到閾值終止
                    type= TermCriteria::MAX_ITER+ TermCriteria::EPS 上述兩者都作為迭代終止條件
            參數(shù)2:int maxCount  迭代的最大次數(shù)
            參數(shù)3:double epsilon   閾值(中心位移值)
    參數(shù)5:指定K-Means算法執(zhí)行的次數(shù),每次算法執(zhí)行的結(jié)果是不一樣的,選擇最好的那次結(jié)果輸出
    參數(shù)6:初始化均值點(diǎn)的方法,目前支持三種:KMEANS_RANDOM_CENTERS、KMEANS_PP_CENTERS、KMEANS_USE_INITIAL_LABELS 
    參數(shù)7:為cv::Mat類型,輸出最終的均值點(diǎn),mat.cols=特征長度,mat.rols=K 【每個(gè)類的中心點(diǎn)】

    */


    // 用不同顏色顯示分類
    //初始化圖片顏色。
    img = cv::Scalar::all(255);
    for (int i = 0; i < sampleCount; i++) {
        int index = labels.at<int>(i);
        //獲取ponint點(diǎn)
        cv::Point p = points.at<cv::Point2f>(i);
        //填充
        circle(img, p, 2, colorTab[index], -1, 8);
    }

    // 每個(gè)聚類的中心來繪制圓
    for (int i = 0; i < centers.rows; i++) {
        int x = centers.at<float>(i, 0);
        int y = centers.at<float>(i, 1);
        printf("c.x= %d, c.y=%d", x, y);
        circle(img, cv::Point(x, y), 40, colorTab[i], 1, cv::LINE_AA);
    }

    imshow("KMeans-Data-Demo", img);



        
    cv::waitKey(0);
    return 0;
}

實(shí)例 

2.png

#include<opencv2/opencv.hpp>
#include<iostream>

int main(int argc, char** argv) {

    
    cv::Scalar colorTab[] = {
        cv::Scalar(0, 0, 255),
        cv::Scalar(0, 255, 0),
        cv::Scalar(255, 0, 0),
        cv::Scalar(0, 255, 255),
        
        };
    
    cv::Mat src = cv::imread("D:/bb/tu1/2.png");
    if (!src.data)
    {
        printf("圖像讀取失敗...\n");
        return -1;
    }
    cv::imshow("src", src);

    int width = src.cols;
    int height = src.rows;
    int dims = src.channels();

    int sampleCount = width * height;  //總像素
    int clusterCount = 4;  //分類數(shù)量
    cv::Mat points(sampleCount, dims,CV_32F,cv::Scalar(10));
    //一個(gè)像素為一行
    cv::Mat labels;
    cv::Mat centers(clusterCount,1, points.type());
    //保存中心坐標(biāo)

    //把RGB數(shù)據(jù)轉(zhuǎn)換成樣本數(shù)據(jù)
    int index = 0;//像素序號(hào)
    for (int row = 0; row < height;row++) {
        for (int col = 0; col < width;col++) {
            index = row * width + col;
            cv::Vec3b bgr = src.at<cv::Vec3b>(row, col);
            points.at<float>(index, 0) = static_cast<int>(bgr[0]);
            points.at<float>(index, 1) = static_cast<int>(bgr[1]);
            points.at<float>(index, 2) = static_cast<int>(bgr[2]);

        }

    }

      
    cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS,10,0.1);
    //kmeans的終止的條件
    
    kmeans(points, clusterCount, labels, criteria, 3, cv::KMEANS_PP_CENTERS, centers);//運(yùn)行kmeans 

    //顯示圖像分割結(jié)果
    cv::Mat result = cv::Mat::zeros(src.size(),src.type());
    for (int row = 0; row < height;row++) {
        for (int col = 0; col < width;col++) {
            index = row * width + col;
            int label = labels.at<int>(index, 0); //獲取類序號(hào)
            result.at<cv::Vec3b>(row, col)[0] = colorTab[label][0];
            result.at<cv::Vec3b>(row, col)[1] = colorTab[label][1];
            result.at<cv::Vec3b>(row, col)[2] = colorTab[label][2];
            
        }
    }

    cv::imshow("result", result);





    cv::waitKey(0);
    return 0;
}

以上就是OpenCV利用K-means實(shí)現(xiàn)根據(jù)顏色進(jìn)行圖像分割的詳細(xì)內(nèi)容,更多關(guān)于OpenCV K-means圖像分割的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C++?STL模擬實(shí)現(xiàn)vector

    詳解C++?STL模擬實(shí)現(xiàn)vector

    這篇文章主要為大家詳細(xì)介紹了C++如何模擬實(shí)現(xiàn)STL容器vector,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2023-01-01
  • C++變量賦值實(shí)現(xiàn)過程

    C++變量賦值實(shí)現(xiàn)過程

    這篇文章主要介紹了C++變量賦值實(shí)現(xiàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-07-07
  • C語言打印菱形實(shí)例詳解

    C語言打印菱形實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于C語言如何打印菱形的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解C語言實(shí)現(xiàn)猜數(shù)字游戲

    詳解C語言實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)猜數(shù)字游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-01-01
  • opencv實(shí)現(xiàn)圖形輪廓檢測

    opencv實(shí)現(xiàn)圖形輪廓檢測

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖形輪廓檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++11 <future>中std::promise 介紹

    C++11 <future>中std::promise 介紹

    這篇文章主要介紹了C++11 <future>中std::promise 介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++印刷模板使用方法詳解

    C++印刷模板使用方法詳解

    模板是C++支持參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)聲明一種一般模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類型
    2022-11-11
  • C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解

    C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解

    在 C/C++ 中,內(nèi)存管理是一個(gè)非常棘手的問題,我們?cè)诰帉懸粋€(gè)程序的時(shí)候幾乎不可避免的要遇到內(nèi)存的分配邏輯。本文將通過C++實(shí)現(xiàn)高性能內(nèi)存池,感興趣的可以了解一下
    2022-10-10
  • C語言詳細(xì)講解注釋符號(hào)的使用

    C語言詳細(xì)講解注釋符號(hào)的使用

    C語言的注釋符是以“/*”開頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時(shí),不對(duì)注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調(diào)試程序中對(duì)暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理
    2022-04-04
  • C語言掃雷游戲的實(shí)現(xiàn)方法

    C語言掃雷游戲的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了C語言掃雷游戲的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

富蕴县| 修文县| 浏阳市| 宜章县| 谢通门县| 桐梓县| 稻城县| 阿城市| 松原市| 志丹县| 都昌县| 即墨市| 邯郸县| 洱源县| 历史| 镇赉县| 襄城县| 涿州市| 鲁山县| 怀宁县| 高碑店市| 藁城市| 高雄市| 肃宁县| 永春县| 潜山县| 辽中县| 无极县| 喀喇| 红原县| 通城县| 黄山市| 苗栗市| 洪湖市| 措美县| 电白县| 蚌埠市| 连江县| 常宁市| 马尔康县| 灵寿县|