版权声明:此为个人学习与研究成果,若需转载请提前告知。 https://blog.csdn.net/weixin_35811044/article/details/84565551
说到直方图均衡化,首先提一提概率论的知识。
概率论:
- 离散型随机变量:能用日常使用的量词度量的随机变量。
- 概率函数:形如 P(x = 1) = 1/6;
- 概率分布:
- 概率分布函数: .
- 连续型随机变量:不能用日常量词度量,无限、无穷。
- 概率密度函数:,面积即事件在此区间发生的概率。
- . 总面积为1, 因为总概率为1.
- 分布函数的导数即概率密度函数。
Equalization:
希望将图像灰度分布均匀。
输入图像灰度级 r ,输出图像灰度级S, 转换公式:
- S = T(r) ---> 每个Pixel经过 T(r)变换倒新Pixel灰度级。
- 对T(r)两个要求:(a)在区间 [0,L-1] 上单增。(b)当0 r L-1 时, 0 T(r) L-1 。
- 牛逼公式: . ,即原图的概率密度函数*原图pixel的深度。
为什么 r 的分布函数就是符合要求的转换函数?
r 的概率密度为P(r),则 s 的概率密度为 : . 又对公式: 对 r 求导。
, P(s) = L-1 . 即S的概率密度为定值,则S的分布函数就为一条斜率固定的直线。
- S的概率密度为定值,则S的分布函数为一条斜率固定的直线,表明所有Pixel出现的概率都一样,所以累加概率会均匀上升。
- 实际情况中,进过均衡化的图片不会真的均衡,只会近似均衡:
- 实际的直方图均衡化,我们要将牛逼公式离散化即: , 就是从0到要均衡化的灰度级的累积概率*深度。
C#实现:
//获得灰阶图片各灰度级的概率,返回数组。
public double[] getGrayHistogram(Bitmap grayImage)
{
double[] numb = new double[256];
for (int i = 0; i < grayImage.Height; i++)
{
for (int j = 0; j < grayImage.Width; j++)
{
Color pixelRGB = grayImage.GetPixel(j, i);
if (pixelRGB.R == pixelRGB.G && pixelRGB.R == pixelRGB.B)
{
int grayNumb = pixelRGB.R;
numb[grayNumb]++;
}
}
}
for (int k = 0; k < 256; k++)
{
double value = numb[k];
double rate = value / (grayImage.Height * grayImage.Width * 1.0);
numb[k] = rate;
}
return numb;
}
//灰阶直方图均衡化
//传入需均衡化的灰阶图片grayImage和灰阶图片各灰度级的概率数组。
public Bitmap Equalization(Bitmap grayImage , double[] density)
{
for (int j = 0; j < grayImage.Height; j++)
{
for (int i = 0; i < grayImage.Width; i++)
{
double densitySum = 0;
Color value = grayImage.GetPixel(i, j);
for (int k = 0; k <= value.R; k++)
{ //累积概率
densitySum += density[k];
}
byte s = (byte)Math.Round(255 * densitySum);
Color newValue = Color.FromArgb(s, s, s);
grayImage.SetPixel(i, j, newValue);
}
}
return grayImage;
}
仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044