直方图箱总数不等于图像像素大小

时间:2015-02-11 16:59:11

标签: opencv image-processing emgucv

我有以下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乘282,生成108,288像素。但直方图256个分档的内容总数为4,724(如MessageBox代码所示)。总不应该是108,288? (也许我错过了直方图概念的基本原理?)

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

1 个答案:

答案 0 :(得分:2)

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

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

以下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中图像的像素级访问。