OpenCV計(jì)算機(jī)視覺(jué)處理 課件 模塊七 直方圖與匹配_第1頁(yè)
OpenCV計(jì)算機(jī)視覺(jué)處理 課件 模塊七 直方圖與匹配_第2頁(yè)
OpenCV計(jì)算機(jī)視覺(jué)處理 課件 模塊七 直方圖與匹配_第3頁(yè)
OpenCV計(jì)算機(jī)視覺(jué)處理 課件 模塊七 直方圖與匹配_第4頁(yè)
OpenCV計(jì)算機(jī)視覺(jué)處理 課件 模塊七 直方圖與匹配_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論