版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
OpenCV計(jì)算機(jī)視覺(jué)處理Computervisionprocessing模塊七
直方圖與匹配模塊概述圖像直方圖,作為一種統(tǒng)計(jì)工具,能夠直觀地展示圖像中像素值的分布情況。通過(guò)直方圖,我們可以迅速了解圖像的亮度、對(duì)比度等基本信息,進(jìn)而對(duì)圖像進(jìn)行預(yù)處理或優(yōu)化。圖像匹配技術(shù)則是計(jì)算機(jī)視覺(jué)中的另一項(xiàng)核心技術(shù)。通過(guò)比較不同圖像之間的相似度,我們可以實(shí)現(xiàn)圖像檢索、目標(biāo)定位等功能。在本章中,我們將深入探討基于OpenCV的圖像直方圖與匹配技術(shù)。重點(diǎn)講解圖像匹配的基本原理和常用算法,并通過(guò)實(shí)際案例展示如何在OpenCV中實(shí)現(xiàn)這些算法。圖像直方圖與匹配技術(shù)不僅是計(jì)算機(jī)視覺(jué)領(lǐng)域的重要工具,更是現(xiàn)代科技與社會(huì)發(fā)展緊密結(jié)合的生動(dòng)體現(xiàn)。通過(guò)學(xué)習(xí)和應(yīng)用這些技術(shù),我們不僅能夠提升圖像處理與分析的能力,還能夠培養(yǎng)創(chuàng)新精神和科學(xué)思維。同時(shí),掌握這些技術(shù)也有助于我們更好地服務(wù)于社會(huì),推動(dòng)科技進(jìn)步與文明發(fā)展。學(xué)習(xí)導(dǎo)航學(xué)習(xí)目標(biāo)1.知識(shí)目標(biāo)(1)理解直方圖的概念及其在圖像數(shù)據(jù)分析和可視化中的作用;(2)掌握直方圖的基本繪制方法,并能從直方圖中提取和分析數(shù)據(jù)特征;(3)理解直方圖均衡化的原理,并知道其在圖像增強(qiáng)中的應(yīng)用;(4)了解模板匹配的基本原理,以及其在圖像處理中的應(yīng)用場(chǎng)景;(5)掌握單模板匹配與多模板匹配的基本實(shí)現(xiàn)方法。學(xué)習(xí)目標(biāo)2.能力目標(biāo)(1)能夠使用編程工具(如Python等)繪制和分析圖像的直方圖;(2)實(shí)現(xiàn)直方圖均衡化,對(duì)圖像進(jìn)行基本的增強(qiáng)處理;(3)利用模板匹配技術(shù)在目標(biāo)圖像中查找匹配區(qū)域;(4)根據(jù)實(shí)際需求選擇合適的直方圖處理方法和模板匹配策略;(5)能夠?qū)D像匹配結(jié)果進(jìn)行簡(jiǎn)單的分析和評(píng)估。學(xué)習(xí)目標(biāo)3.素質(zhì)目標(biāo)(1)培養(yǎng)對(duì)圖像數(shù)據(jù)分析和可視化的興趣,提升解決實(shí)際問(wèn)題的能力;(2)增強(qiáng)對(duì)圖像增強(qiáng)技術(shù)的理解,提高圖像處理的技能;(3)激發(fā)對(duì)圖像匹配技術(shù)的探索精神,培養(yǎng)創(chuàng)新思維。任務(wù)一直方圖的繪制任務(wù)導(dǎo)入假設(shè)有一組圖像數(shù)據(jù),每張圖像都是高維的像素點(diǎn)集合,包含了大量的信息。為了更有效地分析這些圖像數(shù)據(jù),通常需要對(duì)其進(jìn)行降維處理,將高維的圖像數(shù)據(jù)轉(zhuǎn)換為低維的特征表示。降維不僅有助于減少數(shù)據(jù)存儲(chǔ)和計(jì)算的復(fù)雜性,還能揭示數(shù)據(jù)中的潛在結(jié)構(gòu)和關(guān)系。完成降維后,可以進(jìn)一步利用直方圖來(lái)展示降維后數(shù)據(jù)的分布情況。直方圖是一種常用的數(shù)據(jù)可視化工具,通過(guò)繪制數(shù)據(jù)的頻數(shù)或頻率分布,可以直觀地了解數(shù)據(jù)的集中趨勢(shì)、離散程度以及是否存在異常值等信息。案例代碼1.#第一步:導(dǎo)入
OpenCV
庫(kù)與
matplotlib.pyplot
庫(kù)并讀取圖片。代碼如下:
2.import
cv2
3.import
matplotlib.pyplot
as
plt
4.#第二步:讀取圖片
5.image
=
cv2.imread("view.jpg")
6.#第三步:將圖片的二維數(shù)組降維成一維數(shù)組,代碼如下:
7.r_image
=
image.ravel()
8.#第四步:使用直方圖繪制圖片的像素信息并將其顯示出來(lái),代碼如下:
9.plt.hist(r_image,
256)
10.plt.show()
#運(yùn)行上述代碼后,我們就可以得到如圖
2
所示的直方圖圖片。其中,這張圖片的灰度級(jí)被劃分成
256
組,即將灰度級(jí)劃分為
16
個(gè)子集案例結(jié)果原始圖像圖像(灰度)的直方圖知識(shí)拆解1.圖像降維(1)算法介紹圖像降維是指將高維的圖像數(shù)據(jù)轉(zhuǎn)換到低維空間,以便簡(jiǎn)化數(shù)據(jù)處理和分析的過(guò)程。在OpenCV中,圖像降維通常指的是將彩色圖像轉(zhuǎn)換為灰度圖像,因?yàn)榛叶葓D像只有一個(gè)通道,而彩色圖像通常有多個(gè)通道(如RGB圖像有三個(gè)通道)。將彩色圖像轉(zhuǎn)換為灰度圖像通常使用加權(quán)平均法。該方法根據(jù)人眼對(duì)不同顏色的敏感度,為RGB三個(gè)通道分配不同的權(quán)重,然后計(jì)算加權(quán)平均值作為灰度值。在OpenCV中,默認(rèn)的權(quán)重是:紅色0.299,綠色0.587,藍(lán)色0.114。(2)函數(shù)介紹OpenCV提供了cv2.cvtColor()函數(shù)來(lái)實(shí)現(xiàn)圖像的降維。知識(shí)拆解(3)函數(shù)語(yǔ)法格式cv2.cvtColor(src,code[,dst[,dstCn]])(4)函數(shù)參數(shù)介紹src:輸入圖像,可以是彩色圖像。code:轉(zhuǎn)換類型。對(duì)于將彩色圖像轉(zhuǎn)換為灰度圖像,通常使用cv2.COLOR_BGR2GRAY(如果圖像是BGR格式)或cv2.COLOR_RGB2GRAY(如果圖像是RGB格式)。dst:輸出圖像,與src具有相同的大小和深度。dstCn:目標(biāo)圖像的通道數(shù)。這個(gè)參數(shù)是可選的,通常不需要設(shè)置。知識(shí)拆解2.直方圖繪制(1)算法介紹圖像的直方圖是一種重要的圖像處理工具,它表示了圖像中像素值的分布。簡(jiǎn)單來(lái)說(shuō),圖像直方圖統(tǒng)計(jì)了圖像中不同像素值(或灰度級(jí))出現(xiàn)的次數(shù)或頻率。對(duì)于一幅數(shù)字圖像,其直方圖的定義是一個(gè)離散函數(shù)。在這個(gè)函數(shù)中,每一個(gè)可能的像素值(或灰度級(jí))都對(duì)應(yīng)一個(gè)數(shù),這個(gè)數(shù)表示該像素值在圖像中出現(xiàn)的次數(shù)或頻率。例如,在8位灰度圖像中,有256個(gè)可能的灰度級(jí)(從0到255),直方圖就會(huì)統(tǒng)計(jì)這256個(gè)灰度級(jí)各自在圖像中出現(xiàn)的次數(shù)。圖像的直方圖統(tǒng)計(jì)有助于我們了解圖像的亮度分布、對(duì)比度等特性。例如,如果圖像的直方圖大部分像素值都集中在較暗或較亮的區(qū)域,那么圖像可能對(duì)比度較低,看起來(lái)較為模糊。知識(shí)拆解繪制圖像直方圖的方法通常如下:1)遍歷圖像的每一個(gè)像素,統(tǒng)計(jì)每個(gè)像素值(或灰度級(jí))出現(xiàn)的次數(shù)。2)使用統(tǒng)計(jì)結(jié)果作為縱坐標(biāo),像素值(或灰度級(jí))作為橫坐標(biāo),繪制直方圖。如果采用歸一化的直方圖,則縱坐標(biāo)表示的是像素值出現(xiàn)的頻率,而不是次數(shù)。在實(shí)際應(yīng)用中,圖像直方圖具有許多優(yōu)點(diǎn),如計(jì)算代價(jià)較小、具有圖像平移、旋轉(zhuǎn)、縮放不變性等。它被廣泛地應(yīng)用于圖像處理的各個(gè)領(lǐng)域,特別是灰度圖像的閾值分割、基于顏色的圖像檢索以及圖像分類等。通過(guò)繪制和分析圖像的直方圖,我們可以更好地理解圖像的特性和分布,從而進(jìn)行更有效的圖像處理和分析。(2)函數(shù)介紹OpenCV提供了cv2.calcHist()函數(shù)來(lái)計(jì)算圖像的直方圖,并使用matplotlib庫(kù)中的plt.hist()、plt.plot()和plt.show()函數(shù)來(lái)繪制直方圖。知識(shí)拆解(3)函數(shù)語(yǔ)法格式及參數(shù)介紹1)cv2.calcHist()函數(shù)語(yǔ)法格式:cv2.calcHist([images],channels,mask,histSize,ranges,[hist[,accumulate]])參數(shù)介紹:images:源圖像的列表。它應(yīng)該是一個(gè)圖像數(shù)組,其中可以使用多個(gè)圖像。圖像應(yīng)該具有相同的深度和大小。channels:用于計(jì)算直方圖的通道列表。例如,如果輸入是灰度圖像,它的通道將是[0]。對(duì)于彩色圖像,它可以傳遞[0],[1]或[2]分別計(jì)算藍(lán)色、綠色或紅色通道的直方圖。知識(shí)拆解mask:可選的掩碼。如果指定了掩碼,則函數(shù)僅計(jì)算掩碼非零元素定義的區(qū)域的直方圖。histSize:每個(gè)維度的大小。ranges:表示每個(gè)維度的可能值范圍的列表。例如,對(duì)于8位單通道圖像,范圍是[0,256]。hist:輸出直方圖,是一個(gè)數(shù)組。accumulate:可選的布爾值。如果為True,則直方圖被累加到hist中,而不是重新計(jì)算。知識(shí)拆解2)plt.hist()函數(shù)語(yǔ)法格式:plt.hist(hist.ravel(),bins=256,range=[0,256])參數(shù)介紹:hist.ravel():將直方圖數(shù)組轉(zhuǎn)換為一維數(shù)組,以便繪制。bins:直方圖的條形數(shù)。range:像素值的范圍知識(shí)拆解3)plt.plot()函數(shù)語(yǔ)法格式:matplotlib.pyplot.plot(*args,**kwargs)參數(shù)介紹:*args:是一個(gè)可變數(shù)量的位置參數(shù),定義了y值的數(shù)據(jù)點(diǎn)。對(duì)于x值,可以傳遞一個(gè)與y值長(zhǎng)度相同的序列,或者省略它(在這種情況下,x值會(huì)被自動(dòng)設(shè)置為[0,1,2,...])。x,y:分別代表x軸和y軸的數(shù)據(jù)點(diǎn)序列。x和y應(yīng)該是長(zhǎng)度相同的序列。formatstring(可選):一個(gè)格式字符串,指定了線的顏色、線型、標(biāo)記等屬性。例如,'r--'表示紅色虛線,'go-'表示帶有綠色圓圈的實(shí)線。**kwargs:關(guān)鍵字參數(shù),用于指定各種可選屬性。color或c:線的顏色??梢允穷A(yù)定義的顏色名稱(如'red','green'),也可以是十六進(jìn)制顏色代碼(如'#FF5733'),RGB元組(如(0.1,0.2,0.5))等。知識(shí)拆解linestyle或ls:線的樣式??梢允穷A(yù)定義的線型名稱(如'solid','dashed','dashdot','dotted')或它們的縮寫(如'-','--','-.',':')。marker:用于標(biāo)記數(shù)據(jù)點(diǎn)的符號(hào)類型??梢允穷A(yù)定義的符號(hào)(如'o','.',','等)或它們的縮寫。markersize或ms:標(biāo)記的大小。label:用于圖例的標(biāo)簽。linewidth或lw:線的寬度。alpha:透明度,取值范圍在0(完全透明)到1(完全不透明)之間。知識(shí)運(yùn)用1.import
cv2
2.import
matplotlib.pyplot
as
plt
3.#第一步,讀取圖像4.img
=
cv2.imread('sea.jpg',
cv2.IMREAD_GRAYSCALE)
5.#第二步,計(jì)算灰度圖像的直方圖6.hist
=
cv2.calcHist([img],
[0],
None,
[256],
[0,
256])
7.#第三步,設(shè)置兩個(gè)畫布區(qū)域,左側(cè)繪制灰度圖像,右側(cè)繪制圖像直方圖
8.fig,
axes
=
plt.subplots(1,
2,
figsize=(12,
4))
9.axes[0].imshow(img,
'gray')
10.axes[0].set_xticks([])
11.axes[0].set_yticks([])
知識(shí)運(yùn)用12.#第四步,使用plot函數(shù)進(jìn)行直方圖繪制,并調(diào)用fill函數(shù)填充顏色
13.axes[1].plot(hist,
color='#888888')
14.axes[1].fill(hist,
'#888888')
15.#第五步,顯示畫布16.plt.show()
使用plt,plot()函數(shù)繪制的圖像直方圖知識(shí)運(yùn)用1.import
numpy
as
np
2.import
cv2
3.import
matplotlib.pyplot
as
plt
4.#第一步,讀取圖片5.img
=
cv2.imread('sea.jpg')
6.#第二步,設(shè)置兩個(gè)畫布區(qū)域,左側(cè)繪制彩色圖像,右側(cè)繪制各通道直方圖7.fig,
axes
=
plt.subplots(1,
2,
figsize=(12,
4))
8.axes[0].imshow(cv2.cvtColor(img,
cv2.COLOR_BGR2RGB))
9.axes[0].set_xticks([])
10.axes[0].set_yticks([])
知識(shí)運(yùn)用11.#
第三步,繪制BGR通道的直方圖
12.colors
=
('blue',
'red',
'green')
13.for
i,
color
in
enumerate(colors):
14.
hist
=
cv2.calcHist([img],
[i],
None,
[256],
[0,
256])
15.
axes[1].plot(hist,
color=color)
16.#第四步,顯示畫布17.plt.show()
彩色圖像直方圖知識(shí)運(yùn)用1.import
cv2
2.import
matplotlib.pyplot
as
plt
3."""
4.Hue色調(diào):
0-180
5.Saturation飽和度:
0-255
6.Value亮度:
0-255
7."""
8.#
第一步,讀取圖像,并從BGR轉(zhuǎn)換為HSV
9.img
=
cv2.imread('sea.jpg')
10.hsv
=
cv2.cvtColor(img,
cv2.COLOR_BGR2HSV)
11.#
第二步,生成Matplotlib畫布
fig,
axes
=
plt.subplots(1,
4,
figsize=(12,
4))知識(shí)運(yùn)用13.#
第三步,顯示原始圖像
14.axes[0].imshow(cv2.cvtColor(img,
cv2.COLOR_BGR2RGB))
15.axes[0].set_title("Orig")
16.axes[0].set_xticks([])
17.axes[0].set_yticks([])
18.#
第四步,分別計(jì)算H、S、V三個(gè)維度的直方圖,并進(jìn)行顯示
19.names
=
['Hue',
'Saturation',
'Value']
20.values
=
[180,
256,
256]
21.for
i,
name
in
enumerate(names):
22.
hist
=
cv2.calcHist([hsv],
[i],
None,
[values[i]],
[0,
values[i]])
23.
axes[i+1].plot(hist)
axes[i+1].set_title(name)
知識(shí)運(yùn)用25.
axes[i+1].set_xticks([])
26.
axes[i+1].set_yticks([])
27.plt.show()
HSV模式圖像直方圖知識(shí)運(yùn)用1.import
cv2
2.import
matplotlib.pyplot
as
plt
3.#
第一步,讀取圖像,并從BGR轉(zhuǎn)換為HSV
4.img
=
cv2.imread('sea.jpg')
5.hsv
=
cv2.cvtColor(img,
cv2.COLOR_BGR2HSV)
6.#
第二步,生成Matplotlib畫布
7.fig,
axes
=
plt.subplots(1,
2,
figsize=(8,
4))
8.axes[0].imshow(cv2.cvtColor(img,
cv2.COLOR_BGR2RGB))
9.axes[0].set_title("Orig")
10.axes[0].set_xticks([])
11.axes[0].set_yticks([])
知識(shí)運(yùn)用12.#
第三步,計(jì)算H、S維度的直方圖,第二個(gè)參數(shù)channels設(shè)置為[0,
1]
13.#
結(jié)果是2D直方圖數(shù)組,大小為(180,
256)
14.hist
=
cv2.calcHist([hsv],
[0,
1],
None,
[180,
256],
[0,
180,
0,
256])
15.axes[1].imshow(hist)
#
設(shè)置插值方式為鄰進(jìn)點(diǎn)插值
16.axes[1].set_title("Hue-Saturation")
17.#第四步,顯示2D直方圖18.plt.show()
圖像的2D直方圖任務(wù)小結(jié)
直方圖繪制函數(shù)直方圖繪制的原理對(duì)于一幅數(shù)字圖像,其直方圖的定義是一個(gè)離散函數(shù)。在這個(gè)函數(shù)中,每一個(gè)可能的像素值(或灰度級(jí))都對(duì)應(yīng)一個(gè)數(shù),這個(gè)數(shù)表示該像素值在圖像中出現(xiàn)的次數(shù)或頻率。cv2.calcHist([images],channels,mask,histSize,ranges,[hist[,accumulate]])任務(wù)一
直方圖的繪制任務(wù)二統(tǒng)計(jì)圖中信息
任務(wù)導(dǎo)入在圖像處理和數(shù)據(jù)分析中,我們經(jīng)常需要關(guān)注圖像中的特定區(qū)域或特征。為了提取這些區(qū)域或特征的信息,我們可以使用掩碼圖像來(lái)過(guò)濾掉不感興趣的部分,只保留我們關(guān)心的部分。掩碼圖像是一個(gè)與原圖大小相同的二值圖像,用于指示哪些像素應(yīng)該被保留,哪些像素應(yīng)該被忽略。同時(shí),統(tǒng)計(jì)圖作為一種重要的數(shù)據(jù)可視化工具,能夠直觀地展示數(shù)據(jù)的分布情況、變化趨勢(shì)等信息。通過(guò)統(tǒng)計(jì)圖,我們可以快速地獲取數(shù)據(jù)的概覽,進(jìn)而進(jìn)行深入的分析。案例代碼1.import
cv2
#
導(dǎo)入OpenCV庫(kù),用于圖像處理
2.import
numpy
as
np
#
導(dǎo)入NumPy庫(kù),用于數(shù)組操作
3.#
第一步,讀取圖像文件,0表示以灰度模式讀取圖像
4.image1
=
cv2.imread('clothes.jpg',
0)
5.#第二步,
創(chuàng)建一個(gè)與圖像大小相同的全零數(shù)組作為掩碼6.mask
=
np.zeros(image1.shape,
dtype=np.uint8)
7.#dtype=np.uint8表示數(shù)組元素的數(shù)據(jù)類型為無(wú)符號(hào)8位整數(shù)
8.#
將掩碼中坐標(biāo)(50,50)到(200,200)的矩形區(qū)域設(shè)置為255(白色)
9.mask[50:200,
50:200]
=
255
10.#
第三步,使用cv2.bitwise_and函數(shù)將圖像與掩碼進(jìn)行按位與運(yùn)算,保留掩碼為白色的圖像區(qū)域
11.result
=
cv2.bitwise_and(image1,
mask)
案例代碼12.#
第四步,顯示原始圖像
13.cv2.imshow('image',
image1)
14.#
第五步,顯示掩碼
15.cv2.imshow('mask',
mask)
16.#
第六步,顯示按位與運(yùn)算后的結(jié)果圖像
17.cv2.imshow('result',
result)
18.#
等待用戶按鍵,參數(shù)0表示無(wú)限等待
19.cv2.waitKey(0)
20.#
銷毀所有創(chuàng)建的窗口
21.cv2.destroyAllWindows()
案例結(jié)果原始圖像掩碼圖像案例代碼1.import
cv2
#
導(dǎo)入OpenCV庫(kù),用于圖像處理
2.import
matplotlib.pyplot
as
plt
#
導(dǎo)入matplotlib庫(kù),用于繪圖
3.#
第一步,讀取圖片文件
4.clothes
=
cv2.imread("clothes.jpg")
5.#第二步,設(shè)置需要統(tǒng)計(jì)的信息
6.mask
=
None
7.histSize
=
[256]
8.ranges
=
[0,255]
9.#
第三步,初始化channels列表,用于存儲(chǔ)統(tǒng)計(jì)色彩通道的索引
10.#
channels
代表統(tǒng)計(jì)的色彩通道,這里初始化為只統(tǒng)計(jì)藍(lán)色通道
11.channels
=
[0]
案例代碼12.#
第四步,計(jì)算藍(lán)色通道的直方圖
13.#
cv2.calcHist函數(shù)用于計(jì)算圖像的直方圖
14.blue_hist
=
cv2.calcHist([clothes],
channels,
mask,
histSize,
ranges)
15.#
第五步,繪制藍(lán)色通道的直方圖,用藍(lán)色表示
16.plt.plot(blue_hist,
'b')
17.#
第六步,修改channels列表以統(tǒng)計(jì)綠色通道
18.channels
=
[1]
19.#
第七步,計(jì)算綠色通道的直方圖
20.green_hist
=
cv2.calcHist([clothes],
channels,
mask,
histSize,
ranges)
21.#
第八步,繪制綠色通道的直方圖,用綠色表示
22.plt.plot(green_hist,
'g')
案例代碼23.#
第九步,修改channels列表以統(tǒng)計(jì)紅色通道
24.channels
=
[2]
25.#
第十步,計(jì)算紅色通道的直方圖
26.red_hist
=
cv2.calcHist([clothes],
channels,
mask,
histSize,
ranges)
27.#
第十一步,繪制紅色通道的直方圖,用紅色表示
28.plt.plot(red_hist,
'r')
29.#
第十二步,顯示直方圖
30.plt.show()
掩碼圖像機(jī)器直方圖知識(shí)拆解1.掩碼圖像(1)算法介紹掩碼圖像(MaskImage)是一種特殊的二值圖像,其中每個(gè)像素只有兩種可能的值(通常是0和255),用于指示在圖像處理中哪些像素應(yīng)該被處理或保留,哪些應(yīng)該被忽略。掩碼圖像常用于圖像分割、特征提取、圖像合成等任務(wù)中。使用掩碼進(jìn)行圖像處理的算法通常涉及以下幾個(gè)步驟:1)創(chuàng)建掩碼:根據(jù)任務(wù)需求,創(chuàng)建一個(gè)二值圖像作為掩碼。掩碼中的每個(gè)像素值通常通過(guò)條件判斷或計(jì)算得出。2)應(yīng)用掩碼:在圖像處理操作中,將掩碼作為參數(shù)傳入。掩碼決定了哪些像素會(huì)被處理,哪些會(huì)被忽略。3)執(zhí)行操作:根據(jù)掩碼指示,對(duì)圖像中的特定區(qū)域執(zhí)行特定的操作,如像素值相加、替換等。知識(shí)拆解(2)函數(shù)介紹有多個(gè)函數(shù)可以用于創(chuàng)建和應(yīng)用掩碼,例如:np.zeros():NumPy函數(shù),用于創(chuàng)建指定形狀和類型的全零數(shù)組,常用于初始化掩碼。cv2.add():帶有掩碼參數(shù)的圖像加法函數(shù),僅對(duì)掩碼指示的區(qū)域進(jìn)行像素相加。cv2.threshold():通過(guò)閾值操作將灰度圖像或彩色圖像轉(zhuǎn)換為二值掩碼。知識(shí)拆解(3)函數(shù)語(yǔ)法格式及參數(shù)介紹1)np.zeros()函數(shù)語(yǔ)法格式:numpy.zeros(shape,dtype=float,order='C')參數(shù)介紹:shape:輸出的形狀。dtype:輸出的數(shù)據(jù)類型。默認(rèn)為np.float64。order:指定以何種內(nèi)存布局存儲(chǔ)數(shù)據(jù)。'C'表示以行優(yōu)先順序(C風(fēng)格)存儲(chǔ),'F'表示以列優(yōu)先順序(Fortran風(fēng)格)存儲(chǔ),'A'表示原始順序,'K'表示元素在內(nèi)存中的出現(xiàn)順序。知識(shí)拆解2)cv2.add()函數(shù)語(yǔ)法格式:cv2.add(src1,src2,dst=None,mask=None,dtype=None)參數(shù)介紹:src1:第一個(gè)輸入數(shù)組或與src2大小和類型相同的矩陣。src2:第二個(gè)輸入數(shù)組,它的大小和類型與src1相同。dst:輸出數(shù)組,是一個(gè)可選參數(shù),其大小和類型與src1和src2相同。mask:可選的操作掩碼,8位單通道數(shù)組,指定哪些元素需要進(jìn)行操作。dtype:可選的輸出數(shù)組的深度;當(dāng)兩個(gè)輸入數(shù)組具有相同的深度時(shí),這個(gè)參數(shù)也是可選的。知識(shí)拆解3)cv2.threshold()函數(shù)語(yǔ)法格式:ret,dst=cv2.threshold(src,thresh,maxval,type[,dst])參數(shù)介紹:src:輸入圖像(多通道圖像將被轉(zhuǎn)換為灰度圖像)。thresh:閾值。maxval:當(dāng)像素值超過(guò)(或有時(shí)小于,取決于類型)閾值時(shí)賦予的像素值。type:閾值類型,如cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV等。dst:輸出圖像,與源圖像具有相同大小和類型。知識(shí)運(yùn)用1.import
cv2
#
導(dǎo)入OpenCV庫(kù),用于圖像處理
2.import
numpy
as
np
#
導(dǎo)入NumPy庫(kù),用于數(shù)組操作
3.#
第一步,讀取兩張圖像文件,分別是lena.png和heart.jpg
4.image1
=
cv2.imread('lena.png')
5.image2
=
cv2.imread('heart.jpg')
6.#第二步,創(chuàng)建一個(gè)與image1大小相同的全零數(shù)組作為掩碼,dtype=np.uint8表示數(shù)組元素的數(shù)據(jù)類型為無(wú)符號(hào)8位整數(shù)
7.mask
=
np.zeros((image1.shape[0],
image1.shape[1]),
dtype=np.uint8)
8.#
將掩碼中坐標(biāo)(50,50)到(200,200)的矩形區(qū)域設(shè)置為255(白色)
9.mask[50:200,
50:200]
=
255
10.#
第三步,使用cv2.add函數(shù)將image1和image2進(jìn)行加權(quán)相加,其中mask參數(shù)指定了哪些區(qū)域的像素值會(huì)被相加
知識(shí)運(yùn)用11.#
在mask為白色的區(qū)域,image1和image2的像素值會(huì)相加;在mask為黑色的區(qū)域,保持image1的像素值不變
12.result
=
cv2.add(image1,
image2,
mask=mask)
13.#
第四步,使用掩碼將image2的內(nèi)容復(fù)制到image1的對(duì)應(yīng)區(qū)域
14.image1[mask
==
255]
=
result[mask
==
255]
15.#
第五步,顯示掩碼部位改變后的初始圖片lena.png
16.cv2.imshow('Modified
lena.png',
image1)
17.#
第六步,顯示掩碼
18.cv2.imshow('mask',
mask)
19.#
第七步,顯示加權(quán)相加后的結(jié)果圖像
20.cv2.imshow('result',
result)
知識(shí)運(yùn)用21.#
等待用戶按鍵,參數(shù)0表示無(wú)限等待
22.cv2.waitKey(0)
23.#
銷毀所有創(chuàng)建的窗口
24.cv2.destroyAllWindows()
加權(quán)掩碼圖像知識(shí)拆解2.統(tǒng)計(jì)圖像信息(1)算法介紹OpenCV為圖像分析提供了豐富的統(tǒng)計(jì)工具。通過(guò)計(jì)算圖像的均值、標(biāo)準(zhǔn)差等像素值統(tǒng)計(jì),可以了解圖像的整體亮度分布和對(duì)比度情況。同時(shí),直方圖統(tǒng)計(jì)能夠展示圖像中不同像素值的頻率分布,為圖像處理和增強(qiáng)提供重要依據(jù)。此外,連通區(qū)域統(tǒng)計(jì)、邊緣與角點(diǎn)檢測(cè)等功能,則有助于識(shí)別圖像中的形狀、紋理等特征,進(jìn)一步加深對(duì)圖像內(nèi)容的理解。OpenCV不僅支持基本的像素和形狀統(tǒng)計(jì),還能進(jìn)行更高級(jí)的圖像分析。例如,利用圖像矩可以計(jì)算形狀的幾何特征,如面積、方向等;顏色特征統(tǒng)計(jì)則能夠揭示圖像中不同顏色分量的比例和分布。這些統(tǒng)計(jì)信息在目標(biāo)識(shí)別、場(chǎng)景分割等應(yīng)用中發(fā)揮著關(guān)鍵作用,使得圖像處理任務(wù)更加精準(zhǔn)和高效。知識(shí)拆解(2)函數(shù)介紹OpenCV提供了多個(gè)函數(shù)用于統(tǒng)計(jì)圖像信息,如直方圖計(jì)算、像素值統(tǒng)計(jì)等。1)直方圖計(jì)算:使用cv2.calcHist()函數(shù)計(jì)算圖像的直方圖,可以統(tǒng)計(jì)不同通道的像素值分布情況。2)像素值統(tǒng)計(jì):可以通過(guò)遍歷圖像像素或使用NumPy的聚合函數(shù)(如np.mean()、np.std()等)來(lái)統(tǒng)計(jì)圖像的均值、標(biāo)準(zhǔn)差等。(3)函數(shù)語(yǔ)法格式cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])知識(shí)拆解(4)參數(shù)介紹images:源圖像,列表格式,應(yīng)該只包含單個(gè)圖像。channels:用于計(jì)算直方圖的通道列表,例如[0]表示藍(lán)色通道,[1]表示綠色通道,[2]表示紅色通道。mask:可選的掩碼。如果指定,則僅計(jì)算掩碼非零區(qū)域的直方圖。histSize:每個(gè)維度的大小,應(yīng)該是一個(gè)包含整數(shù)的元組。ranges:每個(gè)維度的取值范圍,應(yīng)該是一個(gè)包含元組的列表,每個(gè)元組包含兩個(gè)數(shù)值,表示該維度的最小值和最大值。hist:可選的輸出直方圖,是一個(gè)數(shù)組。accumulate:可選的標(biāo)志,指定是否累加直方圖知識(shí)運(yùn)用1.import
cv2
#
導(dǎo)入OpenCV庫(kù),用于圖像處理
2.import
matplotlib.pyplot
as
plt
#
導(dǎo)入Matplotlib庫(kù),用于繪圖
3.import
numpy
as
np
#
導(dǎo)入NumPy庫(kù),用于數(shù)組操作
4.#
第一步,讀取圖像文件,'0'參數(shù)表示以灰度模式讀取圖像
5.img
=
cv2.imread('sea.jpg',
0)
6.#
第二步,創(chuàng)建一個(gè)與圖像形狀相同、數(shù)據(jù)類型為uint8的全零數(shù)組作為掩碼
7.#
255代表白色,在掩碼中用于標(biāo)識(shí)需要保留的區(qū)域
8.mask
=
np.zeros(img.shape,
np.uint8)
9.#
第三步,將掩碼中指定區(qū)域的像素值設(shè)為255,形成一個(gè)矩形框的掩碼
10.mask[200:360,
200:400]
=
255
知識(shí)運(yùn)用11.#
第四步,使用cv2.bitwise_and函數(shù)將掩碼應(yīng)用到原始圖像上
12.#
掩碼為白色的區(qū)域保留原始圖像的像素值,黑色區(qū)域則變?yōu)?(黑色)
13.img_mask
=
cv2.bitwise_and(img,
img,
mask=mask)
14.#
第五步,分別計(jì)算沒(méi)有掩碼和有掩碼的圖像直方圖值
15.#
直方圖用于展示圖像中像素值的分布情況
16.hist1
=
cv2.calcHist([img],
[0],
None,
[256],
[0,
256])
#
不使用掩碼
17.hist2
=
cv2.calcHist([img],
[0],
mask,
[256],
[0,
256])
#
使用掩碼
18.#
第六步,創(chuàng)建一個(gè)2X2的畫布用于展示圖像和直方圖
19.fig,
axes
=
plt.subplots(2,
2,
figsize=(8,
6))
20.#
第七步,在左上角展示完整圖像
21.axes[0][0].imshow(img,
'gray')
22.axes[0][0].set_title('Original
Image')
#
設(shè)置標(biāo)題
知識(shí)運(yùn)用23.#
第八步,在右上角展示掩碼
24.axes[0][1].imshow(mask,
'gray')
25.axes[0][1].set_title('Mask')
#
設(shè)置標(biāo)題
26.#
第九步,在左下角展示掩碼處理后的局部圖像
27.axes[1][0].imshow(img_mask,
'gray')
28.axes[1][0].set_title('Masked
Image')
#
設(shè)置標(biāo)題
29.#
第十步,在右下角繪制直方圖,紅色表示原始圖像的直方圖,綠色表示使用掩碼后的直方圖
30.axes[1][1].plot(hist1,
color='red',
label='Original
Histogram')
31.axes[1][1].plot(hist2,
color='green',
label='Masked
Histogram')
知識(shí)運(yùn)用32.axes[1][1].set_title('Histograms')
#
設(shè)置標(biāo)題
33.axes[1][1].legend()
#
顯示圖例
34.#
第十一步,顯示整個(gè)畫布
35.plt.show()
繪制掩碼圖像與原始圖像直方圖任務(wù)小結(jié)
圖像掩碼函數(shù)圖像掩碼的原理掩碼圖像(MaskImage)是一種特殊的二值圖像,其中每個(gè)像素只有兩種可能的值(通常是0和255),用于指示在圖像處理中哪些像素應(yīng)該被處理或保留,哪些應(yīng)該被忽略。np.zeros()cv2.add()cv2.threshold()任務(wù)二
統(tǒng)計(jì)圖中信息任務(wù)三圖像均衡化處理
任務(wù)導(dǎo)入直方圖均衡化是一種常用的圖像增強(qiáng)方法,它通過(guò)拉伸圖像的像素強(qiáng)度分布范圍,使得圖像的對(duì)比度得到增強(qiáng)。具體來(lái)說(shuō),直方圖均衡化會(huì)根據(jù)圖像的直方圖分布,對(duì)像素值進(jìn)行非線性變換,使得變換后的圖像直方圖分布更加均勻。然而,傳統(tǒng)的直方圖均衡化方法在處理一些復(fù)雜場(chǎng)景或細(xì)節(jié)豐富的圖像時(shí),可能會(huì)出現(xiàn)過(guò)度增強(qiáng)或噪聲放大等問(wèn)題。為了解決這些問(wèn)題,我們引入了自適應(yīng)直方圖均衡化(AHE)方法。AHE通過(guò)對(duì)圖像的局部區(qū)域進(jìn)行直方圖均衡化,可以更好地保留圖像的細(xì)節(jié)和紋理信息,同時(shí)減少噪聲的影響。案例代碼1.import
cv2
2.import
numpy
as
np
3.import
matplotlib.pyplot
as
plt
4.#
第一步,讀取圖像
5.image
=
cv2.imread('view.jpg',
0)
#
0表示以灰度模式讀取圖像
6.#
第二步,直方圖均衡化
7.equ_image
=
cv2.equalizeHist(image)
8.#
第三步,自適應(yīng)直方圖均衡化
9.clahe
=
cv2.createCLAHE(clipLimit=2.0,
tileGridSize=(8,
8))
10.clahe_image
=
clahe.apply(image)
案例代碼11.#
第四步,顯示原圖和處理后的圖像
12.titles
=
['Original
Image',
'Histogram
Equalization',
'Adaptive']
13.images
=
[image,
equ_image,
clahe_image]
14.for
i
in
range(3):
15.
plt.subplot(1,
3,
i
+
1),
plt.imshow(images[i],
'gray')
16.
plt.title(titles[i])
17.
plt.xticks([]),
plt.yticks([])
18.plt.show()
案例結(jié)果圖像的直方圖均衡化與自適應(yīng)直方圖均衡化知識(shí)拆解1.直方圖均衡化(1)算法介紹直方圖均衡化(HistogramEqualization)是一種用于增強(qiáng)圖像對(duì)比度的技術(shù)。它通過(guò)拉伸圖像的直方圖,使得像素強(qiáng)度分布更加均勻,從而改善圖像的視覺(jué)效果。具體來(lái)說(shuō),直方圖均衡化會(huì)重新分配圖像的像素值,使得在原始圖像中像素值較少的區(qū)域在均衡化后的圖像中擁有更廣泛的像素值分布。這種方法對(duì)于背景和前景都太亮或者太暗的圖像非常有用,可以有效提升圖像的對(duì)比度,使細(xì)節(jié)更加清晰。知識(shí)拆解(2)函數(shù)介紹OpenCV提供了多個(gè)函數(shù)來(lái)實(shí)現(xiàn)直方圖均衡化,包括cv2.split()、cv2.equalizeHist()和cv2.merge()。這些函數(shù)通常用于對(duì)彩色圖像進(jìn)行處理,其中cv2.split()用于將圖像拆分為單個(gè)通道(如B、G、R),cv2.equalizeHist()用于對(duì)每個(gè)通道進(jìn)行直方圖均衡化,而cv2.merge()則用于將均衡化后的通道合并回一張圖像。此外,matplotlib.pyplot.hist()和matplotlib.pyplot.figure()函數(shù)可用于繪制和顯示圖像的直方圖,幫助用戶直觀地了解圖像的像素強(qiáng)度分布。知識(shí)拆解(3)函數(shù)語(yǔ)法格式及參數(shù)介紹1)cv2.split()語(yǔ)法格式:b,g,r=cv2.split(img)參數(shù)介紹:img:輸入的彩色圖像。返回值:b、g、r:分別代表圖像的藍(lán)色、綠色和紅色通道。2)cv2.equalizeHist()語(yǔ)法格式:cv2.equalizeHist(src)參數(shù)介紹:src:輸入的灰度圖像或單個(gè)通道的圖像。返回值:equ:均衡化后的圖像。知識(shí)拆解3)cv2.merge()語(yǔ)法格式:cv2.merge((b,g,r))參數(shù)介紹:(b,g,r):一個(gè)包含三個(gè)通道的元組,每個(gè)通道都是一個(gè)二維數(shù)組。返回值:merged_img:合并后的彩色圖像。density:是否歸一化直方圖。該函數(shù)用于繪制直方圖,展示數(shù)據(jù)的分布情況。知識(shí)拆解4)matplotlib.pyplot.hist()語(yǔ)法格式:plt.hist(x,bins,range,density,etc.)參數(shù)介紹:x:輸入數(shù)據(jù),通常是一維數(shù)組。bins:直方圖的箱數(shù),即數(shù)據(jù)的分段數(shù)。range:數(shù)據(jù)的范圍。知識(shí)拆解5)matplotlib.pyplot.figure()語(yǔ)法格式:plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)參數(shù)介紹:num:圖像編號(hào)或名稱。figsize:圖像的尺寸,以英寸為單位。dpi:圖像的分辨率。facecolor:圖像的背景色。edgecolor:圖像的邊框色。frameon:是否顯示圖像邊框。該函數(shù)用于創(chuàng)建一個(gè)新的圖像窗口,用于顯示圖形或圖像。知識(shí)運(yùn)用1.import
numpy
as
np
2.import
cv2
3.import
matplotlib.pyplot
as
plt
4."""一副效果好的圖像通常在直方圖上的分布比較均勻,直方圖均衡化就是用來(lái)改善圖像的全局亮度和對(duì)比度。
OpenCV中用cv2.equalizeHist()實(shí)現(xiàn)均衡化。
"""
5.#第一步,導(dǎo)入圖片6.img
=
cv2.imread('sea_gray.jpg',
cv2.IMREAD_GRAYSCALE)
7.#
調(diào)用cv2.equalizeHist()實(shí)現(xiàn)全局均衡化
8.img_equal
=
cv2.equalizeHist(img)
9.#
分別計(jì)算原始圖像直方圖和均衡化圖像直方圖
10.hist1
=
cv2.calcHist([img],
[0],
None,
[256],
[0,
256])
11.hist2
=
cv2.calcHist([img_equal],
[0],
None,
[256],
[0,
256])
知識(shí)運(yùn)用12.#
使用Matplotlib進(jìn)行展示,設(shè)置2X2的畫板
13.#
展示原始圖像、均衡化圖像、原始圖像直方圖、均衡化圖像直方圖
14.fig,
axes
=
plt.subplots(2,
2,
figsize=(8,
6))
15.axes[0][0].imshow(img,
'gray')
16.axes[0][1].imshow(img_equal,
'gray')
17.axes[1][0].plot(hist1)
18.axes[1][1].plot(hist2)
19.plt.show()
圖像全局直方圖均衡化前后對(duì)比知識(shí)拆解2.自適應(yīng)直方圖均衡化(1)算法介紹在OpenCV中,自適應(yīng)均衡化是一種改進(jìn)的圖像增強(qiáng)技術(shù),特別是針對(duì)那些局部對(duì)比度較低或亮度不均勻的圖像。傳統(tǒng)的直方圖均衡化雖然能夠全局地提升圖像的對(duì)比度,但在某些情況下,它可能會(huì)導(dǎo)致圖像的某些區(qū)域過(guò)度增強(qiáng),從而引入噪聲或失真。自適應(yīng)均衡化則通過(guò)局部地調(diào)整圖像的對(duì)比度來(lái)解決這個(gè)問(wèn)題。自適應(yīng)直方圖均衡化(AdaptiveHistogramEqualization,AHE)通過(guò)計(jì)算圖像的局部直方圖,并據(jù)此調(diào)整每個(gè)像素的亮度值,從而增強(qiáng)圖像的局部對(duì)比度。具體來(lái)說(shuō),算法會(huì)將圖像劃分為多個(gè)小塊(通常稱為tiles或blocks),然后對(duì)每個(gè)小塊分別進(jìn)行直方圖均衡化。這樣,每個(gè)小塊內(nèi)的像素值分布都會(huì)被拉伸,從而增強(qiáng)該區(qū)域的對(duì)比度。知識(shí)拆解然而,AHE有時(shí)可能會(huì)放大圖像的噪聲,因?yàn)榫植烤饣赡苁沟迷肼暤姆仍黾?。為了避免這個(gè)問(wèn)題,對(duì)比度限制自適應(yīng)直方圖均衡化(ContrastLimitedAdaptiveHistogramEqualization,CLAHE)被提出。CLAHE在AHE的基礎(chǔ)上,通過(guò)限制每個(gè)小塊中直方圖的高度,來(lái)防止噪聲的過(guò)度放大。這通常是通過(guò)設(shè)置一個(gè)對(duì)比度限制參數(shù)(clipLimit)來(lái)實(shí)現(xiàn)的。(2)OpenCV函數(shù)介紹在OpenCV中,可以使用cv2.createCLAHE()函數(shù)來(lái)創(chuàng)建CLAHE對(duì)象,并通過(guò)這個(gè)對(duì)象來(lái)對(duì)圖像進(jìn)行自適應(yīng)均衡化。這個(gè)函數(shù)提供了一種簡(jiǎn)單且有效的方式來(lái)執(zhí)行CLAHE算法。知識(shí)拆解(3)函數(shù)語(yǔ)法格式及參數(shù)介紹函數(shù)語(yǔ)法格式:1)cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))2)clahe.apply(src)參數(shù)介紹:clipLimit:對(duì)比度限制參數(shù),用于控制直方圖的高度。較高的值可能會(huì)導(dǎo)致對(duì)比度增強(qiáng)更多,但也可能增加噪聲。通常設(shè)定這個(gè)參數(shù)為1.0或2.0。tileGridSize:定義圖像中tiles(小塊)的大小,通常以元組(rows,cols)的形式給出。例如,(8,8)表示圖像將被劃分為8x8個(gè)小塊。默認(rèn)值為(8,8)。知識(shí)拆解src:輸入圖像返回值:clahe:一個(gè)CLAHE對(duì)象,用于后續(xù)對(duì)圖像進(jìn)行自適應(yīng)均衡化。equalized_img:經(jīng)過(guò)CLAHE均衡化后的圖像。使用clahe.apply(src)方法可以將CLAHE對(duì)象應(yīng)用于輸入圖像src,并返回均衡化后的圖像。知識(shí)運(yùn)用1.import
cv2
2.import
matplotlib.pyplot
as
plt
3.#第一步,導(dǎo)入圖片4.img
=
cv2.imread('head.jpg',
0)
5.#
第二步,全局均衡化處理
6.img_equal
=
cv2.equalizeHist(img)
7.#
第三步,自適應(yīng)均衡化,參數(shù)可選
8.#
clipLimit顏色對(duì)比度的閾值
9.#
titleGridSize進(jìn)行像素均衡化的網(wǎng)格大小,即在多少網(wǎng)格下進(jìn)行直方圖的均衡化操作
10.clahe
=
cv2.createCLAHE(clipLimit=2.0,
tileGridSize=(8,
8))
#
todo:
調(diào)整參數(shù),對(duì)比效果
11.img_clahe
=
clahe.apply(img)
知識(shí)運(yùn)用12.hist1
=
cv2.calcHist([img_equal],
[0],
None,
[256],
[0,
256])
13.hist2
=
cv2.calcHist([img_clahe],
[0],
None,
[256],
[0,
256])
14.#第四步,使用Matplotlib進(jìn)行展示,設(shè)置2X2的畫板
15.#
展示全局均衡化圖像、自適應(yīng)均衡化圖像、全局均衡化直方圖、自適應(yīng)均衡化直方圖
16.fig,
axes
=
plt.subplots(2,
2,
figsize=(8,
6))
17.axes[0][0].imshow(img_equal,
'gray')
18.axes[0][1].imshow(img_clahe,
'gray')
19.axes[1][0].plot(hist1)
20.axes[1][1].plot(hist2)
21.plt.show()
知識(shí)運(yùn)用圖像自適應(yīng)直方圖均衡化前后對(duì)比任務(wù)小結(jié)
直方圖均衡化函數(shù)直方圖均衡化的原理直方圖均衡化會(huì)重新分配圖像的像素值,使得在原始圖像中像素值較少的區(qū)域在均衡化后的圖像中擁有更廣泛的像素值分布。cv2.split()cv2.equalizeHist()cv2.merge()任務(wù)三
圖像均衡化處理任務(wù)四模板匹配
任務(wù)導(dǎo)入模板匹配是一種在圖像處理中廣泛應(yīng)用的技術(shù),它通過(guò)在目標(biāo)圖像中搜索與給定模板最相似的區(qū)域,實(shí)現(xiàn)目標(biāo)的定位或識(shí)別。在本案例中,演示單模板匹配和多模板匹配的實(shí)現(xiàn)過(guò)程,通過(guò)任務(wù)實(shí)踐,掌握模板匹配的核心算法,并將其應(yīng)用于實(shí)際場(chǎng)景中。案例代碼1.#第一步:導(dǎo)入OpenCV庫(kù)、numpy庫(kù)與matplotlib.pyplot庫(kù)。代碼如下:
2.import
cv2
3.import
matplotlib.pyplot
as
plt
4.#第二步:讀取原始圖片、畫板圖片與模板圖片代碼如下:
5.origin_img
=
cv2.imread("dog.jpg")
6.img
=
cv2.imread("dog.jpg")
7.img_gray
=
cv2.cvtColor(img,
cv2.COLOR_BGR2GRAY)
8.template
=
cv2.imread("temp_dog.jpg",
0)
9.#第三步:獲取模板圖像的shape,用于后續(xù)匹配。代碼如下:
10.th,
tw
=
template.shape[::]
#返回值中的th是模板圖像的高度,tw是模板圖像的寬度。
案例代碼12.#第四步:使用cv2.matchTemplate()匹配圖像。代碼如下:
13.rv
=
cv2.matchTemplate(img_gray,
template,
cv2.TM_SQDIFF)
14.#第五步:將匹配的坐標(biāo)記錄下來(lái),用于后續(xù)的顯示。代碼如下:
15.minval,
maxVal,
minLoc,
maxLoc
=
cv2.minMaxLoc(rv)
16.topLeft
=
minLoc
17.bottomRight
=
(topLeft[0]
+
tw,
topLeft[1]
+
th)
18.#第六步:將原圖像與匹配的位置顯示出來(lái),代碼如下:
19.cv2.imshow("origin_img",
origin_img)
20.cv2.waitKey()
21.cv2.rectangle(img,
topLeft,
bottomRight,
255,
2)
22.plt.imshow(img,
cmap='gray')
23.plt.title('Detected
Point')
24.plt.show()
案例結(jié)果原始圖像單模板匹配案例代碼1.#第一步:導(dǎo)入OpenCV庫(kù)、numpy庫(kù)與matplotlib.pyplot庫(kù)。代碼如下:
2.import
cv2
3.import
numpy
as
np
4.import
matplotlib.pyplot
as
plt
5.#第二步:讀取原始圖片與模板圖片。代碼如下:
6.img
=
cv2.imread("dogs.jpg",
0)
7.template
=
cv2.imread("temp_dog.jpg",
0)
8.#第三步:獲取模板圖像的shape,用于后續(xù)匹配。代碼如下:
9.w,
h
=
template.shape[::-1]
案例代碼10.#第四步:使用cv2.matchTemplate()與np.where()函數(shù)匹配圖像。代碼如下:
11.res
=
cv2.matchTemplate(img,
template,
cv2.TM_CCOEFF_NORMED)
12.threshold
=
0.9
13.loc
=
np.where(res
>=
threshold)
14.for
pt
in
zip(*loc[::-1]):
15.
cv2.rectangle(img,
pt,
(pt[0]
+
w,
pt[1]
+
h),
255,
1)
16.#第五步:將匹配成功的圖像顯示出來(lái),代碼如下:
17.plt.imshow(img,
cmap='gray')
18.plt.xticks([])
19.plt.yticks([])
20.plt.show()
案例結(jié)果多模板匹配知識(shí)拆解(1)算法介紹模板匹配算法的核心是將模板圖像與原始圖像中的每個(gè)部分進(jìn)行比較,通過(guò)逐像素滑動(dòng)模板圖像,計(jì)算模板與原始圖像中每個(gè)位置的相似度。相似度的計(jì)算通?;谙袼刂档牟町惢蚱渌攘繕?biāo)準(zhǔn)。最終,算法會(huì)生成一個(gè)相似度圖,其中每個(gè)像素值反映了模板與原始圖像中該位置的相似程度。OpenCV中使用模板匹配的基本步驟為:1)加載目標(biāo)圖像和要匹配的模板圖像。2)選擇匹配方法:OpenCV支持多種模板匹配方法,如平方差匹配(TM_SQDIFF)、歸一化平方差匹配(TM_SQDIFF_NORMED)、相關(guān)性匹配(TM_CCORR)、歸一化相關(guān)性匹配(TM_CCORR_NORMED)、相關(guān)系數(shù)匹配(TM_CCOEFF)以及歸一化相關(guān)系數(shù)匹配(TM_CCOEFF_NORMED)。這些方法在匹配過(guò)程中采用了不同的相似度度量標(biāo)準(zhǔn),以適應(yīng)不同的應(yīng)用場(chǎng)景。知識(shí)拆解3)使用cv2.matchTemplate()函數(shù)來(lái)進(jìn)行模板匹配,該函數(shù)將模板圖像在原始圖像上進(jìn)行滑動(dòng),并計(jì)算每個(gè)位置的相似度。調(diào)用函數(shù)后,將得到一個(gè)灰度圖像作為匹配結(jié)果,其中的每個(gè)像素值表示了對(duì)應(yīng)位置與模板的匹配程度。。4)使用OpenCV的minMaxLoc()函數(shù)來(lái)找到匹配結(jié)果圖像中的最小值和最大值的位置。對(duì)于平方差匹配方法,找到最小值的位置;對(duì)于相關(guān)系數(shù)匹配方法,找到最大值的位置。這個(gè)位置就是目標(biāo)圖像中與模板最匹配的區(qū)域。此時(shí)可以使用cv2.rectangle()函數(shù)根據(jù)坐標(biāo)值繪畫矩陣進(jìn)行標(biāo)注。進(jìn)行目標(biāo)檢測(cè)時(shí),與模板匹配的目標(biāo)通常有多個(gè),比如在一張工廠流水線照片中檢測(cè)多個(gè)相同的零件,這時(shí)就需要找出多個(gè)匹配結(jié)果。而函數(shù)cv2.minMaxLoc()僅僅能夠找出最值,無(wú)法給出所有匹配區(qū)域的位置信息。所以,要想匹配多個(gè)結(jié)果,使用函數(shù)cv2.minMaxLoc()是無(wú)法實(shí)現(xiàn)的,需要利用numpy.where()函數(shù)獲取模板匹配位置的集合。知識(shí)拆解(2)函數(shù)語(yǔ)法格式及參數(shù)介紹1)cv2.matchTemplate()語(yǔ)法格式:cv2.matchTemplate(image,template,method[,result[,mask]])參數(shù)介紹:image:原始圖像,可以是灰度圖像或彩色圖像。template:要在原始圖像中查找的模板圖像。method:使用的匹配方法,可以是上述提到的多種方法之一。result:可選參數(shù),輸出的匹配結(jié)果矩陣。如果提供此參數(shù),函數(shù)會(huì)將結(jié)果保存在該矩陣中。mask:可選參數(shù),掩碼圖像,用于指定在模板匹配過(guò)程中哪些像素應(yīng)該被考慮。知識(shí)拆解2)cv2.minMaxLoc()語(yǔ)法格式:min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(src)參數(shù)介紹:src:輸入的數(shù)組或圖像。返回值:min_val:數(shù)組或圖像中的最小值。max_val:數(shù)組或圖像中的最大值。min_loc:最小值的位置(坐標(biāo))。max_loc:最大值的位置(坐標(biāo))。知識(shí)拆解3)cv2.rectangle()語(yǔ)法格式:cv2.rectangle(image,pt1,pt2[[,color],thickness])參數(shù)介紹:imag
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)安全文化建設(shè)手冊(cè)
- 2025年企業(yè)內(nèi)部保密工作制度實(shí)施指南
- 反餐飲浪費(fèi)管理制度
- 超市員工績(jī)效考核制度
- 超市商品采購(gòu)及談判制度
- 2026年熱帶海洋環(huán)境與島礁生態(tài)全國(guó)重點(diǎn)實(shí)驗(yàn)室科研助理崗位招聘?jìng)淇碱}庫(kù)及完整答案詳解一套
- 養(yǎng)老院老人健康飲食營(yíng)養(yǎng)師管理制度
- 2026年白云區(qū)云城街招聘城中村改造工作人員的備考題庫(kù)附答案詳解
- 2026年英德市國(guó)防教育訓(xùn)練中心面向社會(huì)公開(kāi)招聘1名專職民兵教練員備考題庫(kù)及答案詳解一套
- 興義市人民醫(yī)院2025年公開(kāi)引進(jìn)高層次、急需緊缺人才備考題庫(kù)完整答案詳解
- 2026年中文投(陜西)文化傳媒有限公司招聘?jìng)淇碱}庫(kù)完整參考答案詳解
- 2026秋招:華夏銀行筆試題及答案
- 便攜式血糖儀培訓(xùn)課件
- 2025年上海農(nóng)林職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案
- 醫(yī)院物價(jià)制度培訓(xùn)課件
- 2026年通遼職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)附答案
- 2025 小學(xué)六年級(jí)語(yǔ)文下冊(cè) 日積月累 經(jīng)典名句情境應(yīng)用課件
- 2025年精麻藥品考試試題附答案
- 樓電梯維保及故障修復(fù)指南
- 山東省青島嶗山區(qū)2024-2025學(xué)年上學(xué)期八年級(jí)數(shù)學(xué)期末試題(含答案)
- 2025河南省公務(wù)員考試《公共基礎(chǔ)知識(shí)》題庫(kù)及答案1套
評(píng)論
0/150
提交評(píng)論