直方圖的均衡化
引言
直方圖均衡化被看作的圖像降噪或者增強方式。
什么是直方圖
學習這樣的降噪方法首先要了解什么是直方圖。直方圖試圖表示圖像像素值得分布情況,對于灰度圖像而言,直接統計不同灰度的出現頻次。
0 2 2 4 5
2 1 0 1 2
0 2 3 2 2
1 3 1 0 4
1 4 0 3 1
上5*5表格代表了一個圖像,0-5的數字表示了6中灰度級別,我們利用直方圖來統計各個灰度出現的次數
(https://img2020.cnblogs.com/blog/2198110/202010/2198110-20201030153735682-1150889783.png)
上圖k代表不同的灰度等級,h(k)代表為這個灰度等級的像素的數量
嘗試用python來實現直方圖
首先我們下載一張圖片作為我們的素材

from PIL import Image
from pylab import *
from numpy import *
image = array(Image.open('timg.jpg').convert('L'))
#生成灰度圖
figure()
gray()
contour(image,origin='image')
#使用hist()生成直方圖
figure()
hist(image.flatten(),128)
show()

從上圖,我們明顯發現這是一個過于曝光的圖片,像素過渡的集中在高灰度值區域。那么如何讓圖片變的更清晰呢,這時就需要進行直方圖均衡化。
直接進行直方圖均衡化
這里有一篇博客講的很清楚,這里做簡要講解
https://blog.csdn.net/qq_15971883/article/details/88699218
0 1 2
1 2 2
2 0 1
上圖代表圖像的,灰度級從0到2,一共三個級別
我們直接進行計算
*step1
對原圖直接生成直方圖nk
n(0)表示灰度值為0的個數,顯而易見n(0)=2,以此類推n(1)=3,n(2)=4。則n(k)=[2,3,4]

*step2
統計院原圖總的像素個數

*step3
計算原圖灰度分布頻率

*step4
計算原圖灰度累計分布頻率

*step5
sk乘以L-1后進行四舍五入,這一步的作用是讓均衡化之后的圖像灰度級和之前相同

同理得到

*step6
以上步驟實際上是使用T(r)對原圖進行了映射變換,在這一步輸出變換后的圖像
0 1 2
1 2 2
2 0 1
顯而易見,本圖在均衡化之后沒有發生任何變化,那么直方圖也就沒有發生任何改變,當然現實生活中的圖像不可能只有9個像素,灰度值的變化范圍也要更為廣泛。
使用python進行直方圖均衡化
這里的關鍵是累計分布函數的使用(cumulative distribution function),簡稱cdf
在這里定義一個均衡化函數histeq
def histeq(image,nbr_bins=256):
#計算原圖直方圖
imhist,bins = histogram(image.flatten(),nbr_bins,normed=True)
#計算累計分布頻率
cdf = imhist.cumsum()
歸一化
cdf = 255*cdf / cdf[-1]
#進行轉化,生成新的像素值
image2 = interp(image.flatten(),bins[:-1],cdf)
return image2.reshape(image.shape),cdf
定義完我們試著去使用這個函數
image =array(Image.open('timg.jpg').convert('L'))
image2,cdf = imtools.histeq(image)


從直方圖均衡化的結果來看,原始的高曝光圖片亮度明顯下降。值得注意的是轉換后的圖是不產生新的灰度級的,只會延展圖片灰度級的范圍(要理解這句話)。均衡化并不是指獲得完全平坦的直方圖,而是指使直方圖獲得延展,同時增加圖片的對比度。
參考
《python計算機視覺編程》Jan Erik Solem 朱文濤 袁勇
https://blog.csdn.net/qq_15971883/article/details/88699218
浙公網安備 33010602011771號