opencv python統(tǒng)計(jì)及繪制直方圖的方法
灰度直方圖概括了圖像的灰度級(jí)信息,簡(jiǎn)單的來(lái)說(shuō)就是每個(gè)灰度級(jí)圖像中的像素個(gè)數(shù)以及占有率,創(chuàng)建直方圖無(wú)外乎兩個(gè)步驟,統(tǒng)計(jì)直方圖數(shù)據(jù),再用繪圖庫(kù)繪制直方圖。
統(tǒng)計(jì)直方圖數(shù)據(jù)
首先要稍微理解一些與函數(shù)相關(guān)的術(shù)語(yǔ),方便理解其在python3庫(kù)中的應(yīng)用和處理
BINS: 在上面的直方圖當(dāng)中,如果像素值是0到255,則需要256個(gè)值來(lái)顯示直 方圖。但是,如果不需要知道每個(gè)像素值的像素?cái)?shù)目,只想知道兩個(gè)像素值之間的像素點(diǎn)數(shù)目怎么辦?例如,想知道像素值在0到15之間的像素點(diǎn)數(shù)目,然后是16到31。。。240到255。可以將256個(gè)值分成16份,每份計(jì)算綜合。每個(gè)分成的小組就是一個(gè)BIN(箱)。在opencv中使用histSize表示BINS。
DIMS: 數(shù)據(jù)的參數(shù)數(shù)目。當(dāng)前例子當(dāng)中,對(duì)收集到的數(shù)據(jù)只考慮灰度值,所以該值為1。
RANGE: 灰度值范圍,通常是[0,256],也就是灰度所有的取值范圍。
統(tǒng)計(jì)直方圖同樣有兩種方法,使用opencv統(tǒng)計(jì)直方圖,函數(shù)如下:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
該函數(shù)的參數(shù)在了解以上術(shù)語(yǔ)加上自己百度后可以簡(jiǎn)單應(yīng)用
使用numpy統(tǒng)計(jì)函數(shù),主要應(yīng)用 numpy.histogram() 函數(shù)(還有 np.bincount() ,還未嘗試,讀者可以自己嘗試,大抵使用方法相同)
hist,bins = np.histogram(img.ravel(),256,[0,256])
opencv處理速度優(yōu)于numpy,同時(shí)對(duì)于學(xué)習(xí)opencv的同學(xué)來(lái)說(shuō),多運(yùn)用cv的處理方法無(wú)疑更利于學(xué)習(xí)。
繪制直方圖
繪制直方圖一般使用Matplotlib繪制 ,這里要提一下matplotlib的 matplotlib.pyplot.hist() 函數(shù),該函數(shù)可以直接統(tǒng)計(jì)繪制中方圖。統(tǒng)計(jì)函數(shù)為 calcHist() 或 np.histogram()
這是處理的樣圖

下面是代碼實(shí)現(xiàn)
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/home/yc/Pictures/cat.jpg',0)
plt.hist(img.ravel(),256,[0,256]);
plt.show()
效果

灰度直方圖
當(dāng)然,在顏色圖像檢索之類用法時(shí),我們需要的是BGR直方圖,原理類似,統(tǒng)計(jì)時(shí)使用 cv2.calcHist()
函數(shù)
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/home/yc/Pictures/cat.jpg',1)
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()
效果如下

BGR直方圖
此外,再介紹一種很原始的計(jì)算灰度直方圖的方法……感覺代碼注釋的很完整,相信讀者也可以看懂
import sys
import numpy as np
import cv2
import matplotlib.pyplot as plt
def main():
img=cv2.imread('/home/yc/Pictures/cat.jpg',0)
#得到計(jì)算灰度直方圖的值
xy=xygray(img)
#畫出灰度直方圖
x_range=range(256)
plt.plot(x_range,xy,"r",linewidth=2,c='black')
#設(shè)置坐標(biāo)軸的范圍
y_maxValue=np.max(xy)
plt.axis([0,255,0,y_maxValue])
#設(shè)置坐標(biāo)軸的標(biāo)簽
plt.xlabel('gray Level')
plt.ylabel("number of pixels")
plt.show()
def xygray(img):
#得到高和寬
rows,cols=img.shape
#存儲(chǔ)灰度直方圖
xy=np.zeros([256],np.uint64)
for r in range(rows):
for c in range(cols):
xy[img[r][c]] += 1
#返回一維ndarry
return xy
main()
效果如下

灰度直方圖
以上就是本文的全部?jī)?nèi)容,與一起學(xué)習(xí)opencv的同學(xué)共勉,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例
這篇文章主要介紹了Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Pandas0.25來(lái)了千萬(wàn)別錯(cuò)過(guò)這10大好用的新功能
這篇文章主要介紹了Pandas0.25來(lái)了千萬(wàn)別錯(cuò)過(guò)這10大好用的新功能,都有哪些新功能,文中給大家詳細(xì)介紹,需要的朋友可以參考下2019-08-08
python中for語(yǔ)句簡(jiǎn)單遍歷數(shù)據(jù)的方法
這篇文章主要介紹了python中for語(yǔ)句簡(jiǎn)單遍歷數(shù)據(jù)的方法,以一個(gè)簡(jiǎn)單實(shí)例形式分析了Python中for語(yǔ)句遍歷數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳
這篇文章主要為大家詳細(xì)介紹了Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳的相關(guān)代碼,感興趣的小伙伴們可以參考一下2016-08-08
Django自定義插件實(shí)現(xiàn)網(wǎng)站登錄驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Django自定義插件實(shí)現(xiàn)網(wǎng)站登錄驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

