Python學習之直方圖均衡化原理詳解
1.點算子
點算子是兩個像素灰度值間的映射關系,屬於像素的逐點運算,相鄰像素不參與運算。點算子是最簡單的圖像處理手段,如:亮度調整、對比度調整、顏色變換、直方圖均衡化等等。
2.線性灰度變換
線性灰度變換表達為:
其中rk、sk分別為輸入、輸出點像素灰度值。
▲圖2.1 線性灰度變換
當a>1時,輸出圖像像素灰度范圍擴大,圖像對比度增強,當a<1時反之。這是因為人眼不易區分相近的灰度值,因此若圖像灰度值范圍較小,觀感上細節不夠清晰。當a=1、b≠0時,點算子使圖像灰度整體上移或下移,即整體變亮或變暗。
▲圖2.2 圖像對比度(左為弱對比度,右為強對比度)
3.直方圖均衡化
下圖再次給出瞭關於圖像對比度的例子。
▲圖3.1 圖像對比度示例
直方圖均衡化是以累計分佈函數為核心,將原始圖像灰度直方圖從比較集中的某個灰度區間,非線性地映射為在全部灰度范圍內的較均勻分佈,從而增強對比度。
下面闡述直方圖均衡化的數學原理。首先作原始圖像灰度的概率直方圖如圖。
▲圖3.2 直方圖均衡化原理
設輸入像素灰度值為rk,累計分佈函數為
其中ni為圖像中灰度值為ri的像素頻數,n為圖像像素總數。設輸出像素灰度值為sk,像素范圍為smin-smax。期望輸出灰度直方圖是均勻分佈,即
令C(sk)=C(rk),即得
所以最終直方圖均衡化的點算子為
所以最終直方圖均衡化的點算子為
4.代碼實戰
按照前文的原理編寫累積分佈函數計算公式,以及均衡化算子
# 計算累計分佈函數 def C(rk): # 讀取圖片灰度直方圖 # bins為直方圖直方柱的取值向量 # hist為bins各取值區間上的頻數取值 hist, bins = np.histogram(rk, 256, [0, 256]) # 計算累計分佈函數 return hist.cumsum()
# 計算灰度均衡化映射 def T(rk): cdf = C(rk) # 均衡化 cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0 return cdf.astype('uint8')
均衡化時直接調用函數即可,下面給出完整代碼
import numpy as np import cv2 as cv from matplotlib import pyplot as plt # 計算累計分佈函數 def C(rk): # 讀取圖片灰度直方圖 # bins為直方圖直方柱的取值向量 # hist為bins各取值區間上的頻數取值 hist, bins = np.histogram(rk, 256, [0, 256]) # 計算累計分佈函數 return hist.cumsum() # 計算灰度均衡化映射 def T(rk): cdf = C(rk) # 均衡化 cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0 return cdf.astype('uint8') # 讀取圖片 img = cv.imread('1.png', 0) # 將二維數字圖像矩陣轉變為一維向量 rk = img.flatten() # 原始圖像灰度直方圖 plt.hist(rk, 256, [0, 255], color = 'r') cv.imshow("原圖像",img) # 直方圖均衡化 imgDst = T(rk)[img] cv.imshow("直方圖均衡化後的圖像",imgDst) plt.hist(imgDst.flatten(), 256, [0, 255], color = 'b') plt.show()
看看效果:
▲圖4.1 直方圖均衡化效果(灰度直方圖)
▲圖4.2 均衡化前
▲圖4.3 均衡化後
以上就是Python學習之直方圖均衡化原理詳解的詳細內容,更多關於Python直方圖均衡化的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 深入瞭解Python二維直方圖
- Python matplotlib繪制灰度和彩色直方圖
- python中opencv 直方圖處理
- Python利用 matplotlib 繪制直方圖
- Python一些基本的圖像操作和處理總結