最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?OpenCV圖像直方圖處理

 更新時(shí)間:2022年06月27日 16:51:31   作者:吃貓的魚python  
這篇文章主要介紹了python?OpenCV圖像直方圖處理,文章通過(guò)matplotlib畫一個(gè)直方圖展開詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

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

首先我們先要了解一下python三大劍客之一——matplotlib
我們都知道m(xù)atlab作為一個(gè)工具是公認(rèn)的繪圖牛,但是我想說(shuō)的是python下的matplotlib這個(gè)超級(jí)劍客也是非常厲害的,因?yàn)閜ython近年來(lái)才火熱起來(lái),所以熱度沒(méi)有matlib高,但是matlib可以實(shí)現(xiàn)的功能作為python都是差不多可以實(shí)現(xiàn)的。
我們回歸正題,先來(lái)介紹下matplotlib怎么簡(jiǎn)單的畫一個(gè)直方圖。

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

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

那么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()

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

針對(duì)于彩色圖像我們也可以針對(duì)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()

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

功能:將多維數(shù)組降為一維數(shù)組。格式:一維數(shù)組=多維數(shù)組.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)

2.OpenCV統(tǒng)計(jì)直方圖并繪制

使用OpenCV對(duì)圖像進(jìn)行繪制的和橫坐標(biāo)表示像素值比如[0,255],縱坐標(biāo)表示像素值的個(gè)數(shù)。

繪制函數(shù):

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

其中,hist返回結(jié)果是一個(gè)直方圖,返回的直方圖,是一個(gè)二維數(shù)組。
image原始圖像:圖像需要使用“[ ]”括起來(lái)使用。
channels:

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

使用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()

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

掩碼說(shuō)實(shí)話就是使用掩膜的黑色部分把原始圖像的部分給覆蓋掉,也稱為過(guò)濾掉。那么我們?cè)趺醋瞿??首先我們需要?jiǎng)?chuàng)建一個(gè)掩膜:

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

首先創(chuàng)建一個(gè)全0的和原圖像size一致的,然后我們把指定范圍指定為白色。然后傳入函數(shù)內(nèi):

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)

結(jié)果是:

掩膜原理:

說(shuō)實(shí)在的就是與和或的關(guān)系,與就是一個(gè)不行就都不行?;蚓褪且粋€(gè)行就可以。

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

計(jì)算結(jié)果 = 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()

4.直方圖均衡化原理及函數(shù)

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

對(duì)應(yīng)在圖像上就是:

前提:如果一幅圖像占有全部可能的灰度級(jí),并且均勻分布。
結(jié)論:該圖像具有高對(duì)比度和多變的灰度色調(diào)。
外觀:圖像細(xì)節(jié)豐富,質(zhì)量更高。

算法:

  • 1.計(jì)算累計(jì)直方圖
  • 2.將累計(jì)直方圖進(jìn)行區(qū)間轉(zhuǎn)換
  • 3.在累計(jì)直方圖中,概率相近的原始值,會(huì)被處理為相同的值。

1.計(jì)算灰度級(jí)出現(xiàn)的概率情況

????:第K個(gè)灰度級(jí)
????:第k級(jí)灰度的像素個(gè)數(shù)
N:圖像內(nèi)總像素的個(gè)數(shù)
L:灰度級(jí)最大值,灰度值區(qū)間[0,L-1]
2.變換函數(shù)

我們把公式表現(xiàn)在圖片上就是:

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

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

對(duì)應(yīng)函數(shù)是: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)

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

5.子圖的繪制

我們有的時(shí)候?yàn)榱朔奖銓?duì)比,會(huì)想要把幾個(gè)圖放在一張大圖中進(jìn)行比較,那么我們?cè)趺慈プ瞿??有沒(méi)有一個(gè)函數(shù)可以完成這個(gè)操作呢。
subplot(nrows, ncols, plot_number)
nrows表示行數(shù),ncols表示列數(shù),plot_number表示第幾個(gè)。subplot(2,3,4)那么就表示2行三列,第四個(gè)圖。
當(dāng)每一個(gè)參數(shù)都小于10時(shí),可以直接書寫三個(gè)數(shù)字,表示為“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)

imshow(X, cmap=None)
X表示要繪制的圖像,cmap表示colormap,顏色圖譜,默認(rèn)為RGB(A)顏色空間。
灰度圖像 :colormap,顏色圖譜,默認(rèn)為RGB(A)顏色空間使用參數(shù)cmap=plt.cm.gray
彩色圖像 :colormap,顏色圖譜,默認(rèn)為RGB(A)顏色空間,如果使用opencv讀入的圖像,默認(rèn)空間為BGR,需要調(diào)整色彩空間為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')

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

對(duì)于彩色圖像:

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才可以。

6.直方圖均衡化對(duì)比

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)

到此這篇關(guān)于python OpenCV圖像直方圖處理的文章就介紹到這了,更多相關(guān) python OpenCV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

武穴市| 玛纳斯县| 同仁县| 阳高县| 克山县| 牙克石市| 调兵山市| 盈江县| 恩施市| 左云县| 义马市| 德江县| 海兴县| 淮阳县| 错那县| 大名县| 莱阳市| 定日县| 汾西县| 富阳市| 噶尔县| 桓仁| 桂阳县| 湟源县| 南昌县| 宜阳县| 乐业县| 阳朔县| 嘉义县| 密云县| 修水县| 博爱县| 乌兰察布市| 九江县| 固镇县| 平江县| 新邵县| 遂昌县| 灵丘县| 景泰县| 阳曲县|