【图像处理】——图像灰度直方图的绘制(直接调用函数和自定义函数)
目錄
一、灰度直方圖概念
二、直接調(diào)用opencv的函數(shù)caclHist()
1、函數(shù)介紹
2、實(shí)例
(1)繪制全局直方圖
(2)繪制局部的直方圖
?
三、自定義函數(shù)進(jìn)行灰度直方圖的繪制
1、代碼
2、結(jié)果
?
一、灰度直方圖概念
灰度直方圖是關(guān)于灰度級(jí)分布的函數(shù),將數(shù)字圖像中的所有像素,按照灰度值的大小,統(tǒng)計(jì)其出現(xiàn)的頻率。其中,橫坐標(biāo)是灰度級(jí),縱坐標(biāo)是該灰度級(jí)出現(xiàn)的頻率。
對(duì)圖像中不同灰度級(jí)別出現(xiàn)的次數(shù)進(jìn)行統(tǒng)計(jì),統(tǒng)計(jì)后進(jìn)行繪制直方圖,橫坐標(biāo)表示灰度級(jí)別0-255,縱坐標(biāo)表示每個(gè)灰度級(jí)別在圖像中出現(xiàn)的次數(shù),一般會(huì)對(duì)次數(shù)進(jìn)行歸一化,用每個(gè)灰度級(jí)出現(xiàn)的次數(shù)除以圖像的像素總個(gè)數(shù)。
二、直接調(diào)用opencv的函數(shù)caclHist()
1、函數(shù)介紹
返回的是一個(gè)一維數(shù)組(256,1)
hist = cv2.calcHist([images],[channels],mask,histSize,ranges ) 參數(shù)說明: images:uint8或float32類型的原圖像。用方括號(hào)表示,即“[img]”; channels:計(jì)算直方圖的通道索引,也在方括號(hào)中給出.例如,如果輸入是灰度圖像,則其值為[0].對(duì)于彩色圖像,可以通過[0],[1]或[2]分別計(jì)算藍(lán)色,綠色或紅色通道的直方圖. mask:掩碼,蒙版圖像.要查找完整圖像的直方圖,它將顯示為“無”.但是,如果要查找圖像特定區(qū)域的直方圖,則必須為其創(chuàng)建蒙版圖像并將其作為蒙版. histSize:灰度級(jí)的個(gè)數(shù),這代表我們的BIN計(jì)數(shù).需要在方括號(hào)中給出.對(duì)于滿量程,我們通過[256]. ranges:這是像素值的范圍的范圍。通常,它是[0,256].2、實(shí)例
(1)繪制全局直方圖
獲得上圖的直方圖,首先得先進(jìn)行灰度化
import cv2 import numpy as np import matplotlib.pyplot as pltdef image_calcuhist(imagepath):img = cv2.imread(imagepath)#讀取圖片img_shape = img.shapegray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度化hist = cv2.calcHist([gray],[0],None,[256],[0,256])#計(jì)算灰度級(jí)別出現(xiàn)頻率,返回的是一個(gè)(256,1)的數(shù)組for i in range(hist.shape[0]):hist[i] = hist[i]/(img_shape[0]*img_shape[1])#對(duì)獲得的直方圖數(shù)據(jù)進(jìn)行歸一化return histif __name__ == '__main__':x = np.linspace(0,255,256)#橫坐標(biāo)灰度級(jí)別y = image_calcuhist("colorful_lena.jpg")#縱坐標(biāo)值獲取plt.bar(x,y.ravel(),0.9,alpha=1,color='b')#通過matplotlib進(jìn)行直方圖的繪制plt.show()#顯示直方圖(2)繪制局部的直方圖
import cv2 import numpy as np import matplotlib.pyplot as pltimg = cv2.imread("colorful_lena.jpg",0) h,w = img.shape#構(gòu)建一個(gè)掩模,需要繪制直方圖的局部圖像區(qū)域的像素設(shè)置為255,其他部分設(shè)置為0 mask = np.zeros((h,w),np.uint8) for i in range(0,int(h/2)):for j in range(0,int(w/2)):mask[int(h/4)+i,int(w/4)+j] = 255#全幅圖像的直方圖 hist = cv2.calcHist([img],[0],None,[256],[0,256]) #局部的直方圖 hist1 = cv2.calcHist([img],[0],mask,[256],[0,256]) x = np.linspace(0,255,256) plt.plot(x,hist.ravel()) plt.plot(x,hist1.ravel()) plt.show() cv2.imshow('',mask) cv2.imshow('1',img) cv2.waitKey(0)藍(lán)色線為全局直方圖,橙色為局部直方圖
三、自定義函數(shù)進(jìn)行灰度直方圖的繪制
1、代碼
# 1 0-255 2 概率 # 本質(zhì):統(tǒng)計(jì)每個(gè)像素灰度 出現(xiàn)的概率 0-255 p import cv2 import numpy as np import matplotlib.pyplot as pltdef image_histdefinition(imagepath):img = cv2.imread(imagepath)#讀取圖片imgInfo = img.shape#獲得圖片的尺寸大小height = imgInfo[0]width = imgInfo[1]# 灰度化gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)count = np.zeros(256,np.float) # 共256個(gè),創(chuàng)建一個(gè)數(shù)組用于存放灰度級(jí)別出現(xiàn)的頻率#計(jì)算灰度級(jí)別頻率for i in range(0,height):for j in range(0,width):pixel = gray[i,j] # 獲取灰度等級(jí)index = int(pixel) # 強(qiáng)制類型轉(zhuǎn)換count[index] = count[index]+1# 計(jì)算出現(xiàn)概率,即歸一化for i in range(0,255):count[i] = count[i]/(height*width)return countif __name__ == '__main__':# 繪圖x = np.linspace(0, 255, 256)count = image_histdefinition('colorful_lena.jpg')y = countplt.bar(x, y, 0.9, alpha=1, color='b')plt.show()2、結(jié)果
?
兩種方法得到的直方圖是一樣的,證明方法是可行的。
總結(jié)
以上是生活随笔為你收集整理的【图像处理】——图像灰度直方图的绘制(直接调用函数和自定义函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一讲、单例模式
- 下一篇: Tomcat JAAS 身份验证和授权