专栏名称: 新机器视觉
最前沿的机器视觉与计算机视觉技术
目录
相关文章推荐
小小牛财经  ·  deepseek最新消息23家公司新增概念 ·  昨天  
DataEye短剧观察  ·  DataEye短剧热力榜:6部短剧播放超3亿 ... ·  昨天  
DataEye短剧观察  ·  DataEye短剧热力榜:6部短剧播放超3亿 ... ·  昨天  
楼市诸葛v  ·  深圳地铁大爆发! ·  昨天  
楼市诸葛v  ·  深圳地铁大爆发! ·  昨天  
科技头版  ·  深圳比亚迪,让整个汽车行业躁动不安 ·  昨天  
科技头版  ·  深圳比亚迪,让整个汽车行业躁动不安 ·  昨天  
广东省发展和改革委员会  ·  广东省发展改革委关于备案创业投资企业2024 ... ·  2 天前  
51好读  ›  专栏  ›  新机器视觉

基于Opencv的图像颜色分析(源码)

新机器视觉  · 公众号  · 科技自媒体  · 2024-09-29 21:31

主要观点总结

本文主要介绍了一种基于OpenCV库实现的最基本的RGB色彩域的主颜色分析方法。

关键观点总结

关键观点1: 生成测试图片。

为了测试算法是否准确,主动生成具有25种不同颜色同比重的图片(每种颜色占比4%)的测试图片。

关键观点2: 读取图片数据并保存至3维数组。

通过创建BGR立方体,遍历图片的每个像素点,将出现过的颜色及其出现次数记录到数组中。

关键观点3: 对数组结果进行排序。

使用标准库的排序方法,根据颜色的出现次数进行排序。

关键观点4: 显示最后的结果。

显示排序后的前20种颜色及其占比,并展示在图像上。

关键观点5: 代码开源共享。

完整的代码被开源共享,欢迎交流和学习。


正文

一般来说,直接分析RGB色彩域的颜色分布不是一个好的思路,我们一般转换到HSV域来分析。但是本文只要是应网友提问,实现最基本的RGB 色彩域的主颜色分析。

代码分为以下部分:

1、生成测试图片。为了测试算法是否准确,主动生成 具有25种不同颜色同比重的图片(每种4%)的 测试图片。

    ////创建具有25种不同颜色同比重的图片    Mat src = Mat(250,250,CV_8UC3,Scalar(0));    //生成时间种子    time_t t;time(&t);    RNG rng(t);    //创建图片    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);

生成的结果大概是这个样子的。

2、读取图片数据,保存到3维数组中去。

    //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;            }        }    }    //出现过的颜色    vector colorAppeared;    //读取数据    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、将数组结果保存到vector中,使用标准库的排序方法。需要注意的是这里重载了vector的比较函数

//重载用于排序的比较函数bool Comp(const std::pairint> &a,const std::pairint> &b){    return a.second > b.second;} //将出现过的数据插入标准库    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);    }    //进行排序    sort(result.begin(),result.end(),Comp);


4、显示最后结果

 ////显示结果 前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;//重载用于排序的比较函数bool Comp(const std::pairint> &a,const std::pairint> &b){    return a.second > b.second;}int main( int argc, const char** argv ){    ////创建具有25种不同颜色同比重的图片    Mat src = Mat(250,250,CV_8UC3,Scalar(0));    //生成时间种子    time_t t;time(&t);    RNG rng(t);    //创建图片    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);    ////进行主要颜色分析    //用于保存当前出现过的颜色数据结构    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;            }        }    }    //出现过的颜色    vector colorAppeared;    //读取数据






请到「今天看啥」查看全文