17-直方圖

直方圖

何為直方圖?沒那么高大上,其實就是二維統計圖。每個照片都是有像素點所組成,當然也是[0,255],直方圖就是統計每個值所對應的像素點有幾個。
直方圖橫坐標表示0-255這些像素點值;縱坐標表示對應像素點值的個數有多少個,例如:像素為55的像素點有多少個
cv2.calcHist(images,channels,mask,histSize,ranges)
cv2.calcHist([img],[0],None,[256],[0,256])

參數一:images:原圖像格式為uint8或float32;當傳入函數時應該用中括號括住,通常情況下都是輸入的是灰度圖
參數二:同樣用中括號括起來,它會告訴函數我們圖像的直方圖;如果輸入圖像時灰度圖它的值就是[0];如果時彩色圖像傳入的參數可以是[0][1][2],分別對應BGR
參數三:掩模圖像,說白了就是取部分圖像而已;統計整個圖像的直方圖時就把它設置為None;當然也可以通過掩模來統計圖像的某部分的直方圖
參數四:BIN的數目,也就是橫坐標的總量程而已,一般都是256,也就是0-255這256個像素點值,也需要用中括號括起來
參數五:像素值的范圍,一般設置為[0,256]
import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)#這里的參數0表示以灰度圖進行讀取
hist = cv2.calcHist([img],[0],None,[256],[0,256])#當然由于是灰度圖通道數也只有一個即參數二[0];參數三None表示沒有使用掩模直接輸出整體圖像的直方圖;參數四[256]直方圖的橫坐標量程;參數五[0,256]像素值的范圍
hist.shape#結果為:(256, 1) 其中256表示這個圖像中有0-255這256個取值,1表示得到的直方圖是二維的,即每個像素出現多少個plt.hist(img.ravel(),256)
plt.show()img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png')#第二個參數不填表示原圖輸入,這個圖像為彩色圖也就是彩色圖輸入
color = ('b','g','r')
for i,col in enumerate(color):#枚舉格式遍歷每個顏色通道histr = cv2.calcHist([img],[i],None,[256],[0,256])plt.plot(histr,color = col)plt.xlim([0,256])
plt.show()

原圖:
在這里插入圖片描述
原圖對應的灰度圖的直方圖:
在這里插入圖片描述
原圖的BGR直方圖:
在這里插入圖片描述

掩模mask

np.zeros(img.shape[:2],np.uint8)
上面的函數中有掩模的操作,接下來介紹一下掩模mask的定義的操作

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#創建mast,掩模是由黑白兩部分組成的,然后與原圖重疊,掩模白色區域對應原圖區域不變,黑色區域對應原圖區域變黑
mask = np.zeros(img.shape[:2],np.uint8)#這里面的掩碼實際上就是邊緣黑中間白,此時的mask就和原圖片大小相同,uint8表示無符號八位整數0-255之間
print(mask.shape)#結果為:(321, 287)
mask[50:200,50:200] = 255#要保存的東西是白色的,白色區域為要保存的地方,所以將選取地方置為255
show_photo('mask',mask)img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)#灰度圖讀取照片
print(img.shape)#結果為:(321, 287)
show_photo('img',img)masked_img = cv2.bitwise_and(img,img,mask=mask)#與操作,也就是有0則0,黑色為0所以說掩碼黑色地區都為黑;參數一表示原圖像,參數三表示掩模圖像
show_photo('masked_img',masked_img)hist_full = cv2.calcHist([img],[0],None,[256],[0,256])#不帶掩模的圖像進行統計直方圖
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])#帶掩模mask的時候統計圖像的部分掩模區域的直方圖plt.subplot(221),plt.imshow(img,'gray')
plt.subplot(222),plt.imshow(mask,'gray')
plt.subplot(223),plt.imshow(masked_img,'gray')
plt.subplot(224),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

掩模圖像:
在這里插入圖片描述
原圖:
在這里插入圖片描述
掩模操作后的圖像:
在這里插入圖片描述
上一:原圖
上二:自定義的掩模
下一:掩模對應的原圖部分
下二:藍線對應原圖的直方圖,橙線對應掩模處理的部分原圖的直方圖
在這里插入圖片描述

直方圖均衡化

假設某圖片部分像素值為:

25512820050
5020025550
255200128128
20020025550

下面表格中的函數映射中(255-0)表示設置的橫軸的量程這里設置的是0-255

