2D 和 3D 图像直方图和 2D 多级熵






4.69/5 (14投票s)
使用图像直方图和熵函数进行图像处理。
使用2D多阶段熵进行自动图像分割
该软件支持位图和JPEG。您可以打开这些文件并查看它们的2D直方图和熵函数;您可以将图像阈值设置为2、4和8灰度级。您可以尝试不同的图像处理功能,如直方图均衡化、熵最大值和熵多阶段最大值计算、3D直方图计算和3D直方图均衡化。您可以保存处理后的图像,并将计算出的2D直方图和3D直方图函数保存在*txt*文件中,以便在MathCAD或Excel中打开。此版本支持加载和处理AVI文件。请注意,AVI处理需要大量时间;请确保在包含100-300帧的AVI文件上测试该应用程序。
定义
数字图像是模拟性质的离散表示。与传统的摄影图像一样,它们大多呈矩形。每张图像由许多称为像素的小构建块组成。像素位于二维图像矩阵中,如图1所示。每个像素代表不同的光值。在彩色图像中,颜色使用RGB颜色模型表示。RGB图像有三个单独的矩阵,其中存储了每个像素的红色、绿色和蓝色光强度值。有几种颜色表示模型,但RGB对于数字计算机来说是最方便的。在本文中,我将介绍有关灰度图像的主题。处理彩色图像时可以使用相同的算法,但需要分别对RGB分量进行计算。彩色图像处理更为复杂,并且可以与灰度图像处理结合进行。
其中“X”和“Y”是图像尺寸,或者简单地说就是像素列和行的数量。“X”和“Y”的值越大,空间分辨率越高。空间分辨率是一个参数,它表示用于以数字形式表示真实对象的像素数量。图2显示了以不同空间分辨率表示的同一张彩色图像。左边的花比右边的花分辨率高得多。拥有大量像素将有助于我们计算更具代表性的直方图。
直方图是图像中不同图像像素频率的统计表示。在我们的例子中,2D直方图将表示具有不同光级别的像素数量。简单地说,图像直方图可以显示原始图像中出现具有特定光强度的像素数量。因为我们的图像大小可能不同,我们将使用一维整数数组来存储直方图值。这里所有的例子都将是灰度图像。这些计算可用于彩色图像,但每个颜色空间矩阵必须作为灰度图像直方图单独处理。2D直方图计算很容易,我们只需遍历图像像素并索引一个256个元素的整数数组。
for(int i=0; i<y; i++)
{
for(int j=0;j<x; j++)
{
HiGrey[Grey[i,j]] ++;
}
}
y
是图像高度,x
是图像宽度。Grey[i,j]
是一个字节数组,其中包含有关2D图像亮度的信息。HiGrey[i]
是一个包含2D图像直方图的256个元素的整数数组。
2D图像直方图归一化
现在我们已经将2D图像直方图存储在256个元素的整数数组中。这种表示形式不太方便,也不适合进行统计计算。还有另一种直方图表示形式,称为归一化直方图。归一化直方图显示了不同像素值的概率分布。归一化过程非常简单;我们只需要将直方图256数组的每个元素除以图像中的总像素数。为了更好地理解这一点,假设我们有一个3x3=9像素的图像,如图1所示。图3显示了直方图计算和直方图归一化。
for(int i=0; i<256; i++)
{
HiGrey[i]/(x*y) ++;
}
2D图像直方图均衡化和熵函数
在计算并归一化图像直方图后,我们可以计算2D图像直方图熵函数,如图4所示。
直方图均衡化是一个简单的过程,将所有小的直方图柱组合成一个。在此分组之后,我们需要根据直方图的变化进行图像像素替换。为了进行2D直方图均衡化,我们需要计算直方图的平均值。之后,我们进行一个循环,检查从位置0到255的所有直方图柱,如果当前直方图柱小于全局直方图平均值,我们就超过平均值。如果是这种情况,我们就跳转到下一个柱并处理其值。所有添加的位置都标记为灰度级替换候选。如果下一个柱的值大于平均值,我们就跳转到下一个柱而不将其值添加到第一个柱。参见图5。
//Calculate Entropy of 2D histogram
double Sum_prob_1k = 0, Sum_prob_kl = 0, Sum_prob_ln_1k = 0, Sum_prob_ln_kl = 0;
for (int k = start; k < end; k++)
{
Sum_prob_1k = 0; Sum_prob_kl = 0;
Sum_prob_ln_1k = 0; Sum_prob_ln_kl = 0;
//i=1 need to be start = 1
for (int i = 1; i < k; i++)
{
Sum_prob_1k += HiGreyN[i];
if (HiGreyN[i] != 0)
Sum_prob_ln_1k += (HiGreyN[i] * System.Math.Log(HiGreyN[i]));
}
for (int i = k; i < end; i++)
{
Sum_prob_kl += HiGreyN[i];
if (HiGreyN[i] != 0)
Sum_prob_ln_kl += (HiGreyN[i] * System.Math.Log(HiGreyN[i]));
}
//Final equation of entropy for each K
EiGrey[k] = System.Math.Log(Sum_prob_1k) + System.Math.Log(Sum_prob_kl) -
(Sum_prob_ln_1k / Sum_prob_1k) - (Sum_prob_ln_kl / Sum_prob_kl);
if (EiGrey[k] < 0)
EiGrey[k] = 0;
}
//End calculating 2D Entropy
完成此功能后,图像熵将存储在2D 256元素双精度数组EiGrey[k]
中。start
和stop
是整数值,它们确定了256元素数组中我们需要计算熵的部分。如果start=0
且end=256
,则计算整个2D图像直方图的熵;如果使用0-256之间的不同值,则可以计算特定2D直方图段的熵。
2D图像直方图的图像熵显示了图像中的“混乱”程度。此函数的计算是一个复杂的过程,它测量每个2D直方图柱的概率与所有其他像素中的总信息相对应。此函数用于确定哪些像素承载了图像中的大部分信息内容。此函数用于自动图像阈值和图像对象分割。在计算2D图像直方图熵函数后,我们可以选择熵的最大值,并将最大值位置用作图像量化的阈值。这种方法用于自动生物医学细胞计数系统。参见图6。
这种对象分割方法非常适用于背景固定且对象不动的图像。对于图4中的飞行直升机,我们需要一种不同的方法。由于直升机、导弹和背景差异很大且随时间变化,我们需要一种更复杂的方法来进行对象分割。一种更简单的方法是减少灰度级的总数量。由于我们原始图像是每像素8位,我们可以尝试将其减少到每像素2或3位。这可以通过对原始图像进行重新量化来实现。使用简单的每个像素除法不会提供好的结果。参见图7。
正如我们所见,将图像直方图分成四个相等区域并不能提供关于图像内部对象的良好信息。如果结合基于熵的图像直方图分割,可以显著改善这一点。我们需要通过在直方图选定区域上计算熵最大值来多次划分图像直方图。一旦我们计算出第一个熵最大值,我们就计算0到第一个最大值位置之间的熵最大值。之后,我们计算第一个最大值和图像直方图的第255个元素之间的熵最大值位置。之后,我们可以根据直方图替换值重建相应的灰度级图像。参见图8。
结论
在这里,我为您提供了如何使用多阶段熵来减少黑白数字图像信息的实际示例。通过使用2D图像直方图熵函数,我们可以创建适合对象分割和分析的图像。2D熵阈值对于图像分割过程的自动化至关重要。在下一篇文章中,我将介绍3D图像直方图和熵的计算。
参考文献
- http://www.instrumentation.hit.bg/Papers/2007-08-17%202D%20Multistage%20Entropy.htm
- 颜色模型:http://www.colorcube.com/articles/basics/basics.htm
- http://www.sphoto.com/techinfo/histograms/histograms.htm
- http://www.cambridgeincolour.com/tutorials/histograms1.htm
- 图像熵:http://people.csail.mit.edu/msabuncu/Spatial_info.pdf
- http://www.nbu.bg/PUBLIC/IMAGES/File/departments/telecommunication/research/37.pdf
- http://www.nbu.bg/PUBLIC/IMAGES/File/departments/telecommunication/research/3.pdf