【圖像處理筆記】直方圖匹配(規定化)

本文會涉及到一些和直方圖均衡相關的公式推導以及編程實現,這部分內容在這以下這篇博文中已經詳細說明過了:

【圖像處理筆記】正方圖均衡 http://blog.csdn.net/u013162930/article/details/48087527


直方圖均衡化,可以無需參數,自動尋找變換函數,從而自動的的增強整個圖像的對比度,簡單易行便於實現,結果可預知,但是增強的效果不受控制,處理的結果總是得到全局均衡化的直方圖。

而實際上呢,有時候,我們需要變換直方圖,使之成爲某個特定的形狀,從而有選擇的增強某個灰度範圍內的對比度。這時,就可以採用本文介紹的這種,比較靈活的直方圖匹配(直方圖規定劃)。


現在,我們暫時回到連續灰度r 和z (看成是連續的隨機變量)並且Pr(r)和Pz(z)表示它們所對應的連續概率密度函數。在這種表示方法中,r 和z 分別代表輸入圖像和輸出圖像的灰度級。我們可以由給定的輸入圖像估計出Pr(r),而Pz(z)是我們希望輸出圖像所具有的指定概率密度函數。

令S爲一個有着如下特性的隨機變量:


w爲積分假變量。上式是直方圖均衡的連續形式。

接着我們定義一個有如下特性的隨機變量Z:


其中,t爲積分假變量。

由以上兩個等式可知,G(z) = T(r),因此,z也必須滿足以下的條件


一旦由輸入圖像估計出Pr(r),變換函數T(r)就可以由得到。

類似地,因爲Pz(z)已知,變換函數G(z)可由得到。

上面的證明過程表明,按照上面的步驟,可由一幅給定圖像得到一幅其灰度級具有給定概率密度函數的圖像。


直方圖規定化,在原理上並不複雜,但是有一個困難是尋找T(r)和G-1的有意義的表達式。

幸運的是,在處理離散量時,問題可以被大大的簡化。處理離散量時,僅希望得到一個近似的直方圖,所以付出的代價與直方圖均衡一樣。不去考慮這些代價的話,我們可以得到一些非常有用的結果,儘管是粗糙近似的。

離散形式的直方圖均衡如下


MN是圖像的像素總數,

nj是灰度值rj 的像素的個數。

類似地,給定一個規定的Sk值


對於一個q值,有G(Zq) = Sk

其中,Pz(Zi)是規定的直方圖的第i個值。

與前面一樣,我們用反變換找到期望的值Zq:


換句話說,該操作對每個S給出一個Z值,這樣,就形成了從S到Z的一個映射。


我們可以總結直方圖規定化的變換過程如下:

①計算給定圖像的值反圖Pr(r),並對他進行直方圖均衡變換。把Sk的結果四捨五入爲[0,L - 1]內的整數,並存入一個表中。

②用變換q = 0,1,2,...,L - 1,Pz(Zi)是規定的直方圖的值,並存入一個表中。

③對於每一個值Sk,使用②存儲的值尋找相應的Zq值,使G(Zq)最接近Sk,並存儲這些從S到Z的映射。


下面是我用vb實現的直方圖規定化:

首先對比一下原圖與直方圖均衡化後的結果。

原圖 直方圖均衡化後的結果

 

分析:

直方圖均衡化後的圖像對比度明顯增加了,但是邊角部分陰影加重了。

因此想降低這部分PDF的斜率,或許可以增加圖片的質量。


紅色部分是我想規定的變換後的PDF。

Pz(Z)我假定爲以下的分段函數

{

0.5 * Z + 60 , ( 0 , 80 ],

2.6 * Z - 108 , ( 80 , 140 ],

- 2.09 * Z + 547.6 , ( 140 , 255 ]

}

這一部分理解的不太到位,也不知道我假定的PDF是否可以改善圖像。以後對這部分有更深的理解的時候再來補充~

歡迎留言指教~

'直方圖規定化
'先對圖像進行直方圖均衡
Dim img As New Image(Of Gray, Byte)("C:\圖像處理實驗\test1.bmp")
Dim height As Integer = img.Height
Dim width As Integer = img.Width
'統計每級灰度的像素個數
Dim pixelCounts(255) As Integer
For i = 0 To height - 1
    For j = 0 To width - 1
        pixelCounts(img.Data(i, j, 0)) = pixelCounts(img.Data(i, j, 0)) + 1
    Next
Next
'統計每級灰度的累計像素個數
Dim pixelAccumulative(255) As Integer
For i = 0 To 255
    For j = 0 To i
        pixelAccumulative(i) = pixelAccumulative(i) + pixelCounts(j)
    Next
Next
'根據像素的灰度值映射到新的灰度值
For i = 0 To height - 1
    For j = 0 To width - 1
        img.Data(i, j, 0) = (256 - 1) / (width * height) * pixelAccumulative(img.Data(i, j, 0))
    Next
Next
For i = 0 To 255
    pixelAccumulative(i) = (256 - 1) / (width * height) * pixelAccumulative(i)
Next

'計算變換函數的PDF
'Pz(Z) = {
'0.5 * Z + 60 , ( 0 , 80 ],
'2.6 * Z - 108 , ( 80 , 140 ],
'- 2.09 * Z + 547.6 , ( 140 , 255 ]
'}
For i = 0 To 255
    If i <= 80 Then
        pixelPz(i) = 0.5 * i + 60
    ElseIf i <= 140 Then
        pixelPz(i) = 2.6 * i - 108
    Else
        pixelPz(i) = -2.09 * i + 547.6
    End If
Next
Dim sumPz As Double = 0
For i = 0 To 255
    sumPz = sumPz + pixelPz(i)
Next
For i = 0 To 255
    pixelPz(i) = pixelPz(i) / sumPz
Next
'計算G
Dim pixelG(255) As Integer
For i = 0 To 255
    For j = 0 To i
        pixelG(i) = pixelG(i) + pixelPz(j) * (256 - 1)
    Next
Next
'映射
Dim pixelSkZq(255) As Integer
For i = 0 To 255
    Dim Sk = pixelAccumulative(i)
    Dim flage As Boolean = False
    For j = 0 To 255
        If pixelG(j) = Sk Then
            pixelSkZq(i) = j
            flage = True
            Exit For
        End If
    Next
    If flage = False Then
        For j = 0 To 255
            If j = 255 Then
                pixelSkZq(i) = j
                Exit For
            End If
            If pixelG(j) < Sk And pixelG(j + 1) > Sk Then
                pixelSkZq(i) = j
                flage = True
                Exit For
            End If
        Next
    End If
Next
'根據像素的灰度值映射到新的灰度值
For i = 0 To height - 1
    For j = 0 To width - 1
        img.Data(i, j, 0) = pixelSkZq(img.Data(i, j, 0))
    Next
Next
img.Save("C:\圖像處理實驗\直方圖匹配\test_result.bmp")

以下是直方圖匹配的結果與直方圖均衡的結果比較

 

從結果上來看,實驗失敗了。圖片的效果並沒有增強。

我分析的原因可能是指定的灰度值密度變換函數並不恰當,並不能有效的改善圖像。但也有可能是我對直方圖匹配理解有誤導致的算法的錯誤。有想法的同學歡迎留言指教。


直方圖規定化,大多數時候,都是試湊的過程。

一般來說,並沒有規定直方圖的規則,對於任何一個給定的增強任務,都必須藉助於實際分析。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章