灰度值像素個數概率累積概率根據函數映射后灰度值取整
5044/16 = 0.250.250.25*(255-0)=63.7564
12833/16 = 0.18750.25+0.1875=0.43750.4375*(255-0)=111.5625112
20055/16 = 0.31250.25+0.1875+0.3125=0.750.75*(255-0)=191.25191
25544/16 = 0.250.25+0.1875+0.3125+0.25=11*(255-0)=255255

均衡化后的像素值為:

25511219164
6419125564
255191112112
192191255255

均衡化之后發現了這16個數相差的并不是特別大了

cv2.equalizeHist(img)
傳入圖像對象名稱即可進行整體均衡化

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/people.jpg',0)
plt.hist(img.ravel(),256)#原圖像的直方圖
plt.show()equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)#均衡化后的直方圖
plt.show()res = np.hstack((img,equ))
show_photo('img_equ',res)#顯示原圖和均衡化后的圖片

原圖直方圖:
在這里插入圖片描述
均衡化后的直方圖:
在這里插入圖片描述
原圖和均衡化后的圖片對比:
在這里插入圖片描述

均衡化后的圖像臉上的細節變得更加模糊了,尷尬不???
這時候就需要自定義均衡化

自定義均衡化

直方圖的均衡化也就是整體的均衡化,其他像素點值大的地方給平均給其他地方了導致一下細節會丟失
若將原圖分成塊進行均衡化,每塊進行自己塊的均衡化效果會比全局整體均衡化更好些
當然,若圖像里面噪音太大,局部反而沒有整體均衡化好,需要自己事先去衡量一下
cv2.createCLAHE(clipLimit = 2.0,tileGridSize = (8,8))
(8,8)表示分塊均衡化中塊的大小

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/people.jpg',0)
plt.hist(img.ravel(),256)#原圖像的直方圖equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)#均衡化后的直方圖clahe = cv2.createCLAHE(clipLimit = 2.0,tileGridSize = (8,8))#自定義均衡化,每8*8分成塊,按塊進行均衡化
res_clahe = clahe.apply(img)res = np.hstack((img,equ,res_clahe))
show_photo('img_equ_clahe',res)

原圖-整體均衡化-自定義均衡化
在這里插入圖片描述

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

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

相關文章

java求水電費_java水電費管理系統

每天記錄學習,每天會有好心情。*^_^*今天和一個朋友共同完成了一個基于web的java水電費管理系統項目,我們在開發時選用的框架是SSM(MYECLIPSE)框架。我這個朋友知識有限,只會這個框架,哈哈,都是為了方便他。和往常一樣…

zemax微透鏡陣列示例_陣列反向! Ruby中的示例方法

zemax微透鏡陣列示例陣列反向! 方法 (Array reverse! Method) In this article, we will study about Array.reverse! method. You all must be thinking the method must be doing something related to reversing certain elements as we have done in the case o…

Opencv實戰【1】人臉檢測并對ROI區域進行部分處理(變身喬碧蘿!!!)

