Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)
1. 直方圖概述
(1)基本概念
直方圖就是對(duì)圖像的另外一種解釋?zhuān)枋隽苏鶊D像的灰度分布。直方圖的 x 軸代表灰度值(0~255),y 軸代表圖片中同一種灰度值的像素點(diǎn)的數(shù)目,所以通過(guò)直方圖我們可以對(duì)圖像的亮度、灰度分布、對(duì)比度等有了一個(gè)直觀的認(rèn)識(shí)
(2)直方圖中的術(shù)語(yǔ)
BINS
前面說(shuō)到,直方圖中的 x 軸表示的是灰度值,一幅灰度圖的灰度等級(jí)有 256 級(jí),所以我們是否需要將每一個(gè)等級(jí)標(biāo)注在一條軸上呢?或者如果我們需要的不是每一個(gè)灰度值的分布,而是一個(gè)范圍內(nèi)的灰度分布呢?所以我們將每一個(gè)需要的灰度值范圍稱(chēng)為一個(gè) BIN,即所有的灰度等級(jí)被分為幾個(gè)小組,每一個(gè)小組是一個(gè) BIN
DIMS
代表的是我們收集的圖像的參數(shù)的數(shù)目,直方圖我們?nèi)绻皇占叶戎狄粋€(gè)參數(shù),那么該參數(shù)的值就是1
RANGE
代表統(tǒng)計(jì)的灰度值的范圍,一般的范圍是[0-255]
2. 直方圖繪制
(1)讀取圖像信息
在計(jì)算機(jī)視覺(jué)系列的文章中第一件事就是讀取圖像信息:
"""
Author:XiaoMa
date:2021/10/24
"""
#調(diào)用需要的包
import cv2
import matplotlib.pyplot as plt
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) #轉(zhuǎn)化為灰度圖
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)
圖像信息如下:
419 636?

(2)繪制直方圖
繪制直方圖使用的函數(shù)如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
images:原圖
channels:指定通道 [0]代表灰度圖,如果讀入的圖像不是灰度圖,該值可以是[0],[1],[2]分別代表通道 B,G,R
mask:掩碼圖像,進(jìn)行整張圖的繪制時(shí)為 None
histSize:BIN 的數(shù)量
ranges:像素值范圍
accumulate:累計(jì)標(biāo)識(shí),一般可以省略
灰度圖的直方圖?
#繪制直方圖
hist = cv2.calcHist([img1], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '直方圖', linestyle = '--')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()

可以看出這幅灰度圖中亮度較高的像素點(diǎn)還是占多數(shù)的,即整體亮度較高
彩色圖直方圖
讀入彩色圖像,并對(duì)某一個(gè)通道進(jìn)行直方圖繪制
"""
Author:XiaoMa
date:2021/10/24
"""
#調(diào)用需要的包
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img0)
cv2.waitKey(delay = 0)
#繪制直方圖
hist = cv2.calcHist([img0], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '藍(lán)色通道直方圖', linestyle = '--', alpha = 1)
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()

上圖就是對(duì)藍(lán)色通道繪制的直方圖?
3. 掩膜直方圖
(1)基本概念
如果我們不需要整幅圖像中的直方圖,而是某個(gè)區(qū)域的直方圖,我們只需要繪制一幅圖,將需要統(tǒng)計(jì)的部分設(shè)置為白色,不需要統(tǒng)計(jì)的部分設(shè)置為黑色,就構(gòu)成了一幅掩膜圖像
(2)實(shí)現(xiàn)代碼
得到掩模圖
##得到掩膜圖
mask = np.zeros(img0.shape, np.uint8) #將每一個(gè)像素點(diǎn)設(shè)置為0,就是黑色
mask[109:309, 212:412] = 255 #選取特定區(qū)域設(shè)置為白色
img0_1 = cv2.bitwise_and(img0, mask) #圖像與操作得到掩膜圖
cv2.namedWindow("W1")
cv2.imshow("W1", img0_1)
cv2.waitKey(delay = 0)

繪制掩膜直方圖?
#繪制掩膜直方圖
##得到掩膜圖
mask = np.zeros(img1.shape, np.uint8) #將每一個(gè)像素點(diǎn)設(shè)置為0,就是黑色
mask[109:309, 212:412] = 255 #選取特定區(qū)域設(shè)置為白色
img1_1 = cv2.bitwise_and(img1, mask) #圖像與操作得到掩膜圖
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1)
cv2.waitKey(delay = 0)
##繪制掩膜直方圖和部分圖像直方圖
hist1 = cv2.calcHist([img1], [0], mask, [256], [0, 255]) #掩膜圖直方圖,參數(shù)需要修改
hist2 = cv2.calcHist([img1], [0], None, [256], [0,255])
plt.plot(hist1, color = 'b', label = '掩膜直方圖', linestyle = '--')
plt.plot(hist2, color = 'r', label = '原圖直方圖', linestyle = '-.')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven2.jpeg')
plt.show()
得到的圖像如下:

