[python opencv 計算機視覺零基礎到實戰] 十二 直方圖

一、學習目標

  1. 了解matplotlib繪圖庫的使用
  2. 了解如何通過折線圖或者直方圖對圖表進行繪制
  3. 了解了通過圖標對圖片內容進行直觀判斷

如有錯誤歡迎指出~

二、了解圖像直方圖及其應用

2.1 了解matplotlib庫

在了解圖像直方圖前我們需要了解一個matplotlib庫,matplotlib庫和numpy可謂是一對好伴侶,就像泡面伴侶火腿腸一樣。

matplotlib是一個繪圖庫,我們將通過matplotlib繪制圖像的直方圖。為什么圖像可以繪制直方圖呢?我們可以想一下,圖像是由一堆數據組成,既然是數據那就可以對這個圖像進行可視化的圖標操作。

首先,我們需要安裝matplotlib。使用pip工具可以直接安裝matplotlib。安裝命令為:

pip install matplotlib

安裝完matplotlib后,可以在python的交互窗口中對其進行引入,若沒問題那就肯定是安裝好了:

from matplotlib import pyplot as plt 


我們先簡單了解一下matplotlib 的使用方法,查看以下示例:

from matplotlib import pyplot as pltx = [0, 5, 8, 13]
y = [2, 1, 1, 3]print(x)
print(y)
plt.title("Matplotlib") 
plt.xlabel("x") 
plt.ylabel("y") 
plt.plot(x,y) 
plt.show()

首先引入進行引入,隨后定義了x和y兩個列表,這兩個列表對應的是折線圖中x和y的兩個繪制點,其中x列表是當前坐標系中x的值,y列表則表示y坐標系的值。x列表和y列表相互對應,x[0]與y[0]構成一個坐標點,如x[0]與y[0]則表示(0,2),依次下去則是(5,1)、(8,1);隨后使用plt.title設置折線圖標題,plt.xlabel設置x標簽、plt.ylabel設置y標簽,再繼續使用plot傳入x和y的值,最后使用show方法進行展示。結果如下:

以上是一個Matplotlib折線圖的基本用法,接下來我們開始正式的編寫有關圖像直方圖的內容。

2.2 繪制圖像直方圖

圖像直方圖表示了一張圖像像素的分布,對像素進行了統計,方便與直觀的以圖的形式對圖片進行分析。一般橫坐標表示圖像像素的不同值,或者說不同的種類,縱坐標則表示了每一種顏色的個數或者百分比。直方圖用這種表現方式顯示圖像的基本內容特征方便接下來對圖像進行進行下一步的操作。一般直方圖的表示是越靠近左側縱坐標則表示當前圖像的偏暗點數據分布,越靠近右側則表示圖像偏亮的像素點分布情況。

繪制圖像直方圖需要使用一個直方圖方法hist方法,我們一般使用前兩個參數;第一個參數為一維數組,第二個參數為需要多少個間隔。現在我們先讀取一張圖片:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)

隨后使用hist方法,使用hist方法時由于img是一個三通道的數據,那如何轉為一維數據呢?很簡單,有一個ravel方法很方便的對img數據進行轉變:

img.ravel()

隨后將該數據傳入至hist方法中:

plt.hist(img.ravel(), 256)

以上代碼中,256是表示一共分為256個數據去顯示其中的內容。最后添加show方法以及等待圖像關閉的代碼,完整代碼如下:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)plt.hist(img.ravel(), 256)
plt.show()cv2.waitKey (0)
cv2.destroyAllWindows()

運行代碼結果如下:
由于我們這張圖片是整體偏亮的,所以數據的分布都在右側,左側分布較少。這張圖片如下:
也可以把第二個參數改為100,這樣每次分段就是一半了:

plt.hist(img.ravel(), 100)

效果如下:
hist的第三個參數是統計范圍,你需要直方圖顯示哪個范圍內的數據,例如[0,100],這時就可以寫成:

plt.hist(img.ravel(), 100,[0,100])

運行結果如下:

左邊縱坐標數據則是個數,橫坐標x是0逐漸增大,也就構成了一種越靠近左側越黑,越靠近右側越亮的這一種分布情況。我們也可以將以上的0到100范圍改成0-256,這時即可恢復原樣:

