目錄
一、直方圖
?1、計算并顯示直方圖
2、使用matplotlib方法繪制直方圖(不劃分小的子區間)
3、使用opencv的方法繪制直方圖?(劃分16個小的子亮度區間)
4、繪制彩色圖像的直方圖,將各個通道的直方圖值都畫出來
二、直方圖均衡化
(1)繪制原圖的直方圖
?(2)繪制經過直方圖均衡化后的圖片的直方圖
(3)自適應直方圖均衡化(局部直方圖處理)
三、直方圖均衡化的應用
1.?增強圖像對比度
2.?提升圖像視覺效果
3.?統一圖像灰度分布
4.?適用于低對比度圖像
總結
一、直方圖
直方圖:是圖像中像素強度分布的圖形表達方式,統計各個強度像素值的個數。
直方圖的作用:例如視頻中。通過標記幀和幀之間顯著的邊緣和顏色的統計變化,來檢測視頻中場景的變換。
灰度值在0 - 255范圍之間總共 256 個值,可以將我們的范圍劃分為子部分(稱為bins),例如我們可以將這些像素亮度值劃分為16個區間值,【0,15】、【16,31】,這兩個就是兩個亮度區間,它表示會統計亮度值在0到15的所有像素點的個數。
?1、計算并顯示直方圖
cv2.calcHist(images,channels,mask,histSize,ranges)? 計算圖像的直方圖,用于表示圖像中像素灰度級別的分布情況.
images: 原圖像圖像格式為 uint8 或 ?oat32。當傳入函數時應 用中括號 [] 括來例如[img]
channels: 表示傳入的圖像通道數。如果輸入圖像是灰度圖它的值就是 [0]。
????????? 如果是彩色圖像 的傳入的參數可以是 [0][1][2] 它們分別對應著 BGR。
mask: 掩模圖像。統計整幅圖像的直方圖就把它為None。但是如果你想統計圖像某一部分的直方圖,你就制作一個掩模圖像并使用它。
histSize:BINS的數目。也需用中括號括來?? (分成多少個區間)
? BINS :上面的直方圖顯示了每個像素值的像素數,即從0到255。即您需要256個值才能顯示上述直方圖。
????? 但是請考慮一下,如果您不需要單獨查找所有像素值的像素數,而是在像素值間隔內查找像素數,
??????例如,您需要找到介于 0 到 15 之間的像素數,然后是 16 到 31、32到47...、240 到 255。
????? 您只需要 16 個值來表示直方圖。
因此,只需將整個直方圖拆分為 16 個子部分,每個子部分的值就是其中所有像素計數的總和。
這每個子部分都稱為"BIN"。在第一種情況下,條柱數為256(每個像素一個),而在第二種情況下,它只有16。BINS 在 OpenCV 文檔中由術語histSize表示。
ranges: 像素值范圍常為 [0 256]
2、使用matplotlib方法繪制直方圖(不劃分小的子區間)
?這里使用了 numpy 的 ravel 函數,將多維數組拉成一維數組。
img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 轉成一維
a=img.ravel()# 使用 matplotlib 的 hist 函數繪制直方圖。
plt.hist(a,bins=256)
plt.show()# 參數解釋:
# - a:一維數組,即圖像的像素值組成的數組。
# - bins=256:指定直方圖的條數,即灰度級的數量。
效果:可以看出下面結果中有0~256的亮度值的統計情況?
?
3、使用opencv的方法繪制直方圖?(劃分16個小的子亮度區間)
#這里的calcHist參數在上面有介紹,這里是對img圖片做直方圖統計,采用灰度圖,即零通道,未設置掩膜,劃分為16個區間,亮度值統計[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值繪制曲線圖
plt.show()
效果,統計的值為每個亮度區間內屬于該亮度值的像素點個數
4、繪制彩色圖像的直方圖,將各個通道的直方圖值都畫出來
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()
?可以看出圖像的亮度值集中在50左右
?
?(2)繪制經過直方圖均衡化后的圖片的直方圖
phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()
與原圖對比,直方圖均衡化是對全局做均衡化,這使亮度值很大的像素點增多了,表現在圖像上就是圖像整體變亮。?
?
(3)自適應直方圖均衡化(局部直方圖處理)
普通直方圖均衡化(HE)通過全局灰度變換增強對比度,但對噪聲敏感且可能過度放大局部噪聲(如暗部噪聲)。自適應直方圖均衡化(AHE)?將圖像劃分為多個子塊(tiles),對每個子塊獨立進行直方圖均衡化,從而實現局部對比度增強,避免全局均衡化的缺陷。
改進版:限制對比度的自適應直方圖均衡化(CLAHE, Contrast-Limited AHE):在 AHE 基礎上,通過設定灰度值裁剪閾值(clip limit),防止子塊內噪聲或紋理被過度增強,是實際應用中更常用的方法。
主要優點
- 局部對比度增強:針對不同區域的局部特征調整對比度,適合光照不均或局部細節豐富的圖像(如醫學影像、衛星圖像)。
- 抑制噪聲放大:通過裁剪閾值(clip limit)限制子塊內直方圖的峰值,避免噪聲或紋理被過度增強。
- 保留細節與自然感:相比全局均衡化,CLAHE 在增強局部細節的同時,減少過增強導致的偽影(如棋盤效應)。
函數:cv2.createCLAHE([, clipLimit[, tileGridSize]])?
參數說明: clipLimit:設定子塊內直方圖均衡化時的灰度值裁剪閾值,單位為 “像素數 / 面積”(即每個灰度級允許的最大像素數密度)。可選項,默認值 8 titleGridSize:設定子塊的大小(行數 × 列數),單位為像素。可選項,默認值 (8,8)。
- titleGridSize取值影響:
- 較小尺寸(如 4x4):局部細節增強更精細,但計算量增加,可能引入棋盤效應(需通過插值緩解)。
- 較大尺寸(如 16x16):局部處理更粗糙,適合全局對比度增強需求,減少分塊邊界的影響。
創建一個自適應直方圖對像,并將上面的woman這張圖像傳入
clahe = cv2.createCLAHE(clipLimit=1, tileGridSize=(16,16))#通過類創建了一個局部均衡化對象
phone_clahe = clahe.apply(woman)
plt.hist(phone_clahe.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()
自適應直方圖均衡化則是劃分子塊均衡化會減少分塊邊界的影響。?
?使用hstack()函數水平堆疊上面的三張圖片用于對比,直方圖均衡化與自適應直方圖均衡化的區別
hstack
(hconcat
):水平堆疊,沿列方向擴展。vstack
(vconcat
):垂直堆疊,沿行方向擴展(對應函數為?np.vstack
?和?cv2.vconcat
)。
res = np.hstack((woman,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize',res)
cv2.waitKey(0)
?從左到右依次是原圖、直方圖均衡化、自適應直方圖均衡化
三、直方圖均衡化的應用
1.?增強圖像對比度
- 原理:將圖像中原本集中的灰度范圍 “拉伸” 到更寬的動態范圍,使圖像中不同灰度級的像素分布更均勻(直方圖趨于平坦)。
- 效果:讓原本對比度低、細節模糊的圖像(如暗部過暗或亮部過亮)變得更清晰,暗部和亮部的細節更容易分辨。
- 示例:在醫學影像(如 X 光片)中,均衡化可增強組織間的對比度,便于醫生觀察病灶。
2.?提升圖像視覺效果
- 通過均衡化,圖像中原本難以區分的灰度區域(如相近的明暗過渡)會變得層次分明,整體視覺效果更自然。
-
例如:修復老照片時,均衡化可改善因曝光不足或過度導致的細節丟失。
3.?統一圖像灰度分布
- 將圖像的灰度直方圖調整為近似均勻分布,使像素灰度值覆蓋更廣泛的范圍。
- 這為后續的圖像處理任務(如圖像分割、特征提取、模式識別等)提供更優質的輸入,提升算法效果。
4.?適用于低對比度圖像
- 特別適合處理因光照不均、傳感器噪聲等導致對比度低下的圖像(如陰天拍攝的照片、衛星遙感圖像),通過均衡化恢復圖像細節。
總結
直方圖均衡化通過重新分配像素的灰度值,將圖像的動態范圍最大化利用,使圖像從 “對比度不足” 轉變為 “層次豐富”,是圖像處理中基礎且高效的增強手段。其本質是通過數學變換(累積分布函數,CDF)實現灰度的非線性映射,從而優化視覺效果和后續處理的可行性。