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图像颜色分析的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 图像轮廓检测

OpenCv之图像二值化(笔记12)

youcans 的 OpenCV 例程200篇201. 图像的颜色空间转换

如何在opencv中为图像添加边框,边框颜色必须与图像颜色相同

python-opencv-图像颜色映射

OpenCV中的图像处理 —— 改变颜色空间+图像几何变换