步驟: 1、利用Opencv自帶的分類器檢測人臉 預備知識:Haar特征分類器 Haar特征分類器就是一個XML文件,該文件中會描述人體各個部位的Haar特征值。包括人臉、眼睛、嘴唇等等。 Haar特征分類器存放地址: (找自己的安裝…

【黑馬甄選離線數倉day10_會員主題域開發_DWS和ADS層】

day10_會員主題域開發 會員主題_DWS和ADS層 DWS層開發 門店會員分類天表: 維度指標: 指標:新增注冊會員數、累計注冊會員數、新增消費會員數、累計消費會員數、新增復購會員數、累計復購會員數、活躍會員數、沉睡會員數、會員消費金額 維度: 時間維度&#xff08…

iPad和iPhone的app圖標尺寸、用途、設置方法

下面是在iPhone專用程序、iPad專用程序和通用程序中使用圖標文件的指導,由譯言網翻譯自蘋果官方文檔。原文 http://article.yeeyan.org/view/395/100567 注意:圖標是你的程序包所必需的組成部分。如果你沒有提供程 序所需的各種尺寸的圖標,系…

18-傅里葉變化

以時間為參照就是時域分析,當然時間是動態變化的 而傅里葉變換是以頻域為基準的,不用關心動態變化,只關心做了多少次而已,次數,頻率 傅里葉說過,任何一個周期函數都可以用正弦函數堆疊起來形成。強吧&#…

java中訪問修飾符_Java中的非訪問修飾符是什么?

java中訪問修飾符Java非訪問修飾符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name of these non-access modifiers are given below, Java中有7個非訪問修飾符 。 這些非訪問修飾符的名稱如下所示: native 本機 synchronized 已同…

mui實現分享功能_MUI 分享功能(微信、QQ 、朋友圈)

配置文件:manifest.jsonplus ->plugins 下邊"share": {/*配置應用使用分享功能,參考http://ask.dcloud.net.cn/article/27*/"qq": {"appid": "",/*騰訊QQ開放平臺申請應用的AppID值*/"description"…

Java 注解學習筆記

轉自:http://wanqiufeng.blog.51cto.com/409430/458883 一、什么是java注解 注解,顧名思義,注解,就是對某一事物進行添加注釋說明,會存放一些信息,這些信息可能對以后某個時段來說是很有用處的。 Java注解又叫java標注…

Prime Palindromes

博客園速度非常不穩定,可能要考慮換地方了。雖然我非常喜歡博客園的模板和氣氛。 這個題早就知道是怎么做的了。先求出回文數在再判斷是不是素數。關鍵是不知道區間,那就把所有的全部求出來。雖然可能會超時,但是如果使用點技巧的話還是沒問題…

Opencv——DFT變換(實現兩個Mat的卷積以及顯示Mat的頻域圖像)

DFT原理:(單變量離散傅里葉變換) 數學基礎: 任何一個函數都可以轉換成無數個正弦和余弦函數的和的形式。 通常觀察傅里葉變換后的頻域函數可以獲得兩個重要的信息:幅頻曲線和相頻曲線。 在數字圖像處理中的作用&#…

python方法items_Python字典items()方法與示例

python方法items字典items()方法 (Dictionary items() Method) items() method is used to get the all items as a view object, the view object represents the key-value pair of the dictionary. items()方法用于獲取所有項目作為視圖對象,該視圖對象表示字典的…

基于(Python下的OpenCV)圖像處理的噴墨墨滴形狀規范檢測

通過圖像處理,分析數碼印花的噴頭所噴出來的墨滴形狀,與標準墨滴形狀對比分析,來判斷墨水及其噴頭設備的狀態,由兩部分構成 PS:獲取墨滴形狀照片和標準墨滴形狀照片都是手繪的,將就的看吧,主要…

const_iterator,const 迭代器

const 迭代器:是迭代器產量,該迭代器的值不能被修改,且需要初始化,初始化之后不能指向其他元素。const_iterator:當我們對const_iterator類型解引用時,返回一個const值,所以只能讀,不能寫。它是一種迭代器…

臨時禁止令:諾西購摩托羅拉面臨流產窘境?

近日,美國伊利諾伊州北區法院就中國華為起訴摩托羅拉公司和諾西一案作出初步裁決,禁止摩托羅拉解決方案公司(Motorola Solutions)向諾西披露華為的機密資料。此判決一出,各方評論紛沓而來。筆者認為,從諾西12以美元并購摩托羅拉部…

mysql replace into 語法_mysql Replace into與Insert update

Replace intoreplace into 跟 insert 功能類似,不同點在于:replace into 首先嘗試插入數據到表中,1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。2. 否則,直接插入新數…

微機原理——指令系統——傳送類指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176 傳送類指令1&…

lastindexof方法_Java Vector lastIndexOf()方法與示例

lastindexof方法向量類別的lastIndexOf()方法 (Vector Class lastIndexOf() method) Syntax: 句法: public int lastIndexOf (Object ob);public int lastIndexOf (Object ob, int indices);lastIndexOf() method is available in java.util package. lastIndexOf(…

李開復:微博的價值在哪里

導讀:微博可以改變社會現象,可以傳播信息,可以幫助你成長,可以發出你的聲音。它讓我們能夠人人成為記者,讓每一個轉發的人都變成了一個編輯 很多人問微博是搶了誰的生意,開心網還是人人網?其實它…

mysql 任務計劃 /etc/cron.d_Linux /etc/cron.d增加定時任務

一般情況下我們添加計劃任務時,都是直接修改/etc/crontab。但是,不建議這樣做,/etc/cron.d目錄就是為了分項目設置計劃任務而創建的。例如,增加一項定時的備份任務,我們可以這樣處理:在/etc/cron.d目錄下新…