[Python影象處理] 十一.灰度直方圖概念及OpenCV繪製直方圖
該系列文章是講解Python OpenCV影象處理知識,前期主要講解影象入門、OpenCV基礎用法,中期講解影象處理的各種演算法,包括影象銳化運算元、影象增強技術、影象分割等,後期結合深度學習研究影象識別、影象分類應用。希望文章對您有所幫助,如果有不足之處,還請海涵~
同時推薦作者的C++影象系列知識:
[數字影象處理] 一.MFC詳解顯示BMP格式圖片
[數字影象處理] 二.MFC單文件分割視窗顯示圖片
[數字影象處理] 三.MFC實現影象灰度、取樣和量化功能詳解
[數字影象處理] 四.MFC對話方塊繪製灰度直方圖
[數字影象處理] 五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
[數字影象處理] 六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
[數字影象處理] 七.MFC影象增強之影象普通平滑、高斯平滑、Laplacian、Sobel、Prewitt銳化詳解
前文參考:
[Python影象處理] 一.影象處理基礎知識及OpenCV入門函式
[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素
[Python影象處理] 三.獲取影象屬性、興趣ROI區域及通道處理
[Python影象處理] 四.影象平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python影象處理] 五.影象融合、加法運算及影象型別轉換
[Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移
[Python影象處理] 七.影象閾值化處理及演算法對比
[Python影象處理] 八.影象腐蝕與影象膨脹
[Python影象處理] 九.形態學之影象開運算、閉運算、梯度運算
[Python影象處理] 十.形態學之影象頂帽運算和黑帽運算
本篇文章主要講解灰度直方圖的基本概念,Python呼叫OpenCV實現繪製影象直方圖,基礎性知識希望對您有所幫助。
1.灰度直方圖基本概率
2.繪製直方圖
3.使用OpenCV統計繪製直方圖
PS:文章參考自己以前系列影象處理文章及OpenCV庫函式,同時部分參考網易雲李大羊老師的視訊,推薦大家去學習。同時,本篇文章涉及到《計算機圖形學》基礎知識,請大家下來補充。
PSS:2019年1~2月作者參加了CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index
一. 灰度直方圖基本概念
什麼是灰度直方圖?
灰度直方圖(histogram)是灰度級的函式,描述的是影象中每種灰度級畫素的個數,反映影象中每種灰度出現的頻率。橫座標是灰度級,縱座標是灰度級出現的頻率。
其中A(D)為閾值面積函式:為一幅連續影象中被具有灰度級D的所有輪廓線所包圍的面積。對於離散函式,固定ΔD為1,則:H(D)=A(D)-A(D+1)。
色彩直方圖是高維直方圖的特例,它統計色彩的出現頻率,即色彩概率分佈資訊。通常這需要一定的量化過程,將色彩分成若干互不重疊的種類。一般不直接在RGB色彩空間中統計,而是在將亮度分離出來後,對代表色彩部分的資訊進行統計,如在HSI空間的HS子空間、YUV空間的UV子空間,以及其它反映人類視覺特點的彩色空間表示中進行。
直方圖的計算方法如下:
依據定義,若影象具有L(通常L=256,即8位灰度級)級灰度,則大小為MxN的灰度影象f(x,y)的灰度直方圖hist[0…L-1]可用如下計算獲得。
1、初始化 hist[k]=0; k=0,…,L-1
2、統計 hist[f(x,y)]++; x=0,…,M-1, y =0,…,N-1
3、歸一化 hist[f(x,y)]/=M*N
那麼說了這麼多,直方圖究竟有什麼作用呢?
在使用輪廓線確定物體邊界時,通過直方圖更好的選擇邊界閾值,進行閾值化處理;對物體與背景有較強對比的景物的分割特別有用;簡單物體的面積和綜合光密度IOD可以通過影象的直方圖求得。
二. 繪製直方圖
1.基礎概念
在直方圖中,橫座標表示影象中各個畫素點的灰度級,縱座標表示具有該灰度級的畫素個數。
假設存在一個3*3的影象,如下圖所示,x陣列統計的是畫素點的灰度級,y陣列統計的是具有該灰度級的畫素個數。其中,灰度為1的畫素共3個,灰度為2的畫素共1個,灰度為3的畫素共2個,灰度為4的畫素共1個,灰度為5的畫素共2個。
x = [1, 2, 3, 4, 5]
y = [3, 1, 2, 1, 2]
繪製的折線圖如下所示:
2.歸一化直方圖
該直方圖的橫座標表示影象中各個畫素點的灰度級,縱座標表示出現這個灰度級的概率。其計算方法如下:
(1) 先計算灰度級及對應畫素的個數
x = [1, 2, 3, 4, 5]
t = [3, 1, 2, 1, 2]
(2) 統計總的畫素個數
n = (3 + 1 + 2 + 1 +2) = 9
(3) 統計各個灰度級的出現概率
y = t / n = [3/9, 1/9, 2/9, 1/9, 2/9]
3.繪製直方圖
主要呼叫matplotlib的子庫pyplot實現,它提供了類似於Matlab的繪圖框架,matplotlib是非常強大基礎的一個Python繪圖包。Provides a Matlab-like plotting framework. 匯入程式碼如下:
import matplotlib.pyplot as plt
其中繪製直方圖主要呼叫hist函式實現,它根據資料來源和畫素級繪製直方圖。函式原型如下:
hist(資料來源, 畫素級)
引數:
資料來源必須是一維陣列,通常需要通過函式ravel()拉直影象
畫素級一般是256,表示[0, 255]
函式ravel()將多維陣列降為一維陣列,格式為:
一維陣列 = 多維陣列.ravel()
4.程式碼實現
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
src = cv2.imread('test01.jpg')
cv2.imshow("src", src)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.hist(src.ravel(), 256)
plt.show()
輸出結果如下所示:
三. 使用OpenCV統計繪製直方圖
1.函式原型
前面講解呼叫matplotlib庫繪製直方圖,接下來講解使用OpenCV統計繪製直方圖的例子。
直方圖橫座標:影象中各個畫素點的灰度級
直方圖縱座標:具有該灰度級的畫素個數
主要呼叫函式calcHist()實現:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
引數:
- hist表示直方圖,返回的是一個二維陣列
- images表示原始影象
- channels表示指定通道,通道編號需要用中括號括起,輸入影象是灰度影象時,它的值為[0],彩色影象則為[0]、[1]、[2],分別表示B、G、R
- mask表示掩碼影象,統計整副影象的直方圖,設為None,統計影象的某一部分直方圖時,需要掩碼影象
- histSize表示BINS的數量,引數子集的數目,如下圖當bins=3表示三個灰度級
- ranges表示畫素值範圍,例如[0, 255]
- accumulate表示累計疊加標識,預設為false,如果被設定為true,則直方圖在開始分配時不會被清零,該引數允許從多個物件中計算單個直方圖,或者用於實時更新直方圖;多個直方圖的累積結果用於對一組影象的直方圖計算
2.程式碼實現
首先計算影象灰度級的基本大小、形狀及內容。
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
src = cv2.imread('test01.jpg')
#引數:原影象 通道[0]-B 掩碼 BINS為256 畫素範圍0-255
hist = cv2.calcHist([src], [0], None, [256], [0,255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)
輸出結果如下所示:
下面是繪製影象的程式碼,首先補充一些matplotlib庫繪製影象程式碼,也推薦我的文章。
[Python資料探勘課程] 六.Numpy、Pandas和Matplotlib包基礎知識
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#繪製sin函式曲線
x1 = np.arange(0, 6, 0.1)
y1 = np.sin(x1)
plt.plot(x1, y1)
#繪製座標點折現
x2 = [0, 1, 2, 3, 4, 5, 6]
y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2]
plt.plot(x2, y2)
#省略有規則遞增的x2引數
y3 = [0, 0.5, 1.5, 2.4, 4.6, 8]
plt.plot(y3, color="r")
plt.show()
輸出結果有三條線,如下所示:
最後給出呼叫calcHist()計算B、G、R灰度級並繪製圖形的程式碼。
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
src = cv2.imread('test01.jpg')
histb = cv2.calcHist([src], [0], None, [256], [0,255])
histg = cv2.calcHist([src], [1], None, [256], [0,255])
histr = cv2.calcHist([src], [2], None, [256], [0,255])
cv2.imshow("src", src)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()
輸出結果如下圖所示:
希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵。最近經歷的事情太多,有喜有悲,關閉了朋友圈,希望通過不斷學習和寫文章來忘記煩勞,將憂鬱轉換為動力,每週學習都記錄下來。
(By:Eastmount 2018-11-06 早上12點 https://blog.csdn.net/Eastmount/)
相關文章
- Python 影像處理 OpenCV (16):影像直方圖PythonOpenCV直方圖
- OpenCV之影象直方圖均衡化OpenCV直方圖
- Matplotlib直方圖繪製技巧直方圖
- Python繪製直方圖 Pygal模擬擲骰子Python直方圖
- matplotlib的直方圖繪製(筆記)直方圖筆記
- 【R語言】繪製權重直方圖R語言直方圖
- 灰度直方圖均衡化及其實現直方圖
- 【影像處理】基於OpenCV實現影像直方圖的原理OpenCV直方圖
- Python批次繪製遙感影像資料的直方圖Python直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- OpenCV計算機視覺學習(9)——影像直方圖 & 直方圖均衡化OpenCV計算機視覺直方圖
- python如何畫直方圖Python直方圖
- 【Python_Demo_5】Python中條形重疊直方圖的繪製Python直方圖
- 直方圖學習直方圖
- 直方圖均衡化直方圖
- 影像演算法之直方圖均衡化(灰度影像)演算法直方圖
- halcon-直方圖均衡直方圖
- 直方圖中最大矩形直方圖
- 數字影像處理讀書筆記(三)直方圖匹配筆記直方圖
- Python批次讀取HDF多波段柵格資料並繪製像元直方圖Python直方圖
- elasticsearch 之 histogram 直方圖聚合ElasticsearchHistogram直方圖
- 【16位RAW影像處理三】直方圖均衡化及區域性直方圖均衡用於16點陣圖像的細節增強。直方圖
- Python按條件篩選、剔除表格資料並繪製剔除前後的直方圖Python直方圖
- 淺析MySQL 8.0直方圖原理MySql直方圖
- 【沃趣科技】直方圖系列1直方圖
- 你知道直方圖都能幹啥?直方圖
- 一文搞懂直方圖均衡直方圖
- [20221227]Adaptive Cursor Sharing & 直方圖.txtAPT直方圖
- 聊一聊MySQL的直方圖MySql直方圖
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- 直方圖均衡化原理與實現直方圖
- 一文搞懂 Prometheus 的直方圖Prometheus直方圖
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 5種方法教你用Python玩轉histogram直方圖PythonHistogram直方圖
- [20190630]如何確定直方圖型別.txt直方圖型別
- 【opencv學習筆記】027之直方圖反向投影 - calcBackProject函式詳解OpenCV筆記直方圖Project函式
- python資料視覺化-matplotlib入門(4)-條形圖和直方圖Python視覺化直方圖
- search(13)- elastic4s-histograms:聚合直方圖ASTHistogram直方圖