武城網(wǎng)站建設(shè)費(fèi)用/品牌營(yíng)銷公司
什么是直方圖?
直方圖是一種統(tǒng)計(jì)圖,用于展示數(shù)據(jù)的分布情況。它將數(shù)據(jù)按照一定的區(qū)間或者組進(jìn)行劃分,然后計(jì)算在每個(gè)區(qū)間或組內(nèi)的數(shù)據(jù)頻數(shù)或頻率(即數(shù)據(jù)出現(xiàn)的次數(shù)或占比),然后用矩形或者柱形圖的形式將這些頻數(shù)或頻率表示出來。橫軸表示數(shù)據(jù)的區(qū)間或組,縱軸表示頻數(shù)或頻率,通過矩形或柱形的高度來表示頻數(shù)或頻率的大小。直方圖可以用于直觀地展示數(shù)據(jù)的分布情況,分析數(shù)據(jù)的集中趨勢(shì)、離散程度和異常值等。
什么是圖像直方圖?
圖像直方圖是用來表示數(shù)字圖像亮度或顏色分布的統(tǒng)計(jì)圖。它可以顯示圖像中每個(gè)像素值或像素值范圍的頻數(shù)或頻率。圖像直方圖以橫軸表示像素值,縱軸表示像素值的頻數(shù)或頻率。對(duì)于灰度圖像,直方圖展示了每個(gè)像素值出現(xiàn)的次數(shù)或占比。對(duì)于彩色圖像,可以將圖像分解為紅、綠、藍(lán)通道,每個(gè)通道的直方圖分別表示了該通道像素值的分布情況。
圖像直方圖可以提供有關(guān)圖像亮度或顏色分布的重要信息。例如,在灰度圖像中,直方圖的形狀可以反映圖像的對(duì)比度和明暗程度。在彩色圖像中,通過分析不同通道的直方圖,可以了解圖像的色彩分布情況,例如顏色偏移、色彩飽和度等。圖像直方圖在圖像處理和計(jì)算機(jī)視覺中廣泛應(yīng)用,用于圖像增強(qiáng)、顏色分析、圖像檢索等任務(wù)中。
opencv的calcHist函數(shù)介紹
cv2.calcHist()
函數(shù)是OpenCV中用于計(jì)算圖像直方圖的函數(shù)。它的語法如下:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
參數(shù)解釋:
images
:輸入的圖像,可以是一個(gè)圖像或圖像列表。channels
:用于計(jì)算直方圖的通道編號(hào),如果輸入的圖像是灰度圖像,則通道值為[0];如果是彩色圖像,通道值可以是[0]、[1]或[2],分別表示B、G、R通道。mask
:可選參數(shù),用于指定感興趣區(qū)域。如果不提供,則計(jì)算整個(gè)圖像的直方圖。histSize
:直方圖的桶數(shù),表示直方圖的分組數(shù)量。ranges
:直方圖的像素值范圍,通常為[0, 256]。hist
:可選參數(shù),用于存儲(chǔ)計(jì)算得到的直方圖。accumulate
:可選參數(shù),用于指定是否累加直方圖。
返回值:
hist
:計(jì)算得到的直方圖。
cv2.calcHist()
函數(shù)會(huì)根據(jù)指定的通道和大小,計(jì)算輸入圖像的直方圖??梢酝ㄟ^調(diào)整參數(shù)來計(jì)算灰度圖像或彩色圖像的直方圖。計(jì)算得到的直方圖可以用于圖像處理、分析和可視化等應(yīng)用。
如何灰度圖像的直方圖?
在Python中,可以使用matplotlib庫 + opencv庫來繪制灰度圖像的直方圖。下面是一個(gè)簡(jiǎn)單的示例:
import cv2
import matplotlib.pyplot as plt# 讀取灰度圖像
image = cv2.imread('2_0_2_2170.png', 0)# 計(jì)算直方圖
histogram = cv2.calcHist([image], [0], None, [256], [0, 256])# 繪制直方圖
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.plot(histogram)
plt.xlim([0, 256])
plt.show()
在上面的示例中,我們首先使用cv2.imread()函數(shù)讀取灰度圖像。然后,使用cv2.calcHist()函數(shù)計(jì)算圖像的直方圖。該函數(shù)接受以下參數(shù):圖像(以數(shù)組的形式傳遞,所以使用方括號(hào)括起來),通道(如果是灰度圖像,通道為[0]),掩碼(用于指定對(duì)哪些像素計(jì)算直方圖,None表示計(jì)算整個(gè)圖像的直方圖),直方圖的bin數(shù)(256表示每個(gè)像素值都有一個(gè)bin),像素值范圍([0, 256]表示像素值的范圍)。最后,使用matplotlib.pyplot庫繪制直方圖,設(shè)置標(biāo)題、x軸、y軸標(biāo)簽,以及繪制直方圖的范圍。
運(yùn)行以上代碼,將會(huì)顯示灰度圖像的直方圖。你可以根據(jù)實(shí)際情況修改代碼中的圖像路徑和參數(shù),來繪制不同灰度圖像的直方圖。
如何繪制彩色圖像的直方圖?
import cv2
import matplotlib.pyplot as plt# 讀取彩色圖像
image = cv2.imread('beauty_01.jpg')# 將圖像從BGR顏色空間轉(zhuǎn)換為RGB顏色空間
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 將圖像展平為一維數(shù)組
pixels = image_rgb.reshape(-1, 3)# 繪制直方圖
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
colors = ('r', 'g', 'b')
for i, color in enumerate(colors):histogram = cv2.calcHist([image_rgb], [i], None, [256], [0, 256])plt.plot(histogram, color=color)plt.xlim([0, 256])
plt.show()
在上述示例中,我們首先使用cv2.imread()函數(shù)讀取彩色圖像。然后,使用cv2.cvtColor()函數(shù)將圖像從BGR顏色空間轉(zhuǎn)換為RGB顏色空間。接下來,我們使用reshape()函數(shù)將圖像展平為一維數(shù)組,以便于計(jì)算直方圖。然后,使用cv2.calcHist()函數(shù)計(jì)算每個(gè)顏色通道的直方圖。最后,使用matplotlib.pyplot庫繪制直方圖,設(shè)置標(biāo)題、x軸、y軸標(biāo)簽,以及為每個(gè)顏色通道分別繪制直方圖。
運(yùn)行以上代碼,將會(huì)顯示彩色圖像的直方圖。你可以根據(jù)實(shí)際情況修改代碼中的圖像路徑和參數(shù),來繪制不同彩色圖像的直方圖。
什么是直方圖均衡化?
直方圖均衡化是一種圖像處理技術(shù),用于增強(qiáng)圖像的對(duì)比度。 它通過重新分配圖像的灰度級(jí),使得原始圖像中灰度級(jí)較少的區(qū)域在整個(gè)灰度范圍內(nèi)更均勻地分布。直方圖均衡化可以增加圖像的視覺效果和細(xì)節(jié),并用于圖像增強(qiáng)、圖像分割、圖像識(shí)別等應(yīng)用中。
如何進(jìn)行直方圖均衡化?
opencv中,可以通過equalizeHist函數(shù)來進(jìn)行灰度圖的直方圖均衡化。
cv2.equalizeHist()
函數(shù)是OpenCV中用于直方圖均衡化的函數(shù)。它將輸入圖像的直方圖進(jìn)行均衡化,以提升圖像的對(duì)比度和亮度。
該函數(shù)的語法如下:
dst = cv2.equalizeHist(src)
參數(shù)說明:
src
:輸入圖像,可以是灰度圖像或彩色圖像。
返回值:
dst
:均衡化后的圖像。
函數(shù)的工作原理如下:
- 計(jì)算輸入圖像的直方圖。
- 計(jì)算直方圖的累積分布函數(shù)(Cumulative Distribution Function,CDF)。
- 根據(jù)CDF對(duì)輸入圖像進(jìn)行像素值的映射,將較暗的像素值轉(zhuǎn)化為較亮的像素值,以實(shí)現(xiàn)直方圖均衡化。
- 返回均衡化后的圖像。
直方圖均衡化可以提高圖像的對(duì)比度,使得圖像中的細(xì)節(jié)更加清晰。它常用于圖像增強(qiáng)、視覺處理和計(jì)算機(jī)視覺中的預(yù)處理步驟。
使用案例:
import cv2# 讀取圖像
image = cv2.imread('beauty_01.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模式讀取圖像# 進(jìn)行直方圖均衡化
equalized_image = cv2.equalizeHist(image)# 顯示原始圖像和均衡化后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()