【问题标题】:Histogram bin totals do not equal to image pixel size直方图 bin 总数不等于图像像素大小
【发布时间】:2025-12-12 22:30:01
【问题描述】:

我有以下 EMGU CV 代码来为灰度图像创建直方图:

Image<Bgr, Byte> img = new Image<Bgr,
    Byte>(fileNameTextBox.Text).Resize(400, 400,
    Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR, true);

// Convert to grayscale and filter out noise.
Image<Gray, Byte> gray = img.Convert<Gray, Byte>().PyrDown().PyrUp();

DenseHistogram dh = new DenseHistogram(256, new RangeF(0, 255));
dh.Calculate(new Image<Gray, Byte>[] { gray }, false, null);
float[] valHist = new float[256];           // # of bins: 256
dh.MatND.ManagedArray.CopyTo(valHist, 0);
float total = 0F;
for (int ii = 0; ii < 256; ii++)
{
    total += valHist[ii];
}
MessageBox.Show("Bins total: " + total);

我用下面的图像运行上面的代码(原始图像不包含它周围的边框 - 我在这里添加了它以进行分界):

图像为 384 x 282,即 108,288 像素。但是直方图的 256 个 bin 的内容总和为 4,724(如MessageBox 代码所示)。总数不应该是108,288吗? (也许我缺少直方图概念的基础知识?)

(免责声明:我是图像处理和 EMGU CV 的新手,虽然我做过研究,但这里关于 SO 的 EMGU 问题相对较少,网络上的所有其他内容似乎都是这里问题的副本。 )

【问题讨论】:

    标签: opencv image-processing emgucv


    【解决方案1】:

    我意识到上面的方法有几个错误。我试图计算已调整大小并转换为灰度的图像的直方图,这当然破坏了原始图像的规格!

    除此之外,基本问题是对于直方图处理,必须首先将图像分成其通道(蓝色、绿色、红色)。否则,每个像素值的可能性在 0 到 16,581,375 (224) 之间,并且尝试将每个这样的强度放在自己的 bin 中可能需要一个大小矩阵224,每个项目最多需要 217 位。

    以下 C# 代码总计纯白色像素和其他像素。在这种情况下,总数是正确的:

    int pureWhites = 0;
    int otherPixels = 0;
    int totals = 0;
    Bgra tmp;
    
    for (int ii = 0; ii < 282; ii++)
    {
        for (int jj = 0; jj < 384; jj++)
        {
            tmp = img[ii,jj];
            if (tmp.Blue == 255 && tmp.Green == 255 && tmp.Red == 255)
                pureWhites++;
            else
                otherPixels++;
        }
    }
    
    totals = purewhites + otherPixels;
    

    对于有问题的图片(上图),总数如下:

    pureWhites:106,757(图片背景)
    其他像素:1,531(文本)
    总计:108,288(图像中正确的像素数)

    我希望这可以帮助其他人了解直方图基础知识以及对 EMGU CV 中图像的像素级访问。

    【讨论】:

    • 我不认为你只能得到 RGB 像素的直方图。您可以完美地获得灰度值像素的直方图。我刚刚浏览了 EMGU DenseHistogram 类的一些文档,但使用它在您的代码中找不到任何错误,因此错误可能确实在您创建/调整大小/转换图像的部分。
    • @RFerwerda 谢谢。在我上面的回答中,我描述了如何获得复合像素值的直方图(如果你真的想要的话),但你是对的,典型的方法是将颜色分成 R、G、B 通道。
    • @Sabuncu 所以你确实在这里走来走去。 ;)
    • @karlphillip 感谢您环顾四周,非常感谢,尤其是。来自你。
    最近更新 更多