中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python?OpenCV圖像直方圖如何處理

發布時間:2022-06-28 14:13:36 來源:億速云 閱讀:214 作者:iii 欄目:開發技術

這篇“python OpenCV圖像直方圖如何處理”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python OpenCV圖像直方圖如何處理”文章吧。

1.圖像直方圖基本含義和繪制

首先我們先要了解一下python三大劍客之一——matplotlib
我們都知道matlab作為一個工具是公認的繪圖牛,但是我想說的是python下的matplotlib這個超級劍客也是非常厲害的,因為python近年來才火熱起來,所以熱度沒有matlib高,但是matlib可以實現的功能作為python都是差不多可以實現的。
我們回歸正題,先來介紹下matplotlib怎么簡單的畫一個直方圖。

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(0,5,0.1)
y=np.sim(x)
plt.plot(x,y)

簡單的不能再簡單了吧,我們使用它去繪制一個sin(x)的函數圖像。

python?OpenCV圖像直方圖如何處理

那么matplotlib如何和CV一起工作呢?

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\boatGray.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
plt.plot(histb,color='b')
plt.show()

結果是(也很好理解吧):

python?OpenCV圖像直方圖如何處理

針對于彩色圖像我們也可以針對BGR分別作圖。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\girl.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()

python?OpenCV圖像直方圖如何處理

直方圖的繪制我們使用的函數還有:函數hist
功能:根據數據源和像素級繪制直方圖。
語法: hist(數據源,像素級)
數據源:圖像,必須是一維數組。
像素級:一般是256,指[0,255]

python?OpenCV圖像直方圖如何處理

功能:將多維數組降為一維數組。格式:一維數組=多維數組.ravel()

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\boat.jpg")
cv2.imshow("o",o)
cv2.waitKey()
cv2.destroyAllWindows()
plt.hist(o.ravel(),256)

python?OpenCV圖像直方圖如何處理

2.OpenCV統計直方圖并繪制

使用OpenCV對圖像進行繪制的和橫坐標表示像素值比如[0,255],縱坐標表示像素值的個數。

繪制函數:

hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )

其中,hist返回結果是一個直方圖,返回的直方圖,是一個二維數組。
image原始圖像:圖像需要使用“[ ]”括起來使用。
channels:

通道編號需要用中括號括起來輸入圖像是灰度圖時,它的值是[0];彩色圖像可以是[0],[1],[2]。分別對應通道B,G,R。
mask:掩碼圖像統計整幅圖像的直方圖,設為None。統計圖像某一部分的直方圖時,需要掩碼圖像。
histSize
BINS的數量,例如【256】
ranges
像素值范圍RANGE
accumulate默認值為false。如果被設置為true,則直方圖在開始分配時不會被清零。該參數允許從多個對象中計算單個直方圖,或者用于實時更新直方圖。多個直方圖的累積結果,用于對一組圖像計算直方圖。

使用OpenCV畫出直方圖:

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\girl.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()

python?OpenCV圖像直方圖如何處理

3.使用掩碼的直方圖-直方圖、掩膜

python?OpenCV圖像直方圖如何處理

掩碼說實話就是使用掩膜的黑色部分把原始圖像的部分給覆蓋掉,也稱為過濾掉。那么我們怎么做呢?首先我們需要創建一個掩膜:

mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255

首先創建一個全0的和原圖像size一致的,然后我們把指定范圍指定為白色。然后傳入函數內:

import cv2
import numpy as np
import matplotlib.pyplot as plt
顯示直方圖
image=cv2.imread("image\\girl.bmp",cv2.IMREAD_GRAYSCALE)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
histMI=cv2.calcHist([image],[0],mask,[256],[0,255])
histImage=cv2.calcHist([image],[0],None,[256],[0,255])
plt.plot(histImage)
plt.plot(histMI)

結果是:

python?OpenCV圖像直方圖如何處理

掩膜原理:

python?OpenCV圖像直方圖如何處理

說實在的就是與和或的關系,與就是一個不行就都不行。或就是一個行就可以。

python?OpenCV圖像直方圖如何處理

而我們的掩膜原理主要用到的就是與操作;

python?OpenCV圖像直方圖如何處理

計算結果 = cv2.bitwise_and(圖像1,圖像2)

import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread("image\\boat.bmp",0)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
mi=cv2.bitwise_and(image,mask)
cv2.imshow('original',image)
cv2.imshow('mask',mask)
cv2.imshow('mi',mi)
cv2.waitKey()
cv2.destroyAllWindows()

python?OpenCV圖像直方圖如何處理

4.直方圖均衡化原理及函數

python?OpenCV圖像直方圖如何處理

在維基百科是這樣定義的:

python?OpenCV圖像直方圖如何處理

對應在圖像上就是:

