[OpenCV基礎][Python]數位影像的直方圖分析

2024/03/03閱讀時間約 3 分鐘

直方圖是對圖像中像素強度分布圖形表示。通過分析直方圖,我們可以獲得有關圖像對比度亮度色彩分佈的有用信息。


直方圖的主要概念:

  1. 強度值: 表示圖像中每個像素的亮度或顏色值,通常在0到255之間。
  2. 頻數: 表示具有特定強度值的像素在圖像中出現的次數。
  3. 累積分佈函數(CDF): 表示某一強度值及其之前所有強度值的頻數之和。

cv2.calcHist 函式參數的詳細介紹

cv2.calcHist([images], [channels], mask, [histSize], [ranges])
  1. images:要計算直方圖的影像。它以方括號的形式提供,允許傳入單張或多張影像。
  2. channels:指定計算直方圖的通道。以列表形式提供,例如 [0] 表示灰度影像,[0, 1, 2] 表示 RGB 彩色影像中的所有通道。
  3. mask:可選的掩碼。如果提供掩碼,則只有掩碼區域內的像素才會參與直方圖的計算。
  4. histSize:指定每個通道的 bin 數量,以列表形式提供。例如 [256] 表示每個通道有 256 個 bin。
  5. ranges:指定每個通道的像素值範圍,以列表形式提供。對於 8 位影像,通常是 [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三通道分析

先前函式介紹時,有提到可以指定計算直方圖的通道,也能計算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()
RGB

RGB


參考資料






49會員
87內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!