基于Opencv的圖像顏色分析(源碼)
點(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)過的顏色vectorcolorAppeared; //讀取數(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é)果 前20Mat 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、完整的代碼如下。感謝閱讀,希望有所收獲,歡迎交流。
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)過的顏色vectorcolorAppeared; //讀取數(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é)果 前20Mat 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
評論
圖片
表情