python?OpenCV圖像直方圖如何處理

python?OpenCV圖像直方圖如何處理

前提:如果一幅圖像占有全部可能的灰度級,并且均勻分布。
結論:該圖像具有高對比度和多變的灰度色調。
外觀:圖像細節豐富,質量更高。

算法:

  • 1.計算累計直方圖

  • 2.將累計直方圖進行區間轉換

  • 3.在累計直方圖中,概率相近的原始值,會被處理為相同的值。

1.計算灰度級出現的概率情況

python?OpenCV圖像直方圖如何處理

????????:第K個灰度級
????????:第k級灰度的像素個數
N:圖像內總像素的個數
L:灰度級最大值,灰度值區間[0,L-1]
2.變換函數

python?OpenCV圖像直方圖如何處理

我們把公式表現在圖片上就是:

python?OpenCV圖像直方圖如何處理

python?OpenCV圖像直方圖如何處理

python?OpenCV圖像直方圖如何處理

這樣就完成了從原始圖像計算得到了均衡直方圖。

python?OpenCV圖像直方圖如何處理

雖然二者相似。但右側的分布更均衡,相鄰像素級概率和與高概率近似相等。可應用到醫療圖像處理,車牌識別,人臉識別。

python?OpenCV圖像直方圖如何處理

對應函數是:dst = cv2.equalizeHist( src )

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\equ.bmp',cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.hist(img.ravel(),256)
plt.figure()
plt.hist(equ.ravel(),256)

python?OpenCV圖像直方圖如何處理

我們處理一下lena,就是這樣:

python?OpenCV圖像直方圖如何處理

5.子圖的繪制

我們有的時候為了方便對比,會想要把幾個圖放在一張大圖中進行比較,那么我們怎么去做呢?有沒有一個函數可以完成這個操作呢。
subplot(nrows, ncols, plot_number)
nrows表示行數,ncols表示列數,plot_number表示第幾個。subplot(2,3,4)那么就表示2行三列,第四個圖。
當每一個參數都小于10時,可以直接書寫三個數字,表示為“subplot(234)

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\boatGray.bmp',cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.subplot(121),plt.hist(img.ravel(),256)
plt.subplot(122),plt.hist(equ.ravel(),256)

python?OpenCV圖像直方圖如何處理

imshow(X, cmap=None)
X表示要繪制的圖像,cmap表示colormap,顏色圖譜,默認為RGB(A)顏色空間。
灰度圖像 :colormap,顏色圖譜,默認為RGB(A)顏色空間使用參數cmap=plt.cm.gray
彩色圖像 :colormap,顏色圖譜,默認為RGB(A)顏色空間,如果使用opencv讀入的圖像,默認空間為BGR,需要調整色彩空間為RGB。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread('image\\girl.bmp')
g=cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
plt.subplot(221)
plt.imshow(o),plt.axis('off')
plt.subplot(222)
plt.imshow(o,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(223)
plt.imshow(g),plt.axis('off')
plt.subplot(224)
plt.imshow(g,cmap=plt.cm.gray),plt.axis('off')

python?OpenCV圖像直方圖如何處理

第一個圖是:彩色圖像,使用默認參數。
第二個圖是:彩色圖像,使用參數cmap=plt.cm.gray
第三個圖是:灰色圖像,使用默認參數
第四個圖是:灰色圖像,使用參數cmap=plt.cm.gray
那么只有第四個圖是正確的。

對于彩色圖像:

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\girl.bmp')
b,g,r=cv2.split(img)
img2=cv2.merge([r,g,b])
plt.subplot(121)
plt.imshow(img),plt.axis('off')
plt.subplot(122)
plt.imshow(img2),plt.axis('off')

必須要將BGR split然后merge成RGB才可以。

python?OpenCV圖像直方圖如何處理

6.直方圖均衡化對比

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\boat.bmp',cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.subplot(221)
plt.imshow(img,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(222)
plt.imshow(equ,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(223)
plt.hist(img.ravel(),256)
plt.subplot(224)
plt.hist(equ.ravel(),256)

python?OpenCV圖像直方圖如何處理

以上就是關于“python OpenCV圖像直方圖如何處理”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西林县| 上蔡县| 拉孜县| 新竹市| 远安县| 息烽县| 孟州市| 阳原县| 竹北市| 钦州市| 河东区| 招远市| 泾阳县| 通州市| 吉首市| 福泉市| 永济市| 怀宁县| 绵竹市| 文化| 凤台县| 武城县| 大足县| 松桃| 高雄市| 府谷县| 清涧县| 垫江县| 舞阳县| 满洲里市| 白城市| 阿城市| 浮梁县| 黔南| 河源市| 红原县| 手机| 平昌县| 青冈县| 天全县| 尖扎县|