plt.hist(img.ravel(), 256,[0,256])

2.3 3通道折線圖繪制

以上只繪制了一個完整圖像的直方圖,現在我們來試一下繪制3個通道RGB的直方圖圖像。
繪制3通道的折線圖使用一個方法可以很簡便的進行繪制,那就是calcHist,calcHist可以通過你給的通道數、灰度范圍、像素值范圍可以獲取圖像的通道信息,也可以加入mask遮罩提取圖像。
由于同一個直方圖或者折線圖中,使用同一種顏色繪制會分辨不清,我們可以通過三原色的紅綠藍分別繪制3跟不同顏色的線段進行表示。這里使用折線圖首先進行圖像繪制。
首先我們定義一個列表,存儲紅綠藍三原色字符串,方便之后的繪圖時傳入色彩:

color = ["blue", "green", "red"]

隨后使用一個for循環,不過需要將color傳入enumerate中,enumerate將會給予出兩個值,一個是下標一個是值,那么這個時候就需要有兩個變量接收,for循環可以寫成:

for i, v in enumerate(color):

隨后使用calcHist方法,并且傳入5個值:

hist = cv2.calcHist([img], [i], None, [256], [0, 256])

值必須使用方括號傳入,這是語法規定,若不使用你可能會出錯。第一個值img是圖像數據,第二個值i,由于每次都會循環作為下標,那么就是0、1、2、3這3個數據,這3個數據傳入到calcHist后將會拿出紅綠藍三個不同的通道值。第三位填入NONE,因為我們不需要遮罩。然后[256]是一個灰度的范圍空間,[0,256]表示像素的范圍值。這時每次循環hist都將會是不同通道的值內容,這個時候就可以使用plot進行折線畫圖,并且傳入顏色值,繪制不同顏色的線段:

plt.plot(hist, color=v)

組后show圖片,完整代碼如下:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)
color = ["blue", "green", "red"]
for i, v in enumerate(color):hist = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(hist, color=v)plt.show()
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:

該系列首發于ebaina

三、總結

  1. 了解matplotlib對折線圖、直方圖的繪圖方法
  2. 了解了matplotlib繪制的圖標左側偏暗右側偏亮的特性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

建造者模式之項目運用

1 問題 建造者模式,我們也許不陌生,因為我們看到很多開源框架或者Android源碼里面用到,類似這樣的代碼結構 A a new A.builder().method1("111").method2("222").build(); 很明顯,一般這里的結構有builde…

專題三--1005

題目 A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the …

shell中的數字

shell中的數字 author :headsen chen date :2017-10-18 15:01:42 個人原創,轉載請注明作者,出處,否則依法追究法律責任 1,生成隨機數(范圍:0-32767),用特殊變量:RANDOM 2&#xff…

serviceloader java_【java編程】ServiceLoader使用看這一篇就夠了

轉載:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少聽過spi,具體的解釋我就不多說了。但是它具體是怎么實現的呢?它的原理是什么呢?下面我就圍繞這兩個問題來解釋:實現: 其實具體的實現類就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改進

在MiniAPI系列中,《.NET6之MiniAPI(十八):OpenAPI swagger》介紹了swagger在MiniAPI框架中的使用,當時留下很多不足,隨著.NET7 Preview4的推出,這方面得到了很大的改進,我還是使用“十八”這篇文章的案例。…

Swift - 自定義單元格實現微信聊天界面

1,下面是一個放微信聊天界面的消息展示列表,實現的功能有: (1)消息可以是文本消息也可以是圖片消息(2)消息背景為氣泡狀圖片,同時消息氣泡可根據內容自適應大小(3&#x…

[python opencv 計算機視覺零基礎到實戰] 十三 直方圖顏色提鮮

一、學習目標 了解了均衡化的作用是什么了解灰度、YUV、彩色圖片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分離通道的方法是什么 如有錯誤歡迎指出~ 二、了解圖像均衡化 2.1 了解直方圖均衡化 圖像直方圖均衡化主要是對圖像中的少數灰度進行壓縮&#…

java 中字符串比較方法_java中常用的字符串的比較方法(兩種)

比較字符串比較常用的兩個方法是運算符“”和String的equals方法。使用“”比較兩個字符串,是比較兩個對象的的“地址”是否一致,本質就是判斷兩個變量是否指向同一個對象,如果是則返回true,否則返回的是false。而String類的equal…

Android之稍微靠譜點的透明Activity(不獲取觸摸事件)

1 問題 實現透明的Activity(不獲取觸摸事件),就行什么也看不到,打開了透明activity,也不影響其他頁面的滑動和點擊,就行什么事情都沒發生一樣。 2 代碼實現 1)配置樣式 <style name="TestTheme" parent="Theme.AppCompat.Light"><item na…

