直方圖是對圖像中像素強度分布的圖形表示。通過分析直方圖,我們可以獲得有關圖像對比度、亮度和色彩分佈的有用信息。
cv2.calcHist
函式參數的詳細介紹cv2.calcHist([images], [channels], mask, [histSize], [ranges])
[0]
表示灰度影像,[0, 1, 2]
表示 RGB 彩色影像中的所有通道。[256]
表示每個通道有 256 個 bin。[0, 256]
。函數的返回值是一個表示直方圖的 Numpy 陣列。如果有多張影像,則返回一個多維陣列,其中的維度數量等於通道數量。
將輸入三張圖片,分別為正常與曝光不足及過曝的狀況,來更理解直方圖分析的應用。
import cv2
import matplotlib.pyplot as plt
# 讀取灰度影像
image = cv2.imread('111.jpg', cv2.IMREAD_GRAYSCALE)
# 計算直方圖
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
# 繪製直方圖
plt.plot(hist)
plt.title('Image Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
由三個圖比較結果,我們可以知道曝光不足的時候直方圖數值集中分布在30~70之間,過曝時就會集中在220~250之間。
由上方的程式範例我們可以得知,利用直方圖分析可以更明確來判斷數位影像的拍攝條件,是否過度曝光或曝光不足。
先前函式介紹時,有提到可以指定計算直方圖的通道,也能計算RGB三通道的直方圖分析。
利用enumerate,指定i為索引的數值,就可以遍歷得走過[0, 1, 2]
,其中[0, 1, 2]
表示 RGB 彩色影像中的所有通道。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('111.jpg')
# 畫出 RGB 直方圖
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.xlim([0, 256])
plt.show()