直方图 bin 总数不等于图像像素大小
Histogram bin totals do not equal to image pixel size
我有以下 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问题相对较少,网络上的其他内容似乎都是问题的副本在这里。)
我意识到我在使用上述方法时有几个错误。我正在尝试计算已调整大小并转换为灰度的图像的直方图,当然,这已经破坏了原始图像的规格!
除此之外,根本问题是对于直方图处理,必须首先将图像分成其通道(蓝色、绿色、红色)。否则,每个像素值的可能性在 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 (image background)
otherPixels: 1,531 (text)
totals: 108,288 (correct number of pixels in the image)
我希望这在直方图基础知识以及 EMGU CV 中对图像的像素级访问方面对其他人有所帮助。
我有以下 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问题相对较少,网络上的其他内容似乎都是问题的副本在这里。)
我意识到我在使用上述方法时有几个错误。我正在尝试计算已调整大小并转换为灰度的图像的直方图,当然,这已经破坏了原始图像的规格!
除此之外,根本问题是对于直方图处理,必须首先将图像分成其通道(蓝色、绿色、红色)。否则,每个像素值的可能性在 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 (image background)
otherPixels: 1,531 (text)
totals: 108,288 (correct number of pixels in the image)
我希望这在直方图基础知识以及 EMGU CV 中对图像的像素级访问方面对其他人有所帮助。