OpenCV图像颜色分析
Posted
技术标签:
【中文标题】OpenCV图像颜色分析【英文标题】:OpenCV image color analyzis 【发布时间】:2016-06-30 09:12:58 【问题描述】:我想计算图像中哪种颜色 (bgr) 呈现得更多。
我知道我应该使用:
calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);
但是我如何读取在这行中检测到的每种颜色的值(不进行比较) - 我如何知道在整个图像中检测到的值?
谢谢。
【问题讨论】:
看看here,具体是“获取图像的不同颜色”部分,以及函数getPalette
【参考方案1】:
如果您想知道整个图像中的主要颜色,那么更简单的方法是使用嵌套循环遍历图像并总结各个通道值。 MAY 代码示例如下所示:
float blue_sum = 0;
float green_sum = 0;
float red_sum = 0;
for(unsigned int y = 0; y < your_image_mat.rows; y++)
for(unsigned int x = 0; x < your_image_mat.cols; x++)
blue_sum += (float)your_image_mat.at<cv::Vec3b>(y, x)[0];
green_sum += (float)your_image_mat.at<cv::Vec3b>(y, x)[1];
red_sum += (float)your_image_mat.at<cv::Vec3b>(y, x)[2];
//Then just compare which of the sum values is largest
我不太确定您的 Mat 类型是什么,我假设它是一个相当标准的 RGB Mat,您可能需要稍微调整代码才能使用您正在使用的任何 Mat。
【讨论】:
这不会为您提供最常见的颜色,而只是指示哪个是最常用的通道,这在这里没有用。例如,仅由纯红色和绿色组成的图像,会告诉您当前最常见的颜色是黄色。这与选取图像的mean颜色基本相同,并取最高通道 @Miki 啊,是的,哎呀。那里有点思想失败,我所描述的实际上是像你说的那样找到最主要的渠道。当我在写答案时,我的脑海里就有“主导渠道”的想法,以至于我没有重新阅读这个问题。很抱歉。以上是关于OpenCV图像颜色分析的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇201. 图像的颜色空间转换