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