wp網(wǎng)站源碼百度最新財(cái)報(bào)
????????在圖像處理中,直方圖是一種非常重要的工具,它可以幫助我們了解圖像的像素分布情況。通過(guò)分析圖像的直方圖,我們可以進(jìn)行圖像增強(qiáng)、對(duì)比度調(diào)整、圖像分割等操作。
1 什么是圖像直方圖?
????????圖像直方圖是圖像像素強(qiáng)度分布的圖形表示,對(duì)于灰度圖像,直方圖顯示了每個(gè)灰度級(jí)(0到255)在圖像中出現(xiàn)的頻率,對(duì)于彩色圖像,我們可以分別計(jì)算每個(gè)通道(如R、G、B)的直方圖。直方圖可以幫助我們了解圖像的亮度、對(duì)比度等信息。例如,如果直方圖集中在低灰度區(qū)域,說(shuō)明圖像偏暗;如果直方圖分布均勻,說(shuō)明圖像對(duì)比度較好。
- 直方圖:?表示圖像中像素強(qiáng)度的分布情況,橫軸表示像素強(qiáng)度值,縱軸表示該強(qiáng)度值的像素?cái)?shù)量。
- 灰度直方圖:?針對(duì)灰度圖像的直方圖,表示每個(gè)灰度級(jí)的像素?cái)?shù)量。
- 顏色直方圖:?針對(duì)彩色圖像的直方圖,分別表示每個(gè)顏色通道(如 BGR)的像素強(qiáng)度分布。
功能 | 函數(shù) | 說(shuō)明 |
---|---|---|
計(jì)算直方圖 | cv2.calcHist() | 計(jì)算圖像的直方圖。 |
直方圖均衡化 | cv2.equalizeHist() | 增強(qiáng)圖像的對(duì)比度。 |
直方圖比較 | cv2.compareHist() | 比較兩個(gè)直方圖的相似度。 |
繪制直方圖 | matplotlib.pyplot.plot() | 使用 Matplotlib 繪制直方圖。 |
????????直方圖的應(yīng)用?
- 圖像增強(qiáng): 通過(guò)直方圖均衡化,可以增強(qiáng)圖像的對(duì)比度,使細(xì)節(jié)更加清晰。
- 圖像分割: 過(guò)分析直方圖,可以確定閾值,用于圖像分割。
- 圖像匹配: 通過(guò)比較直方圖,可以判斷兩幅圖像的相似度,用于圖像匹配和檢索。
- 顏色分析: 通過(guò)顏色直方圖,可以分析圖像的顏色分布,用于顏色校正和風(fēng)格化處理。
2?OpenCV 中的直方圖計(jì)算函數(shù)
????????在 OpenCV 中,我們可以使用?cv2.calcHist()
?函數(shù)來(lái)計(jì)算圖像的直方圖。
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
- images: 輸入的圖像列表,通常是一個(gè)包含單通道或多通道圖像的列表。例如?
[img]
。 - channels: 需要計(jì)算直方圖的通道索引。對(duì)于灰度圖像,使用?
[0]
;對(duì)于彩色圖像,可以使用?[0]
、[1]
、[2]
?分別計(jì)算藍(lán)色、綠色和紅色通道的直方圖。 - mask: 掩碼圖像。如果指定了掩碼,則只計(jì)算掩碼區(qū)域內(nèi)的像素。如果不需要掩碼,可以傳入?
None
。 - histSize: 直方圖的 bin 數(shù)量。對(duì)于灰度圖像,通常設(shè)置為?
[256]
,表示將灰度級(jí)分為 256 個(gè) bin。 - ranges: 像素值的范圍。對(duì)于灰度圖像,通常設(shè)置為?
[0, 256]
,表示像素值的范圍是 0 到 255。 - hist: 輸出的直方圖數(shù)組。
- accumulate: 是否累積直方圖。如果設(shè)置為?
True
,則直方圖不會(huì)被清零,而是在每次調(diào)用時(shí)累積。
????????假設(shè)我們有一張灰度圖像?img
,我們可以使用以下代碼計(jì)算其直方圖:
import cv2
import matplotlib.pyplot as plt# 讀取圖像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 計(jì)算直方圖
hist = cv2.calcHist([img], [0], None, [256], [0, 256])# 繪制直方圖
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
3 直方圖均衡化
????????直方圖均衡化是一種增強(qiáng)圖像對(duì)比度的方法,通過(guò)重新分配像素強(qiáng)度值,使直方圖更加均勻。
equalized_image = cv2.equalizeHist(image)
import cv2# 讀取圖像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 直方圖均衡化
equalized_image = cv2.equalizeHist(img)# 顯示結(jié)果
cv2.imshow("Equalized Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4 顏色直方圖
????????對(duì)于彩色圖像,可以分別計(jì)算每個(gè)顏色通道的直方圖。
import cv2
from matplotlib import pyplot as plt# 讀取圖像
img = cv2.imread('image.jpg')# 計(jì)算 BGR 各通道的直方圖
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):hist = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(hist, color=color)# 繪制直方圖
plt.title("Color Histogram")
plt.xlabel("Pixel Intensity")
plt.ylabel("Pixel Count")
plt.show()
????????對(duì)于彩色圖像,可以對(duì)每個(gè)通道分別進(jìn)行直方圖均衡化。
import cv2# 讀取圖像
img = cv2.imread('image.jpg')# 分離通道
b, g, r = cv2.split(img)# 對(duì)每個(gè)通道進(jìn)行直方圖均衡化
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)# 合并通道
equalized_image = cv2.merge([b_eq, g_eq, r_eq])# 顯示結(jié)果
cv2.imshow("Equalized Color Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5 直方圖比較
????????OpenCV 提供了 cv2.compareHist() 函數(shù),用于比較兩個(gè)直方圖的相似度。
similarity = cv2.compareHist(hist1, hist2, method)
hist1
: 第一個(gè)直方圖。hist2
: 第二個(gè)直方圖。method
: 比較方法,例如?cv2.HISTCMP_CORREL
(相關(guān)性比較)。
import cv2# 讀取圖像
img = cv2.imread('image.jpg', 0)
image2 = cv2.imread('bird.jpg', 0)# 計(jì)算兩個(gè)圖像的直方圖
hist1 = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([image2], [0], None, [256], [0, 256])# 比較直方圖
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
print("Histogram Similarity:", similarity)