這時我們得到了新的圖:
100 50 20 198 141 20
20 40 50 >> 10 85 141
100 250 200 198 255 226
原圖中相對出現頻率多的部分的寬度變大了。而出現較少的部分則變窄了。
所以,灰度直方圖均衡的作用就是把一張圖片上出現多的色彩拓展,而把出現少的色彩壓縮。
從而得到了更「均衡」的色彩分佈。
下面附上我的例程:
Private Type ColorChart
ColorCount(255) As Long '統計原來圖片中的亮度出現次數
PixcelCount As Long '記錄圖片的像素個數
ColRatio(255) As Single '記錄每一個亮度的出現比例
NewVal(255) As Byte '存放新的亮度索引
End Type
Dim ColChart As ColorChart
Public Sub StatisticsChart()
Dim R As Byte
Dim G As Byte
Dim B As Byte
Dim Gray As Integer
Dim X As Long
Dim Y As Long
Dim I As Long
Dim L As Long
Dim M As Long
Dim C As Double
On Error GoTo ErrLine
Done = False
TimeFilter = timeGetTime
With ColChart
For X = 0 To 255 '先把數組清零
.ColorCount(X) = 0
Next
For X = 0 To OutPutWid '這兩個循環用來掃瞄圖片數據,記錄每個點的灰度和出現次數
For Y = 0 To OutPutHei
R = ColVal(2, X, Y)
G = ColVal(1, X, Y)
B = ColVal(0, X, Y)
Gray = R * 3 + G * 6 + B
Gray = Gray \ 10
.ColorCount(Gray) = .ColorCount(Gray) + 1
Next
Next
.PixcelCount = X * Y '獲得圖片的像素總量
C = 1 / .PixcelCount
.ColRatio( 0) = .ColorCount(M, 0) * C '計算每個亮度的出現比例
.NewVal( 0) = 0 '色值最小的色彩總是為0,不參與計算
L = 0
For I = 1 To 255
.ColRatio(I) = .ColorCount( I) * C + .ColRatio( L) '進行加權
.NewVal(I) = .ColRatio( I) * 255 '計算新的顏色索引
L = L + 1
Next
For X = 0 To OutPutWid
For Y = 0 To OutPutHei
R = Colval(2, X, Y) '讀取原來點的顏色
G = Colval(1, X, Y)
B = Colval(0, X, Y)
R = .NewVal( R) '查表得到新的顏色
G = .NewVal( G)
B = .NewVal( B)
ColOut(2, X, Y) = R '把新的顏色放到輸出數組中
ColOut(1, X, Y) = G
ColOut(0, X, Y) = B
Next
Next
End With
Done = True
TimeFilter = timeGetTime - TimeFilter
Exit Sub
ErrLine:
Done = True
MsgBox Err.Description
End Sub