深入了解Python二維直方圖
前言
只統(tǒng)計(jì)像素的灰度值這一特征,可將其成為一維直方圖。二維直方圖可以統(tǒng)計(jì)像素的色相和飽和度,用于查找圖像的顏色直方圖。
一、OpenCV中的二維直方圖
OpenCV仍然使用cv2.calcHist()函數(shù)來查找圖像的顏色直方圖,只是在指定參數(shù)時(shí)與之前有所區(qū)別。
cv2.calcHist()函數(shù)的基本格式如下:
hist =cv2.calcHist(image, channels, mask, histSize, ranges)
image
參數(shù)指定的原圖像應(yīng)從BGR色彩空間轉(zhuǎn)換為HSV色彩空間, 實(shí)際參數(shù)需要用方括號(hào)括起來
channels
參數(shù)設(shè)置為[0,1]時(shí), 表示同時(shí)處理色相和飽和度
histSize
參數(shù)設(shè)置BINS值為[180,256]時(shí), 表示色相為180, 飽和度為256
ranges
參數(shù)設(shè)置為[0,180,0,256]時(shí), 表示色相的取值范圍為[0,180], 飽和度的取值范圍為[0,2565]
cv2.calcHist()函數(shù)返回的顏色直方圖可以直接使用cv2.show()函數(shù)顯示。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('XIAN.jpg') cv2.namedWindow('orininal', cv2.WINDOW_NORMAL) cv2.imshow('orininal', img) img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0,180,0,256]) cv2.namedWindow('2DHist', cv2.WINDOW_NORMAL) cv2.imshow('2DHist', hist) cv2.waitKey(0) cv2.destroyAllWindows() plt.imshow(hist, interpolation = 'nearest') # 繪制顏色直方圖 plt.show() # 顯示顏色直方圖
cv2.calcHist()函數(shù)返回的顏色直方圖是一個(gè)大小為180*256的二維數(shù)組,用cv2.imshow()函數(shù)顯示時(shí)是一副灰度圖像,不能直接顯示出顏色的分布情況。
可以使用matplotlib.pyplot.imshow()函數(shù)繪制具有不同顏色的二維直方圖。
二、Numpy中的二維直方圖
Numpy的np.histogram2d()函數(shù)用于計(jì)算二維直方圖,其基本格式如下:
hist, xedges, yedges = np.histogram2d(x, y, bins, range)
hist
為返回的直方圖
xedges
為返回的x的直方圖的BINS邊界值
yedges
為返回的y的直方圖的BINS邊界值
x
和y
為原圖對(duì)應(yīng)通道轉(zhuǎn)換成的一維數(shù)組
bins
為BINS的值, 如[180,256]
range
為像素范圍, 格式為[[0, 180],[0, 256]]
img = cv2.imread('building.jpg') cv2.imshow('orininal', img) img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(img2) hist, x, y = np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180],[0, 256]]) cv2.imshow('2DHist', hist) cv2.waitKey(0) cv2.destroyAllWindows() plt.imshow(hist, interpolation = 'nearest') plt.show()
可以使用matplotlib.pyplot.imshow()函數(shù)繪制具有不同顏色的二維直方圖。
三、直方圖示例
1、使用Numpy函數(shù)計(jì)算直方圖
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('home.jpg') plt.figure(figsize = (25,25)) imgrgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(2, 2, 1) plt.title('Original') plt.axis('off') plt.imshow(imgrgb) histb, e1 = np.histogram(img[0].ravel(), 256, [0, 255]) #計(jì)算B通道直方圖 histg, e2 = np.histogram(img[1].ravel(), 256, [0, 255]) #計(jì)算G通道直方圖 histr, e3 = np.histogram(img[2].ravel(), 256, [0, 255]) #計(jì)算R通道直方圖 plt.subplot(2, 2, 2) plt.plot(histb, color = 'b') plt.plot(histg, color = 'g') plt.plot(histr, color = 'r') plt.title('Hist') img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #轉(zhuǎn)換色彩空間為HSV h, s, v = cv2.split(img2) hist, x, y=np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180], [0, 256]]) #計(jì)算顏色直方圖 plt.subplot(2, 2, 3) plt.title('2Dhist') #設(shè)置子圖窗口標(biāo)題 plt.imshow(hist, interpolation = 'nearest',cmap = 'gray') #繪制顏色直方圖 plt.show() #顯示顏色直方圖
2、使用OpenCV函數(shù)計(jì)算直方圖
# 2.使用OpenCV函數(shù)計(jì)算直方圖 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('flower.jpg') plt.figure(figsize = (25,25)) imgrgb=cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(2, 2, 1) plt.imshow(imgrgb) plt.title('Original') plt.axis('off') histb = cv2.calcHist([img], [0], None, [256], [0,255]) #計(jì)算B通道直方圖 histg = cv2.calcHist([img], [1], None, [256], [0,255]) #計(jì)算G通道直方圖 histr = cv2.calcHist([img], [2], None, [256], [0,255]) #計(jì)算R通道直方圖 plt.subplot(2, 2, 2) plt.plot(histb, color= 'b') plt.plot(histg, color= 'g') plt.plot(histr, color= 'r') plt.title('Hist') img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0, 180, 0, 256]) plt.subplot(2, 2, 3) plt.title('2Dhist') #設(shè)置子圖窗口標(biāo)題 plt.imshow(hist,interpolation = 'nearest',cmap = 'gray') #繪制顏色直方圖 plt.show() #顯示顏色直方圖
到此這篇關(guān)于深入了解Python二維直方圖的文章就介紹到這了,更多相關(guān)Python 二維直方圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python minidom模塊用法示例【DOM寫入和解析XML】
這篇文章主要介紹了Python minidom模塊用法,結(jié)合實(shí)例形式分析了Python DOM創(chuàng)建、寫入和解析XML文件相關(guān)操作技巧,需要的朋友可以參考下2019-03-03python根據(jù)用戶需求輸入想爬取的內(nèi)容及頁數(shù)爬取圖片方法詳解
這篇文章主要介紹了python根據(jù)用戶需求輸入想爬取的內(nèi)容及頁數(shù)爬取圖片方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python使用sklearn庫實(shí)現(xiàn)的各種分類算法簡(jiǎn)單應(yīng)用小結(jié)
這篇文章主要介紹了Python使用sklearn庫實(shí)現(xiàn)的各種分類算法,結(jié)合實(shí)例形式分析了Python使用sklearn庫實(shí)現(xiàn)的KNN、SVM、LR、決策樹、隨機(jī)森林等算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07Python 讀取串口數(shù)據(jù),動(dòng)態(tài)繪圖的示例
今天小編就為大家分享一篇Python 讀取串口數(shù)據(jù),動(dòng)態(tài)繪圖的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解
這篇文章主要為大家介紹了如何使用 dlib 庫在實(shí)時(shí)視頻中有效地跟蹤多個(gè)對(duì)象,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-03-03Python實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的操作方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的操作方法,結(jié)合實(shí)例形式演示了Python針對(duì)數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的初始化、插入、刪除、判斷隊(duì)列滿及隊(duì)列空等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12django創(chuàng)建自定義模板處理器的實(shí)例詳解
這篇文章主要介紹了django創(chuàng)建自定義模板處理器的實(shí)例詳解的相關(guān)資料,這里說明了如何需要django模板處理器及實(shí)現(xiàn)方法,希望大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-08-08Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV)
這篇文章主要介紹了Python實(shí)現(xiàn)圖片裁剪的兩種方式(Pillow和OpenCV),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10