<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于Opencv的圖像顏色分析(源碼)

          共 426字,需瀏覽 1分鐘

           ·

          2021-12-23 19:20

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號

          視覺/圖像重磅干貨,第一時(shí)間送達(dá)

          一般來說,直接分析RGB色彩域的顏色分布不是一個(gè)好的思路,我們一般轉(zhuǎn)換到HSV域來分析。但是本文只要是應(yīng)網(wǎng)友提問,實(shí)現(xiàn)最基本的RGB色彩域的主顏色分析。

          代碼分為以下部分:

          1、生成測試圖片。為了測試算法是否準(zhǔn)確,主動(dòng)生成具有25種不同顏色同比重的圖片(每種4%)的測試圖片。

              ////創(chuàng)建具有25種不同顏色同比重的圖片    Mat src = Mat(250,250,CV_8UC3,Scalar(0));    //生成時(shí)間種子    time_t t;time(&t);    RNG rng(t);    //創(chuàng)建圖片    for (int i = 0;i<250;i+=10)        rectangle(src,Point(0,i),Point(src.cols,i+9),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1);    imshow("src",src);    imwrite("e:/template/maincolor.jpg",src);

          生成的結(jié)果大概是這個(gè)樣子的。

          2、讀取圖片數(shù)據(jù),保存到3維數(shù)組中去。

              //bgr立方體     int *iTable = new int [256,256,256];    for (int b=0;b<256;b++)    {        for (int g=0;g<256;g++)        {            for (int r=0;r<256;r++)            {                iTable[b,g,r] = 0;            }        }    }    //出現(xiàn)過的顏色    vector colorAppeared;    //讀取數(shù)據(jù)    for (int i=0;i    {        for (int j=0;j        {            int b = src.at(i,j)[0];            int g = src.at(i,j)[1];            int r = src.at(i,j)[2];            if (iTable[b,g,r] == 0)                colorAppeared.push_back(src.at(i,j));            iTable[b,g,r] ++;        }    }

          ?

          3、將數(shù)組結(jié)果保存到vector中,使用標(biāo)準(zhǔn)庫的排序方法。需要注意的是這里重載了vector的比較函數(shù)

          //重載用于排序的比較函數(shù)bool Comp(const std::pairint> &a,const std::pairint> &b){    return a.second > b.second;} //將出現(xiàn)過的數(shù)據(jù)插入標(biāo)準(zhǔn)庫    for (int i=0;i    {        Vec3b vec3b = colorAppeared[i];        int b = vec3b[0];        int g = vec3b[1];        int r = vec3b[2];        std::pairint> apair(vec3b,iTable[b,g,r]);        result.push_back(apair);    }    //進(jìn)行排序    sort(result.begin(),result.end(),Comp);

          ?

          4、顯示最后結(jié)果

           ////顯示結(jié)果 前20    Mat matResult = Mat(200,200,CV_8UC3,Scalar(0));    for (int i = 0;i<20;i++)    {        Vec3b vec3b = result[i].first;        int iint = result[i].second;        float dpercent = (float)iint / (src.rows * src.cols);        rectangle(matResult,Point(0,i*10),Point(200,i*10+9),vec3b,-1);        printf("第%d種顏色,占比例為%f\n",i+1,(float)dpercent);    }    imshow("matResult",matResult);


          5、完整的代碼如下。感謝閱讀,希望有所收獲,歡迎交流。

          #include "stdafx.h"#include #include "opencv2/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui.hpp"#include #include #include using namespace cv;using namespace std;//重載用于排序的比較函數(shù)bool Comp(const std::pairint> &a,const std::pairint> &b){    return a.second > b.second;}int main( int argc, const char** argv ){    ////創(chuàng)建具有25種不同顏色同比重的圖片    Mat src = Mat(250,250,CV_8UC3,Scalar(0));    //生成時(shí)間種子    time_t t;time(&t);    RNG rng(t);    //創(chuàng)建圖片    for (int i = 0;i<250;i+=10)        rectangle(src,Point(0,i),Point(src.cols,i+9),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1);    imshow("src",src);    imwrite("e:/template/maincolor.jpg",src);    ////進(jìn)行主要顏色分析    //用于保存當(dāng)前出現(xiàn)過的顏色數(shù)據(jù)結(jié)構(gòu)    std::vector<std::pairint>> result;    //bgr立方體     int *iTable = new int [256,256,256];    for (int b=0;b<256;b++)    {        for (int g=0;g<256;g++)        {            for (int r=0;r<256;r++)            {                iTable[b,g,r] = 0;            }        }    }    //出現(xiàn)過的顏色    vector colorAppeared;    //讀取數(shù)據(jù)    for (int i=0;i    {        for (int j=0;j        {            int b = src.at(i,j)[0];            int g = src.at(i,j)[1];            int r = src.at(i,j)[2];            if (iTable[b,g,r] == 0)                colorAppeared.push_back(src.at(i,j));            iTable[b,g,r] ++;        }    }    //將出現(xiàn)過的數(shù)據(jù)插入標(biāo)準(zhǔn)庫    for (int i=0;i    {        Vec3b vec3b = colorAppeared[i];        int b = vec3b[0];        int g = vec3b[1];        int r = vec3b[2];        std::pairint> apair(vec3b,iTable[b,g,r]);        result.push_back(apair);    }    //進(jìn)行排序    sort(result.begin(),result.end(),Comp);    ////顯示結(jié)果 前20    Mat matResult = Mat(200,200,CV_8UC3,Scalar(0));    for (int i = 0;i<20;i++)    {        Vec3b vec3b = result[i].first;        int iint = result[i].second;        float dpercent = (float)iint / (src.rows * src.cols);        rectangle(matResult,Point(0,i*10),Point(200,i*10+9),vec3b,-1);        printf("第%d種顏色,占比例為%f\n",i+1,(float)dpercent);    }    imshow("matResult",matResult);    waitKey();    return 0;}

          ?來源:https://www.cnblogs.com/jsxyhelu/p/7008525.html


          本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
          —THE END—
          瀏覽 52
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV无码久久精品蜜桃小说 | 欧美中文一级 | 日韩一片 | 91黄色操逼视频在线观看 | 最近中文字幕免费MV第一季歌词怀孕 |