首頁 > 軟體

Python學習之直方圖均衡化原理詳解

2022-03-02 13:01:24

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直方圖均衡化的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com