影象處理(Image Processing) ---------- 直方圖均衡化 (Equalization)(C#實現)
阿新 • • 發佈:2018-12-19
說到直方圖均衡化,首先提一提概率論的知識。
概率論:
- 離散型隨機變數:能用日常使用的量詞度量的隨機變數。
- 概率函式:形如 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
- 牛逼公式: . ,即原圖的概率密度函式*原圖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