使用直方圖分析影像的 OpenCV Python 程式
直方圖是一種圖形表示,顯示影像中畫素強度(範圍從 0 到 255)是如何分佈的。對於數字影像,直方圖繪製畫素強度與畫素數量之間的圖形。x 軸表示強度變化,y 軸表示特定強度下的畫素數量。
我們可以看到影像及其直方圖。透過簡單地檢視影像的直方圖,我們可以對該影像的對比度、亮度、強度分佈等有一個基本的瞭解。
在本文中,我們將使用 OpenCV 模組編寫一個 Python 程式,使用直方圖來分析灰度影像和彩色影像。
cv2.calcHist() 函式
OpenCV 提供了一個 calcHist() 函式來計算一個或多個影像陣列的直方圖。以下是 calcHist() 函式的語法:
calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
引數
images:源影像。它應該用方括號給出,即 [image]。
channels:它指定要計算直方圖的通道索引。如果影像是灰度影像,則其值為 [0];如果影像是彩色影像,則需要傳遞 [0]、[1] 或 [2] 來分別計算藍色、綠色或紅色通道的直方圖。
mask:掩碼影像。如果要查詢影像特定區域的直方圖,則必須為不需要的區域建立掩碼。如果要查詢整個影像的直方圖,則為 None。
histSize:直方圖大小的陣列。
ranges:通常為 [0,256]。
示例
在本例中,我們將查詢灰度模式下影像的直方圖。
import matplotlib.pyplot as plt import cv2 img = cv2.imread('Images/Dog.jpg') histogram = cv2.calcHist([img],[0],None,[256],[0,256]) plt.xlabel("Pixel values") plt.ylabel("Nuber of Pixels") plt.plot(histogram) plt.show()
輸出
示例
讓我們查詢彩色模式下影像的直方圖。
import matplotlib.pyplot as plt import cv2 image = cv2.imread('Images/Sky and Beach.jpg') # split the image into its respective channels channels = cv2.split(image) colors = ("b", "g", "r") plt.title("Color Histogram") plt.xlabel("Pixel values") plt.ylabel("Nuber of Pixels") # loop over the image channels for (chan, color) in zip(channels, colors): # create a histogram for the current channel and plot it hist = cv2.calcHist([chan], [0], None, [256], [0, 256]) plt.plot(hist, color=color) plt.xlim([0, 256])
輸入影像
輸出影像
從上面的直方圖中,我們可以觀察到藍色在影像中有一些高值區域。
廣告