4. H-S 直方圖
(1)基本概念
?H(Hue) - S(Saturation) 直方圖,即色調(diào) - 飽和度直方圖
繪制該直方圖需要將源RGB圖像轉(zhuǎn)化到 HSV (色調(diào)、飽和度、亮度)顏色空間中去
img0_2 = cv2.cvtColor(img0, cv2.COLOR_BGR2HSV) #將 RGB 空間轉(zhuǎn)化為 HSV 空間
cv2.namedWindow("W2")
cv2.imshow("W2", img0_2)
cv2.waitKey(delay = 0)

(2)繪制二維H-S直方圖
此處參考:OpenCV 官網(wǎng)
##繪制H-S直方圖
hist3 = cv2.calcHist ([img0_2], [0, 1], None , [180, 256], [0, 180, 0, 256])#官網(wǎng)給出的解釋?zhuān)篶hannel = [0,1] 因?yàn)槲覀冃枰瑫r(shí)處理 H 和 S 平面;bins = [180,256] H 平面為 180,S 平面為 256;range = [0,180,0,256] 色調(diào)值介于 0 和 180 之間,飽和度介于 0 和 256 之間
plt.imshow(hist3)
plt.savefig('E:\From Zhihu\For the desk\cvseven3.jpeg')
plt.show()
得到的圖像如下:

上圖中的 X 軸代表S(飽和度),Y軸代表H(色調(diào))?
該圖中的峰值主要分布在 S 在(0-50)之間 H在(20-80),至于為什么峰值較少,個(gè)人猜測(cè)是由于原圖中的色彩變化不明顯,導(dǎo)致沒(méi)辦法繪制出過(guò)多過(guò)明顯的峰值
到此這篇關(guān)于Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)的文章就介紹到這了,更多相關(guān)Python OpenCV直方圖統(tǒng)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python+OpenCV六種實(shí)時(shí)圖像處理詳細(xì)講解
- 深入學(xué)習(xí)Python+Opencv常用四種圖像處理操作
- Python+OpenCV數(shù)字圖像處理之ROI區(qū)域的提取
- opencv-python圖像處理安裝與基本操作方法
- Python OpenCV圖像模糊處理介紹
- Python OpenCV圖像處理之圖像濾波特效詳解
- Python中ROS和OpenCV結(jié)合處理圖像問(wèn)題
- Python詳細(xì)講解圖像處理的而兩種庫(kù)OpenCV和Pillow
- python opencv 圖像處理之圖像算數(shù)運(yùn)算及修改顏色空間
相關(guān)文章
Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫(kù)SQLite3的方法
這篇文章主要介紹了Python實(shí)現(xiàn)讀取TXT文件數(shù)據(jù)并存進(jìn)內(nèi)置數(shù)據(jù)庫(kù)SQLite3的方法,涉及Python針對(duì)txt文件的讀取及sqlite3數(shù)據(jù)庫(kù)的創(chuàng)建、插入、查詢(xún)等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Python控制臺(tái)獲取輸入與常見(jiàn)的正則表達(dá)式用法
這篇文章主要給大家介紹了關(guān)于Python控制臺(tái)獲取輸入與常見(jiàn)的正則表達(dá)式用法的相關(guān)資料,在Python編程中,控制臺(tái)輸入和正則表達(dá)式是兩個(gè)重要而實(shí)用的概念,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Python實(shí)現(xiàn)加密的RAR文件解壓的方法(密碼已知)
這篇文章主要介紹了Python實(shí)現(xiàn)加密的RAR文件解壓,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
win8.1安裝Python 2.7版環(huán)境圖文詳解
在本篇內(nèi)容里小編給大家分享了關(guān)于win8.1安裝Python 2.7版環(huán)境的詳細(xì)步驟和方法,有興趣的朋友們跟著學(xué)習(xí)下。2019-07-07
Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法
今天小編就為大家分享一篇Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python使用plt庫(kù)實(shí)現(xiàn)繪制動(dòng)態(tài)曲線(xiàn)圖并導(dǎo)出為GIF或MP4
這篇文章主要為大家詳細(xì)介紹了Python如何使用plt庫(kù)實(shí)現(xiàn)繪制動(dòng)態(tài)曲線(xiàn)圖并導(dǎo)出為GIF或MP4,文中的示例代碼講解詳細(xì),需要的可以了解一下2024-03-03
pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python?Prim算法通過(guò)遍歷墻實(shí)現(xiàn)迷宮的生成
之前,我們?cè)诹硗庖黄恼轮惺褂肞rim算法生成了一個(gè)完美迷宮,利用的是遍歷網(wǎng)格的方法,這一次,我們要教教大家用遍歷墻的方法生成,感興趣的可以收藏一下2023-01-01

