文章目錄
- 一、圖像直方圖
- 二、圖像直方圖的作用
- 三、使用matplotlib方法繪制直方圖
- 2.使用opencv的方法繪制直方圖(劃分16個小的子亮度區間)
- 3、繪制彩色圖像的直方圖
- 四、直方圖均衡化
- 1、繪制原圖的直方圖
- 2、繪制經過直方圖均衡化后的圖片的直方圖
- 3、自適應直方圖均衡化
- 1)概念
- 2)步驟
- 3)代碼實現
一、圖像直方圖
圖像直方圖是描述圖像像素值分布情況的統計圖形。它表示了圖像中不同像素值的數量或頻率。
在圖像直方圖中,橫軸表示像素值的范圍,通常為0-255,縱軸表示像素值的數量或頻率。直方圖的每一個條柱代表某個像素值范圍內像素的數量或頻率。例如,柱子的高度表示圖像中具有該像素值的像素的數量或出現的頻率。
二、圖像直方圖的作用
-
分析圖像的亮度分布
通過直方圖可以了解圖像中不同亮度值的像素數量,從而判斷圖像的亮度分布情況。例如,如果直方圖中灰度級別集中在低亮度區域,說明圖像較暗;如果直方圖分布在高亮度區域,則說明圖像較亮。 -
判斷圖像的對比度
直方圖的寬度反映了圖像的對比度。直方圖寬度越大,表示圖像中像素值分布越分散,對比度越高;相反,直方圖寬度越窄,表示圖像中像素值分布越集中,對比度越低。 -
檢測圖像的亮度和色彩偏移
通過比較不同顏色通道的直方圖,可以判斷圖像是否存在亮度或色彩偏移。例如,如果紅色通道的直方圖偏向左側,則說明圖像偏向較暗的紅色,存在亮度偏移。 -
圖像增強和調整
通過分析直方圖,可以根據圖像的特點進行增強和調整。例如,可以通過直方圖均衡化來增強圖像的對比度;可以通過直方圖匹配來調整圖像的色彩和亮度分布。 -
閾值分割
直方圖可以用于確定圖像的閾值,用于分割圖像中的目標物體和背景。通過直方圖的谷底或者雙峰可以確定一個適合的閾值值,將圖像分成兩個部分。
三、使用matplotlib方法繪制直方圖
img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 轉成一維
a=img.ravel()# 使用 matplotlib 的 hist 函數繪制直方圖。
plt.hist(a,bins=256)
plt.show()# 參數解釋:
# - a:一維數組,即圖像的像素值組成的數組。
# - bins=256:指定直方圖的條數,即灰度級的數量。
2.使用opencv的方法繪制直方圖(劃分16個小的子亮度區間)
#這里的calcHist參數在上面有介紹,這里是對img圖片做直方圖統計,采用灰度圖,即零通道,未設置掩膜,劃分為16個區間,亮度值統計[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值繪制曲線圖
plt.show()
統計的值為每個亮度區間內屬于該亮度值的像素點個數。
3、繪制彩色圖像的直方圖
img=cv2.imread('zl.jpg')
color=('b','g','r') #設置繪制的折線圖每條線的顏色
for i,col in enumerate(color): #依次遍歷三個顏色通道histr=cv2.calcHist([img],[i],None,[256],[0,256]) #依次計算每個通道的直方圖值plt.plot(histr,color=col) #繪制折線圖
plt.show()
分別統計了不同顏色通道下的直方圖
四、直方圖均衡化
直方圖均衡化:直方圖均衡化是一種圖像增強技術,它可以通過增加圖像的對比度和亮度來改善圖像的質量。直方圖均衡化通過將圖像的像素值分布均勻化來實現這一目標。
在Python OpenCV中,可以使用cv2.equalizeHist()函數來實現直方圖均衡化。該函數將輸入圖像轉換為灰度圖像,并將其像素值分布均勻化,從而增強圖像的對比度和亮度。下面是將不均衡的直方圖均衡化之后的結果。
1、繪制原圖的直方圖
woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()
2、繪制經過直方圖均衡化后的圖片的直方圖
phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()
3、自適應直方圖均衡化
1)概念
傳統的直方圖均衡化方法是將整個圖像的直方圖變成均勻分布,但在某些情況下,圖像的局部區域可能存在過亮或過暗的問題。自適應直方圖均衡化通過將圖像分成多個小的局部區域,并對每個局部區域進行直方圖均衡化,從而避免了全局均衡化帶來的問題。
2)步驟
- 將圖像分成多個不重疊的小塊,每個小塊稱為一個局部區域。
- 對每個局部區域進行直方圖均衡化,得到均衡化后的局部區域。
- 將均衡化后的局部區域重新拼合,得到最終的均衡化圖像。
3)代碼實現
(接上面代碼)
clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16)) # 通過類創建了一個均衡化對象
# clipLimit表示對比度的限制,tileGridSize表示圖像均勻劃分的小塊大小
phone_clahe = clahe.apply(phone) # 將均衡化對象應用到圖片phone上得到均衡化處理后的圖片phone_clahe
res = np.hstack((phone,phone_equalize,phone_clahe)) # 將原圖、直方圖均衡化后的圖像、自適應直方圖均衡化后的圖像,水平方向合并
cv2.imshow("phone_equalize",res)
cv2.waitKey(0)