分布式服務框架dubbo原理解析 轉

alibaba有好幾個分布式框架&#xff0c;主要有&#xff1a;進行遠程調用(類似于RMI的這種遠程調用)的(dubbo、hsf)&#xff0c;jms消息服務(napoli、notify)&#xff0c;KV數據庫(tair)等。這個框架/工具/產品在實現的時候&#xff0c;都考慮到了容災&#xff0c;擴展&#xff…

【傾情奉獻】遙感物候研究:30年長時間序列遙感數據集GIMMS 3g NDVI產品預處理完整步驟

本文為作者碩士學位論文遙感物候研究數據處理過程總結。GIMMS(Global Inventory Modelling and Mapping Studies) 3g NDVI來源于ECOCAST網站(http://ecocast.arc.nasa.gov),是由NOAA衛星搭載的AVHRR傳感器獲取的全球植被數據,空間分辨率為0.0833?,時間分辨率為15?d,一…

過早的給方法中 引用對象 設為 null 可被 GC提前回收嗎?

經常在代碼中看到有人將 null 賦值給引用類型&#xff0c;來達到讓 GC 提前回收的目的&#xff0c;這樣做真的有用嗎&#xff1f;今天我們就來研究一下。為了方便講解&#xff0c;來一段測試代碼&#xff0c;提前將 test1null &#xff0c;然后調用 GC.Collect() 看看是否能提前…

[python opencv 計算機視覺零基礎到實戰] 十五 直方圖反向投影

一、學習目標 了解了直方圖反向投影的一般流程了解2D直方圖的使用 如有錯誤歡迎指出~ 二、了解直方圖反向投影 2.1 了解2D直方圖 需要對直方圖進行反向投影&#xff0c;需要使用2D直方圖。2D直方圖需要使用calcHist方法。calcHist方法在前兩節中已經有了解&#xff0c;現在…

關聯規則java代碼_重量挖掘關聯規則挖掘方法,哪個大神可以將以下偽代碼轉換為Java代碼?...

重量挖掘關聯規則挖掘方法&#xff0c;哪個大神可以將以下偽代碼轉換為Java代碼&#xff1f; 10改進的加權關聯規則算法的基本步驟與Apriori算法相似: 首先找到加權支持度不小于用戶指定的最小加權支持度的所有頻繁項集加權關聯規則&#xff0c;然后使用頻繁項集生成所有滿足最…

Boostrap ZURB Foundation —— Web開發前端框架

webflow&#xff1a;Webflow 允許設計師通過自由的拖拉拽與 CSS 類互動&#xff0c;而定義它們的過程無需寫任何一行代碼。用戶在完成從設計到 CSS 構架之后&#xff0c;甚至可以在線直接將建好的網頁發布&#xff0c;而不需要導出代碼到其他發布工具上。類似的這些 B2D 市場&a…

Git之HEAD和origin

1 問題 我們經常看見git相關操作里面看到HEAD和origin這些專業名稱&#xff0c;它娘的到底什么意思。 2 解釋 1&#xff09;HEAD git 中的分支&#xff0c;本質上僅僅是個指向 commit 對象的可變指針&#xff0c; HEAD 是一個特別指針&#xff0c;它是一個指向你正在工作中的…

如何離線安裝chrome插件

如何離線安裝chrome插件 本文轉自Work Hard Work Smart博客園博客&#xff0c;原文鏈接&#xff1a;http://www.cnblogs.com/linlf03/p/6838852.html&#xff0c;如需轉載請自行聯系原作者

多種語言《九九乘法表》薈萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表對于我們學習循環結構,尤其是雙重循環特別有幫助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多種語九九乘法表。 一、C語言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

Git之刪除遠程分支

1 問題 在工作區間刪除遠程分支 2 刪除命令 git push origin --delete name