使用直方圖分析影像的 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])

輸入影像

輸出影像

從上面的直方圖中,我們可以觀察到藍色在影像中有一些高值區域。

更新於: 2023-05-31

548 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告