OpenCV+python:直方图的概念及绘制(Histogram)
1,直方圖的概念
圖像直方圖是反映一個(gè)圖像像素分布的統(tǒng)計(jì)表,其實(shí)橫坐標(biāo)代表了圖像像素的種類(lèi),可以是灰度的,也可以是彩色的。縱坐標(biāo)代表了每一種顏色值在圖像中的像素總數(shù)或者占所有像素個(gè)數(shù)的百分比。圖像是由像素構(gòu)成,因?yàn)榉从诚袼胤植嫉闹狈綀D往往可以作為圖像一個(gè)很重要的特征。
圖像灰度直方圖:
 一幅圖像由不同灰度值的像素組成,圖像中灰度的分布情況是該圖像的一個(gè)重要特征。圖像的灰度直方圖就描述了圖像中灰度分布情況,能夠很直觀的展示出圖像中各個(gè)灰度級(jí)所占的多少。圖像的灰度直方圖是灰度級(jí)的函數(shù),描述的是圖像中具有該灰度級(jí)的像素的個(gè)數(shù):其中,橫坐標(biāo)是灰度級(jí),縱坐標(biāo)是該灰度級(jí)出現(xiàn)的頻率
 
 歸一化直方圖:
 通常會(huì)將縱坐標(biāo)歸一化到[0,1]區(qū)間內(nèi),也就是將灰度級(jí)出現(xiàn)的頻率(像素個(gè)數(shù))除以圖像中像素的總數(shù)。灰度直方圖的計(jì)算公式如下:
 
 其中,rk是像素的灰度級(jí),nk是具有灰度rk的像素的個(gè)數(shù),MN是圖像中總的像素個(gè)數(shù)。
 2,直方圖的繪制
import cv2 as cv
import numpy as npfrom matplotlib import pyplot as plt
#%matplotlib inlinedef plot_demo(image):plt.hist(image.ravel(), 256, [0, 256]) #image.ravel()#ravel函數(shù)功能是將多維數(shù)組降為一維數(shù)組,統(tǒng)計(jì)各個(gè)bin的頻次,256:bin的個(gè)數(shù),[0, 256]:范圍plt.show("直方圖") #和OpenCV中的想要的直方圖不同
"""
畫(huà)灰度圖直方圖:繪圖都可以調(diào)用matplotlib.pyplot庫(kù)來(lái)進(jìn)行,其中的hist函數(shù)可以直接繪制直方圖。plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)hist的參數(shù)非常多,但常用的就這五個(gè),只有第一個(gè)是必須的,后面四個(gè)可選arr: 需要計(jì)算直方圖的一維數(shù)組bins: 直方圖的柱數(shù),可選項(xiàng),默認(rèn)為10normed: 是否將得到的直方圖向量歸一化。默認(rèn)為0range參數(shù)表示箱子的下限和上限。即橫坐標(biāo)顯示的范圍,范圍之外的將被舍棄
"""def image_hist(image):color = ('blue', 'green', 'red')  #圖像三通道for i, color in enumerate(color):hist = cv.calcHist([image], [i], None, [256], [0, 256]) #繪制各個(gè)通道的直方圖plt.plot(hist, color=color) #定義線的顏色plt.xlim([0, 256]) #x軸的范圍plt.show()
"""
calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) 
images參數(shù)表示輸入圖像,傳入時(shí)應(yīng)該用中括號(hào)[ ]括起來(lái)channels參數(shù)表示傳入圖像的通道,如果是灰度圖像,那就不用說(shuō)了,只有一個(gè)通道,值為0,
如果是彩色圖像(有3個(gè)通道),那么值為0,1,2,中選擇一個(gè),對(duì)應(yīng)著B(niǎo)GR各個(gè)通道。這個(gè)值也得用[ ]傳入。mask參數(shù)表示掩膜圖像。如果統(tǒng)計(jì)整幅圖,那么為None。
主要是如果要統(tǒng)計(jì)部分圖的直方圖,就得構(gòu)造相應(yīng)的掩膜來(lái)計(jì)算。histSize參數(shù)表示灰度級(jí)的個(gè)數(shù),需要中括號(hào),比如[256]ranges參數(shù)表示像素值的范圍,通常[0,256]。此外,假如channels為[0,1],ranges為[0,256,0,180],
則代表0通道范圍是0-256,1通道范圍0-180。hist參數(shù)表示計(jì)算出來(lái)的直方圖。"""src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
plot_demo(src)
image_hist(src)
cv.waitKey(0)cv.destroyAllWindows()運(yùn)行結(jié)果:
 
總結(jié)
以上是生活随笔為你收集整理的OpenCV+python:直方图的概念及绘制(Histogram)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 送寒冰公主
- 下一篇: OpenCV+python:直方图的应用
