【问题标题】:OpenCV Histogram doesn't count white pixels in BGR from GRAYOpenCV 直方图不计算 BGR 中的白色像素和灰色
【发布时间】:2014-09-30 13:27:22
【问题描述】:

我正在使用 OpenCV 结合 C++ 来获取 BGR 中图像的直方图(使用 calcHist 函数),它是使用 GRAY2BGR 从灰度转换而来的。

这里奇怪的是,直方图似乎计算了所有像素,除了...白色像素(255、255、255)。

可能是什么情况?当然我可以将它转换为 HSV 并查找 S = 0 来检测白色像素(我希望它会起作用,还没有测试过)但是当我已经计算了直方图时为什么我应该这样做?你有什么想法吗?

附言。当谈到代码时,我使用流行的“OpenCV Cookbook”第 4 章中的配方来计算颜色直方图。我用这一行阅读了特定的直方图箱:

int val1 = histo.at<float>(col1.blue(),col1.green(),col1.red());

col1 是 QColor 类型(RGB 所以我按照上面所示的顺序读取值以获得 BGR)。

【问题讨论】:

  • 也许它已经在 calcHist 中了,你能添加你在那里使用的值吗?
  • 抱歉,我不明白你的意思。你的意思是函数调用?它是:
  • 当我输出各种 RGB 值的像素数时,它总是显示 0 表示 (255, 255, 255)。所以我可以很容易地通过简单地从图像中存在的所有像素中减去所有其他值的总和来实现。但我很好奇,为什么会这样?

标签: c++ opencv colors histogram


【解决方案1】:

您是否正确设置了范围?

基于示例:http://docs.opencv.org/modules/imgproc/doc/histograms.html#calchist

cv::Mat bgr(480, 640, CV_8UC3, cv::Scalar(255.0, 255.0, 255.0));

// Quantize the B, G and R channels to 30 levels
int histSize[] = {30, 30, 30};

// B, G and R varies from 0 to 255
float bRanges[] = { 0, 256 };
float gRanges[] = { 0, 256 };
float rRanges[] = { 0, 256 };
const float* ranges[] = { bRanges, gRanges, rRanges };

// we compute the histogram from the 0th and 2nd channels
int channels[] = {0, 1, 2};

cv::MatND hist;
cv::calcHist(&bgr, 1, channels, cv::Mat(), hist, 2, histSize, ranges, true, false);

【讨论】:

  • 问题出在我的范围内,因为我为每个设置了 255.0 的值。我认为它会像 而不是
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2013-06-22
  • 2014-05-22
  • 2012-01-15
  • 2016-10-01
  • 2023-03-26
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多