日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV进阶篇

發(fā)布時(shí)間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV进阶篇 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

sss

OpenCV進(jìn)階篇

第10章 模板匹配

模板匹配是一種最原始、最基本的識(shí)別方法,可以在原始圖像中尋找特定圖像的位置。模板匹配經(jīng)常應(yīng)用于簡(jiǎn)單的圖像查找場(chǎng)景中,例如,在集體合照中找到某個(gè)人的位置。本章將介紹如何利用OpenCV實(shí)現(xiàn)模板匹配。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8Qunwp3k-1639056667651)(OpenCV進(jìn)階篇.assets/image-20211122082012339.png)]

10.1 模板匹配方法

模板是被查找目標(biāo)的圖像,查找模板在原始圖像中的哪個(gè)位置的過(guò)程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法,其語(yǔ)法如下:

result = cv2.matchTemplate(image, templ, method, mask)

參數(shù)說(shuō)明:

image:原始圖像。

templ:模板圖像,尺寸必須小于或等于原始圖像。

method:匹配的方法,可用參數(shù)值如表10.1所示。

表10.1

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-yTgvDiwC-1639056667652)(OpenCV進(jìn)階篇.assets/image-20211122082047351.png)]

匹配方法的參數(shù)值

mask:可選參數(shù)。掩模,只有cv2.TM_SQDIFF和cv2.TM_CCORR_NORMED支持此參數(shù),建議采用默認(rèn)值。

返回值說(shuō)明:

result:計(jì)算得出的匹配結(jié)果。如果原始圖像的寬、高分別為W、H,模板圖像的寬、高分別為w、h,result就是一個(gè)W-w+1列、H-h+1行的32位浮點(diǎn)型數(shù)組。數(shù)組中每一個(gè)浮點(diǎn)數(shù)都是原始圖像中對(duì)應(yīng)像素位置的匹配結(jié)果,其含義需要根據(jù)method參數(shù)來(lái)解讀。
在模板匹配的計(jì)算過(guò)程中,模板會(huì)在原始圖像中移動(dòng)。模板與重疊區(qū)域內(nèi)的像素逐個(gè)對(duì)比,最后將對(duì)比的結(jié)果保存在模板左上角像素點(diǎn)索引位置對(duì)應(yīng)的數(shù)組位置中。計(jì)算過(guò)程如圖10.1所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-q6lurtRV-1639056667652)(OpenCV進(jìn)階篇.assets/image-20211122082229394.png)]

? 圖10.1 模板在原始圖像中移動(dòng)并逐個(gè)匹配

使用cv2.TM_SQDIFF(平方差匹配)方法計(jì)算出的數(shù)組格式如下(其他方法計(jì)算出的數(shù)組格式相同,僅數(shù)值不同):

[[0.10165964 0.10123613 0.1008469 ... 0.10471864 0.10471849 0.10471849][0.10131165 0.10087635 0.10047968 ... 0.10471849 0.10471834 0.10471849][0.10089004 0.10045089 0.10006084 ... 0.10471849 0.10471819 0.10471849]...[0.16168603 0.16291814 0.16366465 ... 0.12178455 0.12198001 0.12187888][0.15859096 0.16000605 0.16096526 ... 0.12245651 0.12261643 0.12248362][0.15512456 0.15672517 0.15791312 ... 0.12315679 0.1232616 0.12308815]]

模板將原始圖像中每一塊區(qū)域都覆蓋一遍,但結(jié)果數(shù)組的行、列數(shù)并不等于原始圖像的像素的行、列數(shù)。假設(shè)模板的寬為w,高為h,原始圖像的寬為W,高為H,如圖10.2所示。
模板移動(dòng)到原始圖像的邊緣之后就不會(huì)繼續(xù)移動(dòng)了,所以模板的移動(dòng)區(qū)域如圖10.3所示,該區(qū)域的邊長(zhǎng)為“原始圖像邊長(zhǎng)-模板邊長(zhǎng)+1”,最后加1是因?yàn)橐苿?dòng)區(qū)域內(nèi)的上下、左右的2個(gè)邊都被模板覆蓋到了,如果不加1會(huì)丟失數(shù)據(jù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-egJKRmNg-1639056667653)(OpenCV進(jìn)階篇.assets/image-20211122085327267.png)]

? 圖10.2 模板和原始圖像的寬、高

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-vEnbCYJW-1639056667653)(OpenCV進(jìn)階篇.assets/image-20211122085350483.png)]

? 圖10.3 模板移動(dòng)的范圍

10.2 單模板匹配

匹配過(guò)程中只用到一個(gè)模板場(chǎng)景叫單模板匹配。原始圖像中可能只有一個(gè)和模板相似的圖像,也可能有多個(gè)。如果只獲取匹配程度最高的那一個(gè)結(jié)果,這種操作叫作單目標(biāo)匹配。如果需要同時(shí)獲取所有匹配程度較高的結(jié)果,這種操作叫作多目標(biāo)匹配。

10.2.1 單目標(biāo)匹配

單目標(biāo)匹配只獲取一個(gè)結(jié)果即可,就是匹配程度最高的結(jié)果(如果使用平方差匹配,則為計(jì)算出的最小結(jié)果;如果使用相關(guān)匹配或相關(guān)系數(shù)匹配,則為計(jì)算出的最大結(jié)果)。本節(jié)以平方差匹配為例介紹。
matchTemplate()方法的計(jì)算結(jié)果是一個(gè)二維數(shù)組,OpenCV提供了一個(gè)minMaxLoc()方法專(zhuān)門(mén)用來(lái)解析這個(gè)二維數(shù)組中的最大值、最小值以及這2個(gè)值對(duì)應(yīng)的坐標(biāo),minMaxLoc()方法的語(yǔ)法如下:

minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(src, mask)

參數(shù)說(shuō)明:

src:matchTemplate()方法計(jì)算得出的數(shù)組。

mask:可選參數(shù),掩模,建議使用默認(rèn)值。

返回值說(shuō)明:

minValue:數(shù)組中的最小值。

maxValue:數(shù)組中的最大值。

minLoc:最小值的坐標(biāo),格式為(x, y)。

maxLoc:最大值的坐標(biāo),格式為(x, y)。
平方差匹配的計(jì)算結(jié)果越小,匹配程度越高。minMaxLoc()方法返回的minValue值就是模板匹配的最優(yōu)結(jié)果,minLoc就是最優(yōu)結(jié)果區(qū)域左上角的點(diǎn)坐標(biāo),區(qū)域大小與模板大小一致。

【實(shí)例10.1】 為原始圖片中匹配成功的區(qū)域繪制紅框。
將圖10.4作為模板,將圖10.5作為原始圖像,使用cv2.TM_SQDIFF_NORMED方式進(jìn)行模板匹配,在原始圖像中找到與模板一樣的圖案,并在該圖案上繪制紅色方框。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-rar15A3x-1639056667654)(OpenCV進(jìn)階篇.assets/image-20211122085451979.png)]

? 圖10.4 模板

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-gEC0AtkX-1639056667654)(OpenCV進(jìn)階篇.assets/image-20211122085539068.png)]

? 圖10.5 原始圖片
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2A0hJfRU-1639056667655)(OpenCV進(jìn)階篇.assets/image-20211122085602382.png)]

上述代碼的運(yùn)行結(jié)果如圖10.6所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-nO5y7aFc-1639056667655)(OpenCV進(jìn)階篇.assets/image-20211122085749850.png)]

? 圖10.6 模板匹配的效果

在許多綜藝節(jié)目里,導(dǎo)演組給選手們一幅圖像,讓選手在指定區(qū)域內(nèi)尋找圖像中的某一靜物。為了增加游戲難度,導(dǎo)演組可能會(huì)讓選手們從2個(gè)或者多個(gè)相似的場(chǎng)景中選擇最佳的匹配結(jié)果。接下來(lái),使用模板匹配的相應(yīng)方法模擬這個(gè)游戲。

【實(shí)例10.2】 從2幅圖像中選擇最佳的匹配結(jié)果。
將圖10.7作為模板,將圖10.8和圖10.9作為原始圖像,使用cv2.TM_SQDIFF_NORMED方式進(jìn)行模板匹配,在2幅原始圖像中找到與模板匹配結(jié)果最好的圖像,并在窗口中顯示出來(lái)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-kAeDADkx-1639056667656)(OpenCV進(jìn)階篇.assets/image-20211122085811909.png)]

? 圖10.7 模板

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6Y2C8Uz6-1639056667656)(OpenCV進(jìn)階篇.assets/image-20211122085837681.png)]

? 圖10.8 原始圖像221

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-F0efgzCT-1639056667656)(OpenCV進(jìn)階篇.assets/image-20211122085907444.png)]

? 圖10.9 原始圖像222
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Iun44Nij-1639056667657)(OpenCV進(jìn)階篇.assets/image-20211122085934422.png)]

上述代碼的運(yùn)行結(jié)果如圖10.10所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2okGh7GG-1639056667657)(OpenCV進(jìn)階篇.assets/image-20211122090014973.png)]

? 圖10.10 從2幅圖像中選擇最佳的匹配結(jié)果

網(wǎng)速的提升讓容量較大的文件更容易在互聯(lián)網(wǎng)上傳播,最明顯結(jié)果就是現(xiàn)在用戶(hù)計(jì)算機(jī)里被堆滿(mǎn)了各種各樣的圖像文件。
圖像文件與其他文件不同,相同內(nèi)容的圖像可能保存在不同大小、不同格式的文件中,這些文件的二進(jìn)制字節(jié)碼差別較大,很難用簡(jiǎn)單的程序識(shí)別。在沒(méi)有高級(jí)識(shí)別軟件的情況下想要找出內(nèi)容相同的圖像就只能一個(gè)一個(gè)打開(kāi)用肉眼識(shí)別了。
OpenCV能夠打破圖像文件規(guī)格、格式的限制來(lái)識(shí)別圖像內(nèi)容。

【實(shí)例10.3】 查找重復(fù)的圖像。
圖10.11所示的文件夾中有10幅圖像,這些圖像不僅有JPG格式的,還有PNG格式的,而且這些圖像的分辨率也各不相同。接下來(lái)將編寫(xiě)一個(gè)程序,在該文件夾中找出哪些是重復(fù)的照片。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-bny5k3Mh-1639056667657)(OpenCV進(jìn)階篇.assets/image-20211122090116485.png)]

? 圖10.11 文件夾中的所有照片文件
想要解決這個(gè)問(wèn)題,可以使用OpenCV提供的matchTemplate()方法來(lái)判斷2幅圖像的相似度,如果相似度大于0.9,就認(rèn)為這2幅圖像是相同的。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-0MWgYl4D-1639056667658)(OpenCV進(jìn)階篇.assets/image-20211122090219888.png)]

上述代碼的運(yùn)行結(jié)果如下:

相同的照片:10.png, 4.jpg,相同的照片:2.jpg, 5.jpg, 9.png,

10.2.2 多目標(biāo)匹配

多目標(biāo)匹配需要將原始圖像中所有與模板相似的圖像都找出來(lái),使用相關(guān)匹配或相關(guān)系數(shù)匹配可以很好地實(shí)現(xiàn)這個(gè)功能。如果計(jì)算結(jié)果大于某值(例如0.999),則認(rèn)為匹配區(qū)域的圖案和模板是相同的。

【實(shí)例10.4】 為原始圖片中所有匹配成功的圖案繪制紅框。
將圖10.12作為模板,將圖10.13作為原始圖像。原始圖像中有很多重復(fù)的圖案,每一個(gè)與模板相似的圖案都需要被標(biāo)記出來(lái)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sPJngqiS-1639056667658)(OpenCV進(jìn)階篇.assets/image-20211122090300666.png)]

? 圖10.12 模板

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-z3YHi9fS-1639056667658)(OpenCV進(jìn)階篇.assets/image-20211122090321173.png)]

? 圖10.13 包含重復(fù)內(nèi)容的原始圖像
使用cv2.TM_CCOEFF_NORMED方法進(jìn)行模板匹配,使用for循環(huán)遍歷matchTemplate()方法返回的結(jié)果,找到所有大于0.99的計(jì)算結(jié)果,在這些結(jié)果的對(duì)應(yīng)區(qū)域位置繪制紅色矩形邊框。編寫(xiě)代碼時(shí)要注意:數(shù)組的列數(shù)在圖像坐標(biāo)系中為橫坐標(biāo),數(shù)組的行數(shù)在圖像坐標(biāo)系中為縱坐標(biāo)。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9AHVz1kN-1639056667658)(OpenCV進(jìn)階篇.assets/image-20211122090346039.png)]

上述代碼的運(yùn)行結(jié)果如圖10.14所示,程序找到了3處與模板相似的圖案。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Z1Eg2Ozz-1639056667659)(OpenCV進(jìn)階篇.assets/image-20211122090426271.png)]

? 圖10.14 匹配結(jié)果
多目標(biāo)匹配在實(shí)際生活中有很多應(yīng)用場(chǎng)景。例如,統(tǒng)計(jì)一條快軌線路的站臺(tái)總數(shù);同一地點(diǎn)附近有2個(gè)地鐵站,優(yōu)先選擇直線距離最短的地鐵站等。

【實(shí)例10.5】 統(tǒng)計(jì)一條快軌線路的站臺(tái)總數(shù)。
將圖10.15作為模板,圖10.16作為原始圖像,在原始圖像中標(biāo)記快軌線路各個(gè)站臺(tái),統(tǒng)計(jì)這條快軌線路的站臺(tái)總數(shù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qnkqoHAG-1639056667659)(OpenCV進(jìn)階篇.assets/image-20211122090450906.png)]

? 圖10.15 模板

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TKvqjLpo-1639056667659)(OpenCV進(jìn)階篇.assets/image-20211122090516424.png)]

? 圖10.16 原始圖像
使用cv2.TM_CCOEFF_NORMED方法進(jìn)行模板匹配,使用for循環(huán)遍歷matchTemplate()方法返回的結(jié)果,找到所有大于0.99的計(jì)算結(jié)果,在這些結(jié)果的對(duì)應(yīng)區(qū)域位置繪制藍(lán)色矩形邊框,代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-PcXPP4GV-1639056667660)(OpenCV進(jìn)階篇.assets/image-20211122090545588.png)]

上述代碼的運(yùn)行結(jié)果如圖10.17所示。
實(shí)例10.5第6行中的results包含所有藍(lán)色矩形邊框左上角的橫、縱坐標(biāo)。利用這一特點(diǎn),還可以模擬“同一地點(diǎn)附近有2個(gè)地鐵站,優(yōu)先選擇直線距離最短的地鐵站”這一生活場(chǎng)景,模板如圖10.18所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-FOlMVoCl-1639056667660)(OpenCV進(jìn)階篇.assets/image-20211122090628716.png)]

? 圖10.17 統(tǒng)計(jì)一條快軌線路的站臺(tái)總數(shù)

【實(shí)例10.6】 優(yōu)先選擇直線距離最短的地鐵站。
如圖10.19所示,坐標(biāo)為(62, 150)的地點(diǎn)附近有人民廣場(chǎng)和解放大路兩個(gè)地鐵站,如何優(yōu)先選擇直線距離最短的地鐵站呢?首先將圖10.18作為模板,將圖10.19作為原始圖像,然后在原始圖像中標(biāo)記出這兩個(gè)地鐵站,最后計(jì)算并比較坐標(biāo)為(62, 150)這個(gè)地點(diǎn)與這兩個(gè)地鐵站的直線距離。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sZTp2jPj-1639056667660)(OpenCV進(jìn)階篇.assets/image-20211122090830746.png)]

? 圖10.18 模板

? 圖10.19 原始圖像
使用cv2.TM_CCOEFF_NORMED方法進(jìn)行模板匹配,使用for循環(huán)遍歷matchTemplate()方法返回的結(jié)果,找到所有大于0.99的計(jì)算結(jié)果,在這些結(jié)果的對(duì)應(yīng)區(qū)域位置繪制藍(lán)色矩形邊框,分別計(jì)算(62,150)到藍(lán)色矩形邊框左上角的距離,用綠色線段標(biāo)記出直線距離最短的地鐵站,代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-0DHd3yX7-1639056667660)(OpenCV進(jìn)階篇.assets/image-20211122091313117.png)]

上述代碼的運(yùn)行結(jié)果如圖10.20所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-v9DG7tnQ-1639056667661)(OpenCV進(jìn)階篇.assets/image-20211122091347963.png)]

? 圖10.20 優(yōu)先選擇直線距離最短的地鐵站

10.3 多模板匹配

匹配過(guò)程中同時(shí)查找多個(gè)模板的操作叫多模板匹配。多模板匹配實(shí)際上就是進(jìn)行了n次“單模板多目標(biāo)匹配”操作,n的數(shù)量為模板總數(shù)。【實(shí)例10.7】 同時(shí)匹配3個(gè)不同的模板。
將圖10.21~圖10.23作為模板,將圖10.24(a)作為原始圖像。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3YCOPde6-1639056667661)(OpenCV進(jìn)階篇.assets/image-20211122091419764.png)]

? 圖10.21 模板1

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-r9yUEVDC-1639056667661)(OpenCV進(jìn)階篇.assets/image-20211122091440162.png)]

? 圖10.22 模板2

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-m1bOnojo-1639056667662)(OpenCV進(jìn)階篇.assets/image-20211122091458891.png)]

? 圖10.23 模板3
每一個(gè)模板都要做一次“單模板多目標(biāo)匹配”,最后把所有模板的匹配結(jié)果匯總到一起。“單模板多目標(biāo)匹配”的過(guò)程可以封裝成一個(gè)方法,方法參數(shù)為模板和原始圖像,方法內(nèi)部將計(jì)算結(jié)果再加工一下,直接返回所有紅框左上角和右下角兩點(diǎn)橫縱坐標(biāo)的列表。在方法之外,將所有模板計(jì)算得出的坐標(biāo)匯總到一個(gè)列表中,按照這些匯總的坐標(biāo)一次性將所有紅框都繪制出來(lái)。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9ElkKc33-1639056667662)(OpenCV進(jìn)階篇.assets/image-20211122091539261.png)]

上述代碼的運(yùn)行效果如圖10.24(b)所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Uph18qmS-1639056667662)(OpenCV進(jìn)階篇.assets/image-20211122091621151.png)]

? 圖10.24 多模板匹配效果
使用多模板匹配能夠解決很多生活中的實(shí)際問(wèn)題。例如,一個(gè)收費(fèi)停車(chē)場(chǎng)有4個(gè)車(chē)位,車(chē)位上陸續(xù)地停放了4輛車(chē),通過(guò)多模板匹配,能夠知曉這4輛車(chē)分別停在了哪個(gè)車(chē)位上。接下來(lái)將模擬這一生活場(chǎng)景。

【實(shí)例10.8】 使用多模板匹配讓控制臺(tái)判斷4輛車(chē)分別停在了哪個(gè)車(chē)位上。
有4輛車(chē)按圖10.25~圖10.28的順序陸續(xù)駛?cè)胪\?chē)場(chǎng),這4輛車(chē)停在4個(gè)車(chē)位上的效果如圖10.29所示。將圖10.25~圖10.28作為模板,將圖10.29作為原始圖像,使用cv2. TM_CCOEFF_NORMED方式進(jìn)行模板匹配,在原始圖像中找到與4個(gè)模板一樣的圖像后,在控制臺(tái)上輸出這4輛車(chē)分別停在了哪個(gè)車(chē)位上。

說(shuō)明
在圖10.29中,1號(hào)車(chē)位水平像素的取值范圍是0200,2號(hào)車(chē)位水平像素的取值范圍是200433,3號(hào)車(chē)位水平像素的取值范圍是433656,4號(hào)車(chē)位水平像素的取值范圍是656871。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dnthllJ8-1639056667662)(OpenCV進(jìn)階篇.assets/image-20211122091712450.png)]

? 圖10.25 模板1

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Yj96pba2-1639056667663)(OpenCV進(jìn)階篇.assets/image-20211122091731718.png)]

? 圖10.26 模板2

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-jvSXLJN1-1639056667663)(OpenCV進(jìn)階篇.assets/image-20211122091750330.png)]

? 圖10.27 模板3

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-p9XHjoRB-1639056667663)(OpenCV進(jìn)階篇.assets/image-20211122091808719.png)]

? 圖10.28 模板4

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-H2QimGeQ-1639056667663)(OpenCV進(jìn)階篇.assets/image-20211122091825529.png)]

? 圖10.29 原始圖像
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xUmuJe8T-1639056667664)(OpenCV進(jìn)階篇.assets/image-20211122091850011.png)]

上述代碼的運(yùn)行結(jié)果如下:

車(chē)位編號(hào): 4車(chē)位編號(hào): 3車(chē)位編號(hào): 2車(chē)位編號(hào): 1

上面的結(jié)果可以得出以下結(jié)論:圖10.25所示的車(chē)輛停在了4號(hào)車(chē)位上,圖10.26所示的車(chē)輛停在了3號(hào)車(chē)位上,圖10.27所示的車(chē)輛停在了2號(hào)車(chē)位上,圖10.28所示的車(chē)輛停在了1號(hào)車(chē)位上。

10.4 小結(jié)

模板匹配包括單模板匹配和多模板匹配,單模板匹配又包括單目標(biāo)匹配和多目標(biāo)匹配。實(shí)現(xiàn)這些內(nèi)容的基礎(chǔ)方法就是模板匹配方法,即matchTemplate()方法。其中,重點(diǎn)掌握模板匹配方法的6個(gè)參數(shù)值。此外,為了實(shí)現(xiàn)單目標(biāo)匹配,除了需要使用模板匹配方法matchTemplate()外,還要使用minMaxLoc()方法,這個(gè)方法返回的就是單目標(biāo)匹配的最優(yōu)結(jié)果。對(duì)于多目標(biāo)匹配,要將它和多模板匹配區(qū)分開(kāi):多目標(biāo)匹配只有一個(gè)模板,而多模板匹配則有多個(gè)模板。

第11章 濾波器

在盡量保留原圖像信息的情況下,去除圖像內(nèi)噪聲、降低細(xì)節(jié)層次信息等一系列過(guò)程,叫作圖像的平滑處理(或圖像的模糊處理)。實(shí)現(xiàn)平滑處理最常用的工具就是濾波器。通過(guò)調(diào)節(jié)濾波器的參數(shù),可以控制圖像的平滑程度。OpenCV提供了種類(lèi)豐富的濾波器,每種濾波器使用的算法均不同,但都能對(duì)圖像中的像素值進(jìn)行微調(diào),讓圖像呈現(xiàn)平滑效果。本章將介紹均值濾波器、中值濾波器、高斯濾波器和雙邊濾波器的使用方法。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-vSWZ4Fzw-1639056667664)(OpenCV進(jìn)階篇.assets/image-20211122092213657.png)]

11.1 均值濾波器

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xl2LLuQr-1639056667664)(OpenCV進(jìn)階篇.assets/image-20211122092621030.png)]

? 圖11.1 噪聲圖像
圖像中可能會(huì)出現(xiàn)這樣一種像素,該像素與周?chē)袼氐牟顒e非常大,導(dǎo)致從視覺(jué)上就能看出該像素?zé)o法與周?chē)袼亟M成可識(shí)別的圖像信息,降低了整個(gè)圖像的質(zhì)量。這種“格格不入”的像素就是圖像的噪聲。如果圖像中的噪聲都是隨機(jī)的純黑像素或者純白像素,這樣的噪聲稱(chēng)作“椒鹽噪聲”或“鹽噪聲”。例如如圖7.1所示的就是一幅只有噪聲的圖像,常稱(chēng)為“雪花點(diǎn)”。
以一個(gè)像素為核心,其周?chē)袼乜梢越M成一個(gè)n行n列(簡(jiǎn)稱(chēng)n×n)的矩陣,這樣的矩陣結(jié)構(gòu)在濾波操作中被稱(chēng)為“濾波核”。矩陣的行、列數(shù)決定了濾波核的大小,如圖11.2所示的濾波核大小為3×3,包含9個(gè)像素;圖11.3所示的濾波核大小為5×5,包含25個(gè)像素。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-A7X4TOAK-1639056667665)(OpenCV進(jìn)階篇.assets/image-20211122092605201.png)]

? 圖11.2 3×3的濾波核

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pYkMEF6M-1639056667665)(OpenCV進(jìn)階篇.assets/image-20211122092712502.png)]

? 圖11.3 5×5的濾波核
均值濾波器(也稱(chēng)為低通濾波器)可以把圖像中的每一個(gè)像素都當(dāng)成濾波核的核心,然后計(jì)算核內(nèi)所有像素的平均值,最后讓核心像素值等于這個(gè)平均值。
例如,圖11.4就是均值濾波的計(jì)算過(guò)程。濾波核大小為3×3,核心像素值是35,顏色較深,周?chē)袼刂刀紴?10~150,因此可以認(rèn)為核心像素是噪聲。將濾波核中的所有像素值相加,然后除以像素個(gè)數(shù),就得出了平均值123(四舍五入取整)。將核心像素的值改成123,其顏色就與周?chē)伾顒e不大,圖像就變得平滑了。這就是均值濾波去噪的原理。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-U0Y6zVrq-1639056667665)(OpenCV進(jìn)階篇.assets/image-20211122092745945.png)]

? 圖11.4 均值濾波的計(jì)算過(guò)程
OpenCV將均值濾波器封裝成blur()方法,其語(yǔ)法如下:

dst = cv2.blur(src, ksize, anchor, borderType)

參數(shù)說(shuō)明:

src:被處理的圖像。

ksize:濾波核大小,其格式為(高度,寬度),建議使用如(3, 3)、(5, 5)、(7, 7)等寬、高相等的奇數(shù)邊長(zhǎng)。濾波核越大,處理之后的圖像就越模糊。

anchor:可選參數(shù),濾波核的錨點(diǎn),建議采用默認(rèn)值,可以自動(dòng)計(jì)算錨點(diǎn)。

borderType:可選參數(shù),邊界樣式,建議采用默認(rèn)值。

返回值說(shuō)明:

dst:經(jīng)過(guò)均值濾波處理之后的圖像。

【實(shí)例11.1】 對(duì)花朵圖像進(jìn)行均值濾波操作。
分別使用大小為3×3、5×5和9×9的濾波核對(duì)花朵圖像進(jìn)行均值濾波操

作,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-iSHWrz2c-1639056667665)(OpenCV進(jìn)階篇.assets/image-20211122094217442.png)]

上述代碼的運(yùn)行結(jié)果如圖11.5所示,從這個(gè)結(jié)果可以看出,濾波核越大,處理之后的圖像就越模糊。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-5tDKOosJ-1639056667666)(OpenCV進(jìn)階篇.assets/image-20211122092914325.png)]

? 圖11.5 圖像均值濾波效果

11.2 中值濾波器

中值濾波器的原理與均值濾波器非常相似,唯一的不同就是不計(jì)算像素的平均值,而是將所有像素值排序,把最中間的像素值取出,賦值給核心像素。

例如,圖11.6就是中值濾波的計(jì)算過(guò)程。濾波核大小為3×3,核心像素值是35,周?chē)袼刂刀紴?10~150。將核內(nèi)所有像素值按升序排列,9個(gè)像素值排成一行,最中間位置為第5個(gè)位置,這個(gè)位置的像素值為131。不需再做任何計(jì)算,直接把131賦值給核心像素,其顏色就與周?chē)伾顒e不大,圖像就變得平滑了。這就是中值濾波去噪的原理。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ggPwhx8h-1639056667666)(OpenCV進(jìn)階篇.assets/image-20211122095233594.png)]

圖11.6 中值濾波的計(jì)算過(guò)程
OpenCV將中值濾波器封裝成medianBlur()方法,其語(yǔ)法如下:

dst = cv2.medianBlur(src, ksize)

參數(shù)說(shuō)明:

src:被處理的圖像。

ksize:濾波核的邊長(zhǎng),必須是大于1的奇數(shù),如3、5、7等。該方法根據(jù)此邊長(zhǎng)自動(dòng)創(chuàng)建一個(gè)正方形的濾波核。

返回值說(shuō)明:

dst:經(jīng)過(guò)中值濾波處理之后的圖像。

注意
中值濾波器的ksize參數(shù)是邊長(zhǎng),而其他濾波器的ksize參數(shù)通常為(高,寬)。

【實(shí)例11.2】 對(duì)花朵圖像進(jìn)行中值濾波操作.
分別使用邊長(zhǎng)為3、5、9的濾波核對(duì)花朵圖像進(jìn)行中值濾波操作,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-gRpNOjqx-1639056667666)(OpenCV進(jìn)階篇.assets/image-20211122095347319.png)]

上述代碼的運(yùn)行結(jié)果如圖11.7所示,濾波核的邊長(zhǎng)越長(zhǎng),處理之后的圖像就越模糊。中值濾波處理的圖像會(huì)比均值濾波處理的圖像丟失更多細(xì)節(jié)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-nvL2Le6F-1639056667666)(OpenCV進(jìn)階篇.assets/image-20211122095440078.png)]

? 圖11.7 圖像中值濾波效果

11.3 高斯濾波器

高斯濾波也被稱(chēng)為高斯模糊或高斯平滑,是目前應(yīng)用最廣泛的平滑處理算法。高斯濾波可以很好地在降低圖片噪聲、細(xì)節(jié)層次的同時(shí)保留更多的圖像信息,經(jīng)過(guò)處理的圖像呈現(xiàn)“磨砂玻璃”的濾鏡效果。
進(jìn)行均值濾波處理時(shí),核心周?chē)總€(gè)像素的權(quán)重都是均等的,也就是每個(gè)像素都同樣重要,所以計(jì)算平均值即可。但在高斯濾波中,越靠近核心的像素權(quán)重越大,越遠(yuǎn)離核心的像素權(quán)重越小,例如5×5大小的高斯濾波卷積核的權(quán)重示意圖如圖11.8所示。像素權(quán)重不同不能取平均值,要從權(quán)重大的像素中取較多的信息,從權(quán)重小的像素中取較少的信息。簡(jiǎn)單概括就是“離誰(shuí)更近,跟誰(shuí)更像”。
高斯濾波的計(jì)算過(guò)程涉及卷積運(yùn)算,會(huì)有一個(gè)與濾波核大小相等的卷積核。本節(jié)僅以3×3的濾波核為例,簡(jiǎn)單地描述一下高斯濾波的計(jì)算過(guò)程。
卷積核中保存的值就是核所覆蓋區(qū)域的權(quán)重值,其遵循圖11.8的規(guī)律。卷積核中所有權(quán)重值相加的結(jié)果為1。例如,3×3的卷積核可以是如圖11.9所示的值。隨著核大小、σ標(biāo)準(zhǔn)差的變化,卷積核中的值也會(huì)發(fā)生較大變化,圖11.9僅是一種最簡(jiǎn)單的情況。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-bUJTJIJq-1639056667667)(OpenCV進(jìn)階篇.assets/image-20211122095530857.png)]

? 圖11.8 5×5的高斯濾波卷積核的權(quán)重示意圖

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-4h3BuqBO-1639056667667)(OpenCV進(jìn)階篇.assets/image-20211122095559972.png)]

? 圖11.9 簡(jiǎn)化的3×3的卷積核
進(jìn)行高斯濾波的過(guò)程中,濾波核中像素與卷積核進(jìn)行卷積計(jì)算,最后將計(jì)算結(jié)果賦值給濾波核的核心像素。其計(jì)算過(guò)程如圖11.10所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-f24HEXuv-1639056667667)(OpenCV進(jìn)階篇.assets/image-20211122095620790.png)]

? 圖11.10 像素與卷積核進(jìn)行卷積計(jì)算
在圖11.10的計(jì)算過(guò)程中,濾波核中的每個(gè)像素值都與卷積核對(duì)應(yīng)位置的權(quán)重值相乘,最后計(jì)算出9個(gè)值,計(jì)算過(guò)程如下:

137 × 0.05 150 × 0.1 125 × 0.05 6.85 15 6.25141 × 0.1 35 × 0.4 131 × 0.1 = 14.1 14 13.1119 × 0.05 118 × 0.1 150 × 0.05 5.95 11.8 7.5

讓這9個(gè)值相加,再四舍五入取整,計(jì)算過(guò)程如下:

6.85 + 15 + 6.25 + 14.1 + 14 + 13.1 + 5.95 + 11.8 + 7.5 = 94.55 ≈ 95

最后得到的這個(gè)結(jié)果就是高斯濾波的計(jì)算結(jié)果,濾波核的核心像素值從35改為95。
OpenCV將高斯濾波器封裝成了GaussianBlur()方法,其語(yǔ)法如下:

dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

參數(shù)說(shuō)明:

src:被處理的圖像。

ksize:濾波核的大小,寬高必須是奇數(shù),如(3, 3)、(5, 5)等。

sigmaX:卷積核水平方向的標(biāo)準(zhǔn)差。

sigmaY:卷積核垂直方向的標(biāo)準(zhǔn)差。 修改sigmaX或sigmaY的值都可以改變卷積核中的權(quán)重比例。如果不知道如何設(shè)計(jì)這2個(gè)參數(shù)值,就直接把這2個(gè)參數(shù)的值寫(xiě)成0,該方法就會(huì)根據(jù)濾波核的大小自動(dòng)計(jì)算合適的權(quán)重比例。

borderType:可選參數(shù),邊界樣式,建議使用默認(rèn)值。

返回值說(shuō)明:

dst:經(jīng)過(guò)高斯濾波處理之后的圖像。

【實(shí)例11.3】 對(duì)花朵圖像進(jìn)行高斯濾波操作。
分別使用大小為5×5、9×9和15×15的濾波核對(duì)花朵圖像進(jìn)行高斯濾波操作,水平方向和垂直方向的標(biāo)準(zhǔn)差參數(shù)值全部為0,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-tbfymlO2-1639056667667)(OpenCV進(jìn)階篇.assets/image-20211122095728517.png)]

上述代碼的運(yùn)行結(jié)果如圖11.11所示,濾波核越大,處理之后的圖像就越模糊。和均值濾波、中值濾波處理的圖像相比,高斯濾波處理的圖像更加平滑,保留的圖像信息更多,更容易辨認(rèn)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zXsixYC9-1639056667668)(OpenCV進(jìn)階篇.assets/image-20211122095747712.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qobIEi1N-1639056667668)(OpenCV進(jìn)階篇.assets/image-20211122095856218.png)]

? 圖11.11 圖像的高斯濾波效果

11.4 雙邊濾波器

不管是均值濾波、中值濾波還是高斯濾波,都會(huì)使整幅圖像變得平滑,圖像中的邊界會(huì)變得模糊不清。雙邊濾波是一種在平滑處理過(guò)程中可以有效保護(hù)邊界信息的濾波操作方法。
雙邊濾波器自動(dòng)判斷濾波核處于“平坦”區(qū)域還是“邊緣”區(qū)域:如果濾波核處于“平坦”區(qū)域,則會(huì)使用類(lèi)似高斯濾波的算法進(jìn)行濾波;如果濾波核處于“邊緣”區(qū)域,則加大“邊緣”像素的權(quán)重,盡可能地讓這些像素值保持不變。
例如,圖11.12是一幅黑白拼接圖像,對(duì)這幅圖像進(jìn)行高斯濾波,黑白交界處就會(huì)變得模糊不清,效果如圖11.13所示,但如果對(duì)這幅圖像進(jìn)行雙邊濾波,黑白交界處的邊界則可以很好地保留下來(lái),效果如圖11.14所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9NOGA35w-1639056667668)(OpenCV進(jìn)階篇.assets/image-20211122095927108.png)]

? 圖11.12 原圖

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9Wt7UHEi-1639056667668)(OpenCV進(jìn)階篇.assets/image-20211122095943849.png)]

? 圖11.13 高斯濾波效果

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-cERKh8Ud-1639056667669)(OpenCV進(jìn)階篇.assets/image-20211122100141070.png)]

? 圖11.14 雙邊濾波效果
OpenCV將雙邊濾波器封裝成bilateralFilter()方法,其語(yǔ)法如下:

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

參數(shù)說(shuō)明:

src:被處理的圖像。

d:以當(dāng)前像素為中心的整個(gè)濾波區(qū)域的直徑。如果d<0,則自動(dòng)根據(jù)sigmaSpace參數(shù)計(jì)算得到。該值與保留的邊緣信息數(shù)量成正比,與方法運(yùn)行效率成反比。

sigmaColor:參與計(jì)算的顏色范圍,這個(gè)值是像素顏色值與周?chē)伾档淖畲蟛钪?#xff0c;只有顏色值之差小于這個(gè)值時(shí),周?chē)南袼夭胚M(jìn)行濾波計(jì)算。值為255時(shí),表示所有顏色都參與計(jì)算。

sigmaSpace:坐標(biāo)空間的σ(sigma)值,該值越大,參與計(jì)算的像素?cái)?shù)量就越多。

borderType:可選參數(shù),邊界樣式,建議默認(rèn)。
返回值說(shuō)明:

dst:經(jīng)過(guò)雙邊濾波處理之后的圖像。

【實(shí)例11.4】 對(duì)比高斯濾波和雙邊濾波的處理效果。

使用大小為(15, 15)的濾波核對(duì)花朵圖像進(jìn)行高斯濾波處理,同樣使用15作為范圍直徑對(duì)花朵圖像進(jìn)行雙邊濾波處理,觀察兩種濾波處理之后的圖像邊緣有什么差別,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-o1vvrKgX-1639056667669)(OpenCV進(jìn)階篇.assets/image-20211122100239643.png)]

上述代碼的運(yùn)行結(jié)果如圖11.15所示,可以看出高斯濾波模糊了整個(gè)畫(huà)面,但雙邊濾波保留了較清晰的邊緣信息。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-iL70Jm9W-1639056667669)(OpenCV進(jìn)階篇.assets/image-20211122100319332.png)]

? 圖11.15 兩種濾波方法效果對(duì)比

11.5 小結(jié)

噪聲指的是一幅圖像內(nèi)部的、高亮度的像素點(diǎn)。圖像平滑處理是指在盡量保留原圖像信息的情況下,去除圖像內(nèi)部的這些高亮度的像素點(diǎn)(也就是“噪聲”)。為了實(shí)現(xiàn)圖像平滑處理,需要的工具就是濾波器。本章主要講解了OpenCV中的4種濾波器,雖然每種濾波器的實(shí)現(xiàn)原理都不同,但是每種濾波器都能對(duì)圖像進(jìn)行圖像平滑處理。讀者朋友在掌握這4種濾波器的實(shí)現(xiàn)方法的同時(shí),也要熟悉這4種濾波器的實(shí)現(xiàn)原理。

第12章 腐蝕與膨脹

腐蝕和膨脹是圖像形態(tài)學(xué)中的兩種核心操作,通過(guò)這兩種操作可以清除或強(qiáng)化圖像中的細(xì)節(jié)。合理使用腐蝕和膨脹,還可以實(shí)現(xiàn)圖像開(kāi)運(yùn)算、閉運(yùn)算、梯度運(yùn)算、頂帽運(yùn)算和黑帽運(yùn)算等極具特點(diǎn)的操作。下面將對(duì)腐蝕、膨脹以及其他形態(tài)學(xué)操作進(jìn)行詳細(xì)的介紹。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BU9Hvg54-1639056667669)(OpenCV進(jìn)階篇.assets/image-20211125193906728.png)]

12.1 腐蝕

腐蝕操作可以讓圖像沿著自己的邊界向內(nèi)收縮。OpenCV通過(guò)“核”來(lái)實(shí)現(xiàn)收縮計(jì)算。“核”的英文名為kernel,在形態(tài)學(xué)中可以理解為“由n個(gè)像素組成的像素塊”,像素塊包含一個(gè)核心(核心通常在中央位置,也可以定義在其他位置)。像素塊在圖像的邊緣移動(dòng),在移動(dòng)過(guò)程中,核會(huì)將圖像邊緣那些與核重合但又沒(méi)有越過(guò)核心的像素點(diǎn)都抹除,效果類(lèi)似圖12.1所示的過(guò)程,就像削土豆皮一樣,將圖像一層一層地“削薄”。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TcHfD008-1639056667670)(OpenCV進(jìn)階篇.assets/image-20211125193959328.png)]

? 圖12.1 核腐蝕圖像中的像素

OpenCV將腐蝕操作封裝成erode()方法,該方法的語(yǔ)法如下:

dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)

參數(shù)說(shuō)明:

src:原始圖像。

kernel:腐蝕使用的核。

anchor:可選參數(shù),核的錨點(diǎn)位置。

iterations:可選參數(shù),腐蝕操作的迭代次數(shù),默認(rèn)值為1。

borderType:可選參數(shù),邊界樣式,建議默認(rèn)。

borderValue:可選參數(shù),邊界值,建議默認(rèn)。

返回值說(shuō)明:

dst:經(jīng)過(guò)腐蝕之后的圖像。
圖像經(jīng)過(guò)腐蝕操作之后,可以抹除一些外部的細(xì)節(jié),如圖12.2所示是一個(gè)卡通小蜘蛛,如果用一個(gè)5×5的像素塊作為核對(duì)小蜘蛛進(jìn)行腐蝕操作,可以得到如圖12.3所示的結(jié)果。小蜘蛛的腿被當(dāng)成外部細(xì)節(jié)抹除了,同時(shí)小蜘蛛的眼睛變大了,因?yàn)楹藦膬?nèi)部也“削”了一圈。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-GQuX4pYe-1639056667670)(OpenCV進(jìn)階篇.assets/image-20211125194100364.png)]

? 圖12.2 原圖

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LO9YgMC8-1639056667670)(OpenCV進(jìn)階篇.assets/image-20211125194124001.png)]

? 圖12.3 腐蝕之后的圖像
在OpenCV做腐蝕或其他形態(tài)學(xué)操作時(shí),通常使用numpy模塊來(lái)創(chuàng)建核數(shù)組,例如:

import numpy as npk = np.ones((5, 5), np.uint8)

這兩行代碼就是通過(guò)numpy模塊的ones()方法創(chuàng)建了一個(gè)5行5列(簡(jiǎn)稱(chēng)5×5)、數(shù)字類(lèi)型為無(wú)符號(hào)8位整數(shù)、每一個(gè)數(shù)字的值都是1的數(shù)組,這個(gè)數(shù)組作為erode()方法的核參數(shù)。除了5×5的結(jié)構(gòu),還可以使用3×3、9×9、11×11等結(jié)構(gòu),行列數(shù)越大,計(jì)算出的效果就越粗糙,行列數(shù)越小,計(jì)算出的效果就越精細(xì)。

【實(shí)例12.1】 將仙人球圖像中的刺抹除。
仙人球的葉子呈針狀,莖呈深綠色,如圖12.4所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-iwTvCycU-1639056667670)(OpenCV進(jìn)階篇.assets/image-20211125194225098.png)]

? 圖12.4 仙人球
使用3×3的核對(duì)仙人球圖像進(jìn)行腐蝕操作,可以將圖像里的刺抹除,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-DnkLOVsV-1639056667671)(OpenCV進(jìn)階篇.assets/image-20211125194308740.png)]

上述代碼的運(yùn)行結(jié)果如圖12.5所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-B3Eqc3hN-1639056667671)(OpenCV進(jìn)階篇.assets/image-20211125194341145.png)]

? 圖12.5 圖像腐蝕操作效果

12.2 膨脹

膨脹操作與腐蝕操作相反,膨脹操作可以讓圖像沿著自己的邊界向內(nèi)擴(kuò)張。同樣是通過(guò)核來(lái)計(jì)算,當(dāng)核在圖像的邊緣移動(dòng)時(shí),核會(huì)將圖像邊緣填補(bǔ)新的像素,效果類(lèi)似圖12.6所示的過(guò)程,就像在一面墻上反反復(fù)復(fù)地涂水泥,讓墻變得越來(lái)越厚。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-0jW88y9z-1639056667671)(OpenCV進(jìn)階篇.assets/image-20211125194443041.png)]

? 圖12.6 核填補(bǔ)圖像中的像素
OpenCV將膨脹操作封裝成dilate()方法,該方法的語(yǔ)法如下:

dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)

參數(shù)說(shuō)明:

src:原始圖像。

kernel:膨脹使用的核。

anchor:可選參數(shù),核的錨點(diǎn)位置。

iterations:可選參數(shù),腐蝕操作的迭代次數(shù),默認(rèn)值為1。

borderType:可選參數(shù),邊界樣式,建議默認(rèn)。

borderValue:可選參數(shù),邊界值,建議默認(rèn)。
返回值說(shuō)明:

dst:經(jīng)過(guò)膨脹之后的圖像。
圖像經(jīng)過(guò)膨脹操作之后,可以放大一些外部的細(xì)節(jié),如圖12.7(a)所示的卡通小蜘蛛,如果用一個(gè)5×5的像素塊作為核對(duì)小蜘蛛進(jìn)行膨脹操作,可以得到如圖12.7(b)所示的結(jié)果,小蜘蛛不僅腿變粗了,而且連眼睛都胖沒(méi)了。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-5Tq4mt3A-1639056667672)(OpenCV進(jìn)階篇.assets/image-20211125194535307.png)]

? 圖12.7 圖像膨脹操作效果

【實(shí)例12.2】 將圖像加工成“近視眼”效果。
近視眼由于聚焦不準(zhǔn),看東西都需要放大并且模模糊糊的,利用膨脹操作可以將正常畫(huà)面處理成近視眼看到的畫(huà)面。采用9×9的數(shù)組作為核,對(duì)圖12.8(a)進(jìn)行膨脹操作。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-QnG9jkmB-1639056667672)(OpenCV進(jìn)階篇.assets/image-20211125194619331.png)]

上述代碼的運(yùn)行結(jié)果如圖12.8所示

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6jRECH46-1639056667672)(OpenCV進(jìn)階篇.assets/image-20211125194637143.png)]

? 圖12.8 圖像膨脹操作“近視眼”效果

12.3 開(kāi)運(yùn)算

開(kāi)運(yùn)算是將圖像先進(jìn)行腐蝕操作,再進(jìn)行膨脹操作。開(kāi)運(yùn)算可以用來(lái)抹除圖像外部的細(xì)節(jié)(或者噪聲)。
例如,圖12.9是一個(gè)簡(jiǎn)單的二叉樹(shù),父子節(jié)點(diǎn)之間都有線連接。如果對(duì)此圖像進(jìn)行腐蝕操作,可以得出如圖12.10所示的圖像,連接線消失了,節(jié)點(diǎn)也比原圖節(jié)點(diǎn)小一圈。此時(shí)再執(zhí)行膨脹操作,讓縮小的節(jié)點(diǎn)恢復(fù)到原來(lái)的大小,就得到了如圖12.11所示的效果。
這3幅圖就是開(kāi)運(yùn)算的過(guò)程,從結(jié)果中可以明顯地看出:經(jīng)過(guò)開(kāi)運(yùn)算之后,二叉樹(shù)中的連接線消失了,只剩下光禿禿的節(jié)點(diǎn)。因?yàn)檫B接線被核當(dāng)成“細(xì)節(jié)”抹除了,所以利用檢測(cè)輪廓的方法可以統(tǒng)計(jì)二叉樹(shù)節(jié)點(diǎn)數(shù)量,也就是說(shuō)在某些情況下,開(kāi)運(yùn)算的結(jié)果還可以用來(lái)做數(shù)量統(tǒng)計(jì)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-YkrJfgHY-1639056667672)(OpenCV進(jìn)階篇.assets/image-20211125194659165.png)]

? 圖12.9 簡(jiǎn)單的二叉樹(shù)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-t738eTGY-1639056667673)(OpenCV進(jìn)階篇.assets/image-20211125194754294.png)]

? 圖12.10 二叉樹(shù)圖像腐蝕之后的效果

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xWsGyhUT-1639056667673)(OpenCV進(jìn)階篇.assets/image-20211125194813564.png)]

? 圖12.11 對(duì)腐蝕的圖像做膨脹操作

【實(shí)例12.3】 抹除黑種草圖像中的針狀葉子。
黑種草如圖12.12(a)所示,花呈藍(lán)色,葉子像針一樣又細(xì)又長(zhǎng),呈羽毛狀。要抹除黑種草圖像中的葉子,可以使用5×5的核對(duì)圖像進(jìn)行開(kāi)運(yùn)算。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qeCn3dVD-1639056667674)(OpenCV進(jìn)階篇.assets/image-20211125194832293.png)]

上述代碼的運(yùn)行結(jié)果如圖12.12(b)所示,經(jīng)過(guò)開(kāi)運(yùn)算后黑種草圖像雖然略為模糊,但葉子都不見(jiàn)了。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-U09O1HA7-1639056667674)(OpenCV進(jìn)階篇.assets/image-20211125194853964.png)]

? 圖12.12 圖像開(kāi)運(yùn)算效果

12.4 閉運(yùn)算

閉運(yùn)算是將圖像先進(jìn)行膨脹操作,再進(jìn)行腐蝕操作。閉運(yùn)算可以抹除圖像內(nèi)部的細(xì)節(jié)(或者噪聲)。
例如,圖12.13(a)是一個(gè)身上布滿(mǎn)斑點(diǎn)的小蜘蛛,這些斑點(diǎn)就是圖像的內(nèi)部細(xì)節(jié)。先將圖像進(jìn)行膨脹操作,小蜘蛛身上的斑點(diǎn)(包括眼睛)被抹除,效果如圖12.13(b)所示。然后再將圖像進(jìn)行腐蝕操作,膨脹的小蜘蛛恢復(fù)到原來(lái)的大小,效果如圖12.13(c)所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dJY1W62q-1639056667674)(OpenCV進(jìn)階篇.assets/image-20211125194952165.png)]

? 圖12.13 圖像閉運(yùn)算效果
這3幅圖就是閉運(yùn)算的過(guò)程,從結(jié)果中可以明顯地看出:經(jīng)過(guò)閉運(yùn)算后,小蜘蛛身上的花紋都被抹除了,就連眼睛也被當(dāng)成“細(xì)節(jié)”抹除了。
閉運(yùn)算除了會(huì)抹除圖像內(nèi)部的細(xì)節(jié),還會(huì)讓一些離得較近的區(qū)域合并成一塊區(qū)域。

【實(shí)例12.4】 對(duì)漢字圖片進(jìn)行閉運(yùn)算。
使用15×15的核對(duì)圖12.14(a)做閉運(yùn)算。因?yàn)槭褂玫暮吮容^大,很容易導(dǎo)致一些間隔較近的區(qū)域合并到一起,觀察閉運(yùn)算對(duì)漢字圖片造成了哪些影響。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-OT67bYso-1639056667675)(OpenCV進(jìn)階篇.assets/image-20211125195012305.png)]

上述代碼的運(yùn)行結(jié)果如圖12.14(b)所示,“田”字經(jīng)過(guò)閉運(yùn)算之后沒(méi)有多大變化,但是“野”字經(jīng)過(guò)閉運(yùn)算之后,許多獨(dú)立的區(qū)域因膨脹操作合并到一起,導(dǎo)致文字很難辨認(rèn)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-IJSR1zTJ-1639056667675)(OpenCV進(jìn)階篇.assets/image-20211125195103765.png)]

? 圖12.14 漢字圖片閉運(yùn)算效果

12.5 形態(tài)學(xué)運(yùn)算

腐蝕和膨脹是形態(tài)學(xué)的基礎(chǔ)操作,除了開(kāi)運(yùn)算和閉運(yùn)算以外,形態(tài)學(xué)中還有幾種比較有特點(diǎn)的運(yùn)算。OpenCV提供了一個(gè)morphologyEx()形態(tài)學(xué)方法,包含所有常用的運(yùn)算,其語(yǔ)法如下:

dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)

參數(shù)說(shuō)明:

src:原始圖像。

op:操作類(lèi)型,具體值如表12.1所示。

? 表12.1 形態(tài)學(xué)函數(shù)的操作類(lèi)型參數(shù)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-c0vMUxGs-1639056667675)(OpenCV進(jìn)階篇.assets/image-20211125195140684.png)]

kernel:操作過(guò)程中使用的核。

anchor:可選參數(shù),核的錨點(diǎn)位置。

iterations:可選參數(shù),迭代次數(shù),默認(rèn)值為1。

borderType:可選參數(shù),邊界樣式,建議默認(rèn)。

borderValue:可選參數(shù),邊界值,建議默認(rèn)。

返回值說(shuō)明:

dst:操作之后得到的圖像。
morphologyEx()方法實(shí)現(xiàn)的腐蝕、膨脹、開(kāi)運(yùn)算和閉運(yùn)算效果與前文中介紹的效果完全一致,本節(jié)不再贅述,下面將介紹3個(gè)特點(diǎn)鮮明的操作:梯度運(yùn)算、頂帽運(yùn)算和黑帽運(yùn)算。

12.5.1 梯度運(yùn)算

這里的梯度是指圖像梯度,可以簡(jiǎn)單地理解為像素的變化程度。如果幾個(gè)連續(xù)的像素,其像素值跨度越大,則梯度值越大。
梯度運(yùn)算的運(yùn)算過(guò)程如圖12.15所示,讓原圖的膨脹圖減原圖的腐蝕圖。因?yàn)榕蛎泩D比原圖大,腐蝕圖比原圖小,利用腐蝕圖將膨脹圖掏空,就得到了原圖的輪廓圖。說(shuō)明
梯度運(yùn)算中得到的輪廓圖只是一個(gè)大概輪廓,不精準(zhǔn)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9RG8msPp-1639056667675)(OpenCV進(jìn)階篇.assets/image-20211125195234243.png)]

? 圖12.15 梯度運(yùn)算過(guò)程
梯度運(yùn)算的參數(shù)為cv2.MORPH_GRADIENT,下面通過(guò)一段代碼實(shí)現(xiàn)圖12.15的效果。

【實(shí)例12.5】 通過(guò)梯度運(yùn)算畫(huà)出小蜘蛛的輪廓。
使用5×5的核對(duì)小蜘蛛圖像進(jìn)行形態(tài)學(xué)梯度運(yùn)算,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-SSqR60Jr-1639056667676)(OpenCV進(jìn)階篇.assets/image-20211125195253240.png)]

上述代碼的運(yùn)行結(jié)果如圖12.16所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8CM681z9-1639056667676)(OpenCV進(jìn)階篇.assets/image-20211125195322974.png)]

? 圖12.16 圖像梯度運(yùn)算效果

12.5.2 頂帽運(yùn)算

頂帽運(yùn)算的運(yùn)算過(guò)程如圖12.17所示,讓原圖減原圖的開(kāi)運(yùn)算圖。因?yàn)殚_(kāi)運(yùn)算抹除圖像的外部細(xì)節(jié),“有外部細(xì)節(jié)”的圖像減去“無(wú)外部細(xì)節(jié)”的圖像,得到的結(jié)果就只剩外部細(xì)節(jié)了,所以經(jīng)過(guò)頂帽運(yùn)算之后,小蜘蛛就只剩蜘蛛腿了。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-RoatuBnE-1639056667676)(OpenCV進(jìn)階篇.assets/image-20211125195410644.png)]

? 圖12.17 頂帽運(yùn)算過(guò)程
頂帽運(yùn)算的參數(shù)為cv2.MORPH_TOPHA,下面通過(guò)一段代碼實(shí)現(xiàn)圖12.18的效果。

【實(shí)例12.6】 通過(guò)頂帽運(yùn)算畫(huà)出小蜘蛛的腿。
使用5×5的核對(duì)小蜘蛛圖像進(jìn)行頂帽運(yùn)算,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-yaO8QMaA-1639056667676)(OpenCV進(jìn)階篇.assets/image-20211125195435250.png)]

上述代碼的運(yùn)算結(jié)果如圖12.18所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-FR02XNbh-1639056667677)(OpenCV進(jìn)階篇.assets/image-20211125195455237.png)]

? 圖12.18 圖像開(kāi)運(yùn)算效果

12.5.3 黑帽運(yùn)算

黑帽運(yùn)算的運(yùn)算過(guò)程如圖12.19所示,讓原圖的閉運(yùn)算圖減去原圖。因?yàn)殚]運(yùn)算抹除圖像的內(nèi)部細(xì)節(jié),“無(wú)內(nèi)部細(xì)節(jié)”的圖像減去“有內(nèi)部細(xì)節(jié)”的圖像,得到的結(jié)果就只剩內(nèi)部細(xì)節(jié)了,所以經(jīng)過(guò)黑帽運(yùn)算之后,小蜘蛛就只剩下斑點(diǎn)、花紋和眼睛了。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-1t8NX17P-1639056667677)(OpenCV進(jìn)階篇.assets/image-20211125195549507.png)]

? 圖12.19 黑帽運(yùn)算過(guò)程
黑帽運(yùn)算的參數(shù)為cv2.MORPH_BLACKHAT,下面通過(guò)一段代碼實(shí)現(xiàn)圖12.19的效果。

【實(shí)例12.7】 通過(guò)黑帽運(yùn)算畫(huà)出小蜘蛛身上的花紋。
使用5×5的核對(duì)小蜘蛛圖像進(jìn)行黑帽運(yùn)算,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ltjMfK0C-1639056667677)(OpenCV進(jìn)階篇.assets/image-20211125195624673.png)]

上述代碼的運(yùn)行結(jié)果如圖20所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-xWZgHmTZ-1639056667678)(OpenCV進(jìn)階篇.assets/image-20211125195644815.png)]

? 圖12.20 圖像黑帽運(yùn)算效果

12.6 小結(jié)

本章介紹的基礎(chǔ)內(nèi)容是腐蝕和膨脹。讀者掌握了其用法,就能輕而易舉地實(shí)現(xiàn)開(kāi)運(yùn)算和閉運(yùn)算。其中,開(kāi)運(yùn)算是對(duì)圖像先進(jìn)行腐蝕操作,再進(jìn)行膨脹操作,其作用是抹除圖像外部的細(xì)節(jié);而閉運(yùn)算是對(duì)圖像先進(jìn)行膨脹操作,再進(jìn)行腐蝕操作,其作用是抹除圖像內(nèi)部的細(xì)節(jié)。此外,形態(tài)學(xué)運(yùn)算也是構(gòu)建在腐蝕和膨脹的基礎(chǔ)上的。其中,梯度運(yùn)算是讓原圖的膨脹圖減原圖的腐蝕圖,得到的結(jié)果是原圖的輪廓;頂帽運(yùn)算是讓原圖減原圖的開(kāi)運(yùn)算圖,得到的結(jié)果是圖像的外部細(xì)節(jié);黑帽運(yùn)算是讓原圖的閉運(yùn)算圖減去原圖,得到的結(jié)果是圖像的內(nèi)部細(xì)節(jié)。

第13章 圖形檢測(cè)

圖形檢測(cè)是計(jì)算機(jī)視覺(jué)的一項(xiàng)重要功能。通過(guò)圖形檢測(cè)可以分析圖像中可能存在的形狀,然后對(duì)這些形狀進(jìn)行描繪,如搜索并繪制圖像的邊緣,定位圖像的位置,判斷圖像中有沒(méi)有直線、圓形等。雖然圖形檢測(cè)涉及非常深?yuàn)W的數(shù)學(xué)算法,但OpenCV已經(jīng)將這些算法封裝成簡(jiǎn)單的方法,開(kāi)發(fā)者只要學(xué)會(huì)如何調(diào)用方法、調(diào)整參數(shù)即可很好地實(shí)現(xiàn)檢測(cè)功能。
本章將介紹如何檢測(cè)圖像的形狀、圖像所占的區(qū)域,以及如何查找圖像中出現(xiàn)的幾何圖形等。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-JYC0QiOt-1639056667678)(OpenCV進(jìn)階篇.assets/image-20211125195758972.png)]

13.1 圖像的輪廓

輪廓是指圖像中圖形或物體的外邊緣線條。簡(jiǎn)單的幾何圖形輪廓是由平滑的線構(gòu)成的,容易識(shí)別,但不規(guī)則圖形的輪廓可能由許多個(gè)點(diǎn)構(gòu)成,識(shí)別起來(lái)比較困難。
OpenCV提供的findContours()方法可以通過(guò)計(jì)算圖像梯度來(lái)判斷圖像的邊緣,然后將邊緣的點(diǎn)封裝成數(shù)組返回。findContours()方法的語(yǔ)法如下:

contours, hierarchy = cv2.findContours(image, mode, methode)

參數(shù)說(shuō)明:

image:被檢測(cè)的圖像,必須是8位單通道二值圖像。如果原始圖像是彩色圖像,必須轉(zhuǎn)為灰度圖像,并經(jīng)過(guò)二值化處理。

mode:輪廓的檢索模式,具體值如表13.1所示。

? 表13.1 輪廓的檢索模式參數(shù)值

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qNkaxOlL-1639056667678)(OpenCV進(jìn)階篇.assets/image-20211125195942347.png)]

methode:

檢測(cè)輪廓時(shí)使用的方法,具體值如表13.2所示。

? 表13.2 檢測(cè)輪廓時(shí)使用的方法

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-FtXHcMFq-1639056667679)(OpenCV進(jìn)階篇.assets/image-20211125200003759.png)]

返回值說(shuō)明:

contours:檢測(cè)出的所有輪廓,list類(lèi)型,每一個(gè)元素都是某個(gè)輪廓的像素坐標(biāo)數(shù)組。

hierarchy:輪廓之間的層次關(guān)系。
通過(guò)findContours()方法找到圖像輪廓后,為了方便開(kāi)發(fā)人員觀測(cè),最好能把輪廓畫(huà)出來(lái),于是OpenCV提供了drawContours()方法用來(lái)繪制這些輪廓。drawContours()方法的語(yǔ)法如下:

image = cv2.drawContours(image, contours, contourIdx, color, thickness, lineTypee, hierarchy, maxLevel, offse)

參數(shù)說(shuō)明:

image:被繪制輪廓的原始圖像,可以是多通道圖像。

contours:findContours()方法得出的輪廓列表。

contourIdx:繪制輪廓的索引,如果為-1則繪制所有輪廓。

color:繪制顏色,使用BGR格式。

thickness:可選參數(shù),畫(huà)筆的粗細(xì)程度,如果該值為-1則繪制實(shí)心輪廓。

lineTypee:可選參數(shù),繪制輪廓的線型。

hierarchy:可選參數(shù),findContours()方法得出的層次關(guān)系。

maxLevel:可選參數(shù),繪制輪廓的層次深度,最深繪制第maxLevel層。

offse:可選參數(shù),偏移量,可以改變繪制結(jié)果的位置。

返回值說(shuō)明:

image:同參數(shù)中的image,執(zhí)行后原始圖中就包含繪制的輪廓了,可以不使用此返回值保存結(jié)果。

【實(shí)例13.1】 繪制幾何圖像的輪廓。
將如圖13.1所示的幾何圖像轉(zhuǎn)換成二值灰度圖像,然后通過(guò)findContours()方法找到出現(xiàn)的所有輪廓,再通過(guò)drawContours()方法將這些輪廓繪制成紅色。輪廓的檢索模式采用cv2.RETR_LIST,檢測(cè)方法采用cv2.CHAIN_APPROX_NONE。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qoQuxdG7-1639056667679)(OpenCV進(jìn)階篇.assets/image-20211125200104772.png)]

? 圖13.1 簡(jiǎn)單的幾何圖像
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-GVu7lQDW-1639056667679)(OpenCV進(jìn)階篇.assets/image-20211125200222796.png)]

上述代碼的運(yùn)行結(jié)果如圖13.2所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zu2xuce4-1639056667680)(OpenCV進(jìn)階篇.assets/image-20211125200313470.png)]

? 圖13.2 繪制全部輪廓

如果使用cv2.RETR_EXTERNAL做參數(shù)則只繪制外輪廓,關(guān)鍵代碼如下:

contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)cv2.drawContours(img, contours, -1, (0, 0, 255), 5)

繪制輪廓的效果如圖13.3所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-uJDxZ11d-1639056667680)(OpenCV進(jìn)階篇.assets/image-20211125200347818.png)]

? 圖13.3 只繪制外輪廓的效果

drawContours()方法的第3個(gè)參數(shù)可以指定繪制哪個(gè)索引的輪廓。索引的順序由輪廓的檢索模式?jīng)Q定,例如cv2.RETR_CCOMP模式下繪制索引為0的輪廓的關(guān)鍵代碼如下:

contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)cv2.drawContours(img, contours, 0, (0, 0, 255), 5)

在同樣的檢索模式下,繪制索引為1的輪廓的關(guān)鍵代碼如下:

cv2.drawContours(img, contours, 1, (0, 0, 255), 5)

繪制索引為2的輪廓的關(guān)鍵代碼如下:

cv2.drawContours(img, contours, 2, (0, 0, 255), 5)

繪制索引為3的輪廓的關(guān)鍵代碼如下:

cv2.drawContours(img, contours, 3, (0, 0, 255), 5)

繪制的效果如圖13.4~圖13.7所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-joBl7KiJ-1639056667680)(OpenCV進(jìn)階篇.assets/image-20211125200419734.png)]

? 圖13.4 繪制索引為0的輪廓

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Uo0Ak2Rq-1639056667680)(OpenCV進(jìn)階篇.assets/image-20211125200519831.png)]

? 圖13.5 繪制索引為1的輪廓

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Imm4zAV7-1639056667681)(OpenCV進(jìn)階篇.assets/image-20211125200538416.png)]

? 圖13.6 繪制索引為2的輪廓

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LqxeG8sq-1639056667681)(OpenCV進(jìn)階篇.assets/image-20211125200557884.png)]

? 圖13.7 繪制索引為3的輪廓

【實(shí)例13.2】 繪制花朵的輪廓。
為圖13.8(a)所示的花朵圖像繪制輪廓,首先要降低圖像中的噪聲干擾,進(jìn)行濾波處理,然后將圖像處理成二值灰度圖像,并檢測(cè)出輪廓,最后利用繪制輪廓的方法在原始圖像中繪制輪廓。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-tZT13iZD-1639056667681)(OpenCV進(jìn)階篇.assets/image-20211125200623625.png)]

上述代碼的運(yùn)行結(jié)果如圖13.8(b)和圖13.8(c)所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6jKwXXgp-1639056667681)(OpenCV進(jìn)階篇.assets/image-20211125200704091.png)]

? 圖12.8 繪制花朵輪廓效果

13.2 輪廓擬合

擬合是指將平面上的一系列點(diǎn),用一條光滑的曲線連接起來(lái)。輪廓的擬合就是將凹凸不平的輪廓用平整的幾何圖形體現(xiàn)出來(lái)。本節(jié)將介紹如何按照輪廓繪制矩形包圍框和圓形包圍框。

13.2.1 矩形包圍框

矩形包圍框是指圖像輪廓的最小矩形邊界。OpenCV提供的boundingRect()方法可以自動(dòng)計(jì)算輪廓最小矩形邊界的坐標(biāo)、寬和高。boundingRect()方法的語(yǔ)法如下:

retval = cv2.boundingRect (array)

參數(shù)說(shuō)明:

array:輪廓數(shù)組。

返回值說(shuō)明:

retval:元組類(lèi)型,包含4個(gè)整數(shù)值,分別是最小矩形包圍框的:左上角頂點(diǎn)的橫坐標(biāo)、左上角頂點(diǎn)的縱坐標(biāo)、矩形的寬和高。所以也可以寫(xiě)成x, y, w, h = cv2.boundingRect (array)的形式。

【實(shí)例13.3】 為爆炸圖形繪制矩形包圍框。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-33Gu2NPs-1639056667682)(OpenCV進(jìn)階篇.assets/image-20211125200758268.png)]

? 圖13.9 爆炸圖形
為圖13.9所示的爆炸圖形繪制矩形包圍框,首先判斷圖形的輪廓,使用cv2.RETR_LIST檢索所有輪廓,使用cv2.CHAIN_APPROX_SIMPLE檢索圖形所有的端點(diǎn),然后利用cv2.boundingRect()方法計(jì)算最小矩形包圍框,并通過(guò)cv2.rectangle()方法將這個(gè)矩形繪制出來(lái),具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-tWLwMjpH-1639056667682)(OpenCV進(jìn)階篇.assets/image-20211125200901021.png)]

上述代碼的運(yùn)行結(jié)果如圖13.10所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-etKSYUkz-1639056667682)(OpenCV進(jìn)階篇.assets/image-20211125200917139.png)]

? 圖13.10 爆炸圖形的最小矩形包圍框

13.2.2 圓形包圍框

圓形包圍框與矩形包圍框一樣,是圖像輪廓的最小圓形邊界。OpenCV提供的minEnclosingCircle ()方法可以自動(dòng)計(jì)算輪廓最小圓形邊界的圓心和半徑。minEnclosingCircle()方法的語(yǔ)法如下:

center, radius = cv2.minEnclosingCircle(points)

參數(shù)說(shuō)明:

points:輪廓數(shù)組。

返回值說(shuō)明:

center:元組類(lèi)型,包含2個(gè)浮點(diǎn)值,是最小圓形包圍框圓心的橫坐標(biāo)和縱坐標(biāo)。

radius:浮點(diǎn)類(lèi)型,最小圓形包圍框的半徑。

【實(shí)例13.4】 為爆炸圖形繪制圓形包圍框。
為圖13.9所示的爆炸圖形繪制矩形包圍框,首先判斷圖形的輪廓,使用cv2.RETR_LIST檢索所有輪廓,使用cv2.CHAIN_APPROX_SIMPLE檢索圖形所有的端點(diǎn),然后利用cv2. minEnclosingCircle()方法計(jì)算最小圓形包圍框,并通過(guò)cv2.circle()方法將這個(gè)矩形繪制出來(lái)。繪制過(guò)程中要注意:圓心坐標(biāo)和圓半徑都是浮點(diǎn)數(shù),在繪制之前要將浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)。
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-YzrmTuZM-1639056667682)(OpenCV進(jìn)階篇.assets/image-20211125201112737.png)]

上述代碼的運(yùn)行結(jié)果如圖13.11所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-AtkeyrKl-1639056667683)(OpenCV進(jìn)階篇.assets/image-20211125201129231.png)]

? 圖13.11 爆炸圖形的最小圓形包圍框

13.3 凸包

之前介紹了矩形包圍框和圓形包圍框,這2種包圍框雖然已經(jīng)逼近了圖形的邊緣,但這種包圍框?yàn)榱吮3謳缀涡螤?#xff0c;與圖形的真實(shí)輪廓貼合度較差。如果能找出圖形最外層的端點(diǎn),將這些端點(diǎn)連接起來(lái),就可以圍出一個(gè)包圍圖形的最小包圍框,這種包圍框叫凸包。
凸包是最逼近輪廓的多邊形,凸包的每一處都是凸出來(lái)的,也就是任意3個(gè)點(diǎn)組成的內(nèi)角均小于180°。例如,圖13.12就是凸包,而圖13.13就不是凸包。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-mNC1DLll-1639056667683)(OpenCV進(jìn)階篇.assets/image-20211125205558522.png)]

? 圖13.12 凸包

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-unNcebF6-1639056667683)(OpenCV進(jìn)階篇.assets/image-20211125205619316.png)]

? 圖13.13 不是凸包
OpenCV提供的convexHull()方法可以自動(dòng)找出輪廓的凸包,該方法的語(yǔ)法如下:

hull = cv2.convexHull(points, clockwise, returnPoints)

參數(shù)說(shuō)明:

points:輪廓數(shù)組。

clockwise:可選參數(shù),布爾類(lèi)型。當(dāng)該值為T(mén)rue時(shí),凸包中的點(diǎn)按順時(shí)針排列,為False時(shí)按逆時(shí)針排列。

returnPoints:可選參數(shù),布爾類(lèi)型。當(dāng)該值為T(mén)rue時(shí)返回點(diǎn)坐標(biāo),為False時(shí)返回點(diǎn)索引。默認(rèn)值為T(mén)rue。

返回值說(shuō)明:

hull:凸包的點(diǎn)陣數(shù)組。
下面通過(guò)一個(gè)例子演示如何繪制凸包。

【實(shí)例13.5】 為爆炸圖形繪制凸包。
為圖13.9所示的爆炸圖形繪制凸包,首先要先判斷圖形的輪廓,使用cv2.RETR_LIST檢索出圖形的輪廓,然后使用convexHull()方法找到輪廓的凸包,最后通過(guò)polylines()方法將凸包中各點(diǎn)連接起來(lái),具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-fXnYMX4E-1639056667683)(OpenCV進(jìn)階篇.assets/image-20211125205730374.png)]

上述代碼的運(yùn)行結(jié)果如圖13.14所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-mYOH2dGc-1639056667684)(OpenCV進(jìn)階篇.assets/image-20211125205746309.png)]

? 圖13.14 爆炸圖形的凸包

13.4 Canny邊緣檢測(cè)

Canny邊緣檢測(cè)算法是John F. Canny于1986年開(kāi)發(fā)的一個(gè)多級(jí)邊緣檢測(cè)算法,該算法根據(jù)像素的梯度變化尋找圖像邊緣,最終可以繪制十分精細(xì)的二值邊緣圖像。
OpenCV將Canny邊緣檢測(cè)算法封裝在Canny()方法中,該方法的語(yǔ)法如下:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

參數(shù)說(shuō)明:

image:檢測(cè)的原始圖像。

threshold1:計(jì)算過(guò)程中使用的第一個(gè)閾值,可以是最小閾值,也可以是最大閾值,通常用來(lái)設(shè)置最小閾值。

threshold2:計(jì)算過(guò)程中使用的第二個(gè)閾值,通常用來(lái)設(shè)置最大閾值。

apertureSize:可選參數(shù),Sobel算子的孔徑大小。

L2gradient:可選參數(shù),計(jì)算圖像梯度的標(biāo)識(shí),默認(rèn)值為False。值為T(mén)rue時(shí)采用更精準(zhǔn)的算法進(jìn)行計(jì)算。

返回值說(shuō)明:

edges:計(jì)算后得出的邊緣圖像,是一個(gè)二值灰度圖像。

在開(kāi)發(fā)過(guò)程中可以通過(guò)調(diào)整最小閾值和最大閾值控制邊緣檢測(cè)的精細(xì)程度。當(dāng)2個(gè)閾值都較小時(shí),檢測(cè)出較多的細(xì)節(jié);當(dāng)2個(gè)閾值都較大時(shí),忽略較多的細(xì)節(jié)。

【實(shí)例13.6】 使用Canny算法檢測(cè)花朵邊緣。
利用Canny()方法檢測(cè)圖13.15(a)所示的花朵圖像,分別使用10和50、100和200、400和600作為最低閾值和最高閾值檢測(cè)3次,具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-VlzQPJtu-1639056667684)(OpenCV進(jìn)階篇.assets/image-20211125205855069.png)]

上述代碼的運(yùn)行結(jié)果如圖13.15所示,閾值越小,檢測(cè)出的邊緣越多;閾值越大,檢測(cè)出的邊緣越少,只能檢測(cè)出一些較明顯的邊緣。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-HhX1WPA5-1639056667684)(OpenCV進(jìn)階篇.assets/image-20211125205918990.png)]

? 圖13.15 圖像Canny檢測(cè)效果

13.5 霍夫變換

霍夫變換是一種特征檢測(cè),通過(guò)算法識(shí)別圖像的特征,從而判斷圖像中的特殊形狀,例如直線和圓。本節(jié)將介紹如何檢測(cè)圖像中的直線和圓。

13.5.1 直線檢測(cè)

霍夫直線變換是通過(guò)霍夫坐標(biāo)系的直線與笛卡兒坐標(biāo)系的點(diǎn)之間的映射關(guān)系來(lái)判斷圖像中的點(diǎn)是否構(gòu)成直線。OpenCV將此算法封裝成兩個(gè)方法,分別是cv2.HoughLines()和cv2.HoughLinesP(),前者用于檢測(cè)無(wú)限延長(zhǎng)的直線,后者用于檢測(cè)線段。本節(jié)僅介紹比較常用的HoughLinesP()方法。
HoughLinesP()方法名稱(chēng)最后有一個(gè)大寫(xiě)的P,該方法只能檢測(cè)二值灰度圖像,也就是只有兩種像素值的黑白圖像。該方法最后把找出的所有線段的兩個(gè)端點(diǎn)坐標(biāo)保存成一個(gè)數(shù)組。
HoughLinesP()方法的語(yǔ)法如下:

lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

參數(shù)說(shuō)明:

image:檢測(cè)的原始圖像。

rho:檢測(cè)直線使用的半徑步長(zhǎng),值為1時(shí),表示檢測(cè)所有可能的半徑步長(zhǎng)。

theta:搜索直線的角度,值為π/180°時(shí),表示檢測(cè)所有角度。

threshold:閾值,該值越小,檢測(cè)出的直線就越多。

minLineLength:線段的最小長(zhǎng)度,小于該長(zhǎng)度的線段不記錄到結(jié)果中。

maxLineGap:線段之間的最小距離。

返回值說(shuō)明:

lines:一個(gè)數(shù)組,元素為所有檢測(cè)出的線段,每條線段是一個(gè)數(shù)組,代表線段兩個(gè)端點(diǎn)的橫、縱坐標(biāo),格式為[[[x1, y1, x2, y2], [x1, y1, x2, y2]]]。注意
使用該方法前應(yīng)該為原始圖像進(jìn)行降噪處理,否則會(huì)影響檢測(cè)結(jié)果。

【實(shí)例13.7】 檢測(cè)筆圖像中出現(xiàn)的直線。

檢測(cè)如圖13.16所示的中性筆照片,先將圖像降噪,再對(duì)圖像進(jìn)行邊緣檢測(cè),然后利用HoughLinesP()方法找出邊緣圖像中的直線線段,最后用cv2.line()方法將找出的線段繪制成紅色。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-HFJnv0up-1639056667684)(OpenCV進(jìn)階篇.assets/image-20211125210047560.png)]

? 圖13.16 筆圖像
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-F9KRDuUR-1639056667685)(OpenCV進(jìn)階篇.assets/image-20211126130401949.png)]

上述代碼的運(yùn)行結(jié)果如圖13.17和圖13.18所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-NvCq8Qur-1639056667685)(OpenCV進(jìn)階篇.assets/image-20211126130420890.png)]

? 圖13.17 筆圖像的邊緣檢測(cè)結(jié)果

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-EVYlpSW6-1639056667685)(OpenCV進(jìn)階篇.assets/image-20211126130515954.png)]

? 圖13.18 將筆圖像中檢測(cè)出的線段描紅

13.5.2 圓環(huán)檢測(cè)

霍夫圓環(huán)變換的原理與霍夫直線變換類(lèi)似。OpenCV提供的HoughCircles()方法用于檢測(cè)圖像中的圓環(huán),該方法在檢測(cè)過(guò)程中進(jìn)行兩輪篩選:第一輪篩選找出可能是圓的圓心坐標(biāo),第二輪篩選計(jì)算這些圓心坐標(biāo)可能對(duì)應(yīng)的半徑長(zhǎng)度。該方法最后將圓心坐標(biāo)和半徑封裝成一個(gè)浮點(diǎn)型數(shù)組。
HoughCircles()方法的語(yǔ)法如下:

circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)

參數(shù)說(shuō)明:

image:檢測(cè)的原始圖像。

method:檢測(cè)方法,OpenCV 4.0.0及以前版本僅提供了cv2.HOUGH_GRADIENT作為唯一可用方法。

dp:累加器分辨率與原始圖像分辨率之比的倒數(shù)。值為1時(shí),累加器與原始圖像具有相同的分辨率;值為2時(shí),累加器的分辨率為原始圖像的1/2。通常使用1作為參數(shù)。

minDist:圓心之間的最小距離。

param1:可選參數(shù),Canny邊緣檢測(cè)使用的最大閾值。

param2:可選參數(shù),檢測(cè)圓環(huán)結(jié)果的投票數(shù)。第一輪篩選時(shí)投票數(shù)超過(guò)該值的圓環(huán)才會(huì)進(jìn)入第二輪篩選。值越大,檢測(cè)出的圓環(huán)越少,但越精準(zhǔn)。

minRadius:可選參數(shù),圓環(huán)的最小半徑。

maxRadius:可選參數(shù),圓環(huán)的最大半徑。

返回值說(shuō)明:

circles:一個(gè)數(shù)組,元素為所有檢測(cè)出的圓環(huán),每個(gè)圓環(huán)也是一個(gè)數(shù)組,內(nèi)容為圓心的橫、縱坐標(biāo)和半徑長(zhǎng)度,格式為:[[[x1 ,y1, r1], [x2 ,y2, r2]]]。

注意
使用該方法前應(yīng)該為原始圖像進(jìn)行降噪處理,否則會(huì)影響檢測(cè)結(jié)果。

【實(shí)例13.8】 檢測(cè)硬幣圖像中出現(xiàn)的圓環(huán)。
檢測(cè)如圖13.19所示的硬幣照片,先將圖像降噪,再將圖像變成單通道灰度圖像,然后利用HoughCircles()方法檢測(cè)圖像中可能是圓環(huán)的位置,最后通過(guò)cv2.circle()方法在這些位置上繪制圓環(huán)和對(duì)應(yīng)的圓心。在繪制圓環(huán)之前,要將HoughCircles()方法返回的浮點(diǎn)數(shù)組元素轉(zhuǎn)換成整數(shù)。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-vSo6G25X-1639056667685)(OpenCV進(jìn)階篇.assets/image-20211126130634358.png)]

? 圖13.19 硬幣圖像
具體代碼如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-871ibjzo-1639056667686)(OpenCV進(jìn)階篇.assets/image-20211126130715358.png)]

上述代碼的運(yùn)行結(jié)果如圖13.20所示。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LLHdzygi-1639056667686)(OpenCV進(jìn)階篇.assets/image-20211126130658457.png)]

? 圖13.20 檢測(cè)出的圓環(huán)位置

13.6 小結(jié)

圖像輪廓指的是將圖像的邊緣連接起來(lái)形成的一個(gè)整體,它是圖像的一個(gè)重要的特征信息,通過(guò)對(duì)圖像的輪廓進(jìn)行操作,能夠得到這幅圖像的大小、位置和方向等信息,用于后續(xù)的計(jì)算。為此,OpenCV提供了findContours()方法,通過(guò)計(jì)算圖像的梯度,判斷圖像的輪廓。為了繪制圖像的輪廓,OpenCV又提供了drawContours()方法。但需要注意的是,Canny()方法雖然能夠檢測(cè)出圖像的邊緣,但這個(gè)邊緣是不連續(xù)的。

總結(jié)

以上是生活随笔為你收集整理的OpenCV进阶篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲精品午夜国产va久久成人 | 在线免费观看国产精品 | 91九色在线观看视频 | 色丁香久久 | 玖玖在线资源 | 97视频人人澡人人爽 | 久久久久久看片 | 一级性视频 | 三上悠亚在线免费 | 香蕉网在线观看 | 欧美 日韩 久久 | 天天干,天天插 | 国产成人av免费在线观看 | 国产自产高清不卡 | 97超级碰碰 | 成年美女黄网站色大片免费看 | 黄毛片在线观看 | 99视屏 | 国产青青青 | 日韩三级av| 免费在线观看av的网站 | 国产精品久久久久久久久久久久久久 | 国产精品mv在线观看 | 日韩欧美国产激情在线播放 | 玖玖视频国产 | 日韩色在线观看 | 国产成人三级一区二区在线观看一 | 97在线观看免费高清完整版在线观看 | 色吊丝在线永久观看最新版本 | 欧美日在线 | 99国产一区二区三精品乱码 | 久久情侣偷拍 | 中文在线字幕观看电影 | 97色资源| 国产黄色片在线免费观看 | 亚洲 欧洲av| 国产精品理论片在线播放 | 狠狠激情中文字幕 | 久久一区国产 | 国产一级淫片在线观看 | 伊人天堂网 | 麻豆国产在线视频 | 天天干天天爽 | 欧美久久久久 | 欧美在线aaa | 亚洲v精品| 色悠悠久久综合 | 二区三区在线 | 国产剧情一区二区在线观看 | 成人av影视观看 | 国产精品自产拍在线观看网站 | 日韩一区正在播放 | 天天操天天干天天 | 日日干天天操 | 激情五月婷婷综合网 | 91精品国产91久久久久福利 | 国产精久久久 | 亚洲在线网址 | 欧美午夜性 | 91免费高清 | 亚洲一级黄色片 | 亚洲一区二区精品在线 | 久久久久高清毛片一级 | 国产精品永久免费 | 一级一片免费观看 | 国产精品尤物 | 在线精品观看国产 | 国产资源在线观看 | 免费看片成人 | 婷婷色资源 | 国产精品黄色 | 国产一卡二卡在线 | 精品一二三四在线 | 国产亚洲字幕 | 欧美日韩精品在线观看视频 | 国产剧情在线一区 | www.人人草 | 日韩视频中文字幕 | 中文字幕专区高清在线观看 | 精品999久久久| 精品在线观看一区二区三区 | 精品自拍sae8—视频 | 婷婷丁香自拍 | 开心激情五月网 | 91女神的呻吟细腰翘臀美女 | 亚洲桃花综合 | 在线观看精品一区 | 国产久草在线观看 | 新av在线| 精品一区精品二区高清 | 国产视频观看 | 91色九色 | 啪啪免费试看 | 亚洲涩涩网 | 亚洲 成人 一区 | 久久人人爽人人片 | 久久激情片 | 国产精品久久久久久久久久久久久久 | 日韩av电影国产 | 国产香蕉视频在线播放 | 国产精品视频久久 | 国产精品麻 | 欧美日韩一级在线 | 国产91成人在在线播放 | 亚洲九九九在线观看 | 99精品视频中文字幕 | 91香蕉视频在线下载 | 亚洲精品乱码久久久一二三 | 日韩剧情 | 日韩午夜高清 | 亚洲欧美日本一区二区三区 | 国产又粗又猛又黄又爽视频 | 欧美成人在线免费观看 | 日日干夜夜爱 | 一区二区三区精品在线视频 | 亚洲精品网址在线观看 | 日韩欧美视频一区二区三区 | 99久久99久久精品国产片果冰 | 亚洲视频久久久久 | 九月婷婷人人澡人人添人人爽 | 久久久久久久久久久久久久电影 | 99久久er热在这里只有精品66 | 正在播放国产一区 | 又粗又长又大又爽又黄少妇毛片 | 在线观看视频色 | 午夜电影 电影 | 欧美最新大片在线看 | 最新免费中文字幕 | av在线永久免费观看 | 日韩欧美国产精品 | 93久久精品日日躁夜夜躁欧美 | 夜夜躁日日躁狠狠久久av | 国产日韩欧美视频在线观看 | 国产精品乱码高清在线看 | 日韩精品一区二区在线观看视频 | 综合网色 | 激情五月五月婷婷 | 四虎欧美 | 欧美少妇xx | 中文字幕视频免费观看 | 精品伦理一区二区三区 | 正在播放五月婷婷狠狠干 | 一区二区三区四区五区在线 | www.香蕉视频 | 99视频精品 | 中文字幕在线观看第三页 | 午夜精品电影 | 色狠狠久久av五月综合 | 亚洲va欧洲va国产va不卡 | 天天色天天草天天射 | 久久久久97国产 | www.久久色 | 亚洲国产精品成人女人久久 | 国产精品色在线 | 国产精品毛片完整版 | 中文字幕高清 | 青青五月天 | 久久免费av | 激情综合网天天干 | 在线视频免费观看 | 激情开心网站 | 最近中文字幕免费视频 | 久久免视频 | 精品自拍sae8—视频 | 久草视频中文在线 | 免费色视频在线 | 国产精品毛片一区 | 超碰电影在线观看 | 国内久久久久 | www.69xx| 国产精品一区二区三区四区在线观看 | 久9在线 | 久久婷婷五月综合色丁香 | 五月婷婷六月丁香在线观看 | 日韩高清国产精品 | 在线你懂 | 九九视频一区 | 欧美一区二区在线 | 久久久亚洲成人 | 欧美激情视频在线观看免费 | 婷婷久久五月天 | 国产精品第十页 | 在线综合 亚洲 欧美在线视频 | 亚洲国产成人精品在线观看 | 成人午夜精品福利免费 | 日韩av在线网站 | 欧美在线观看视频免费 | 国产精品福利小视频 | www.国产精品 | 中文字幕一区二区三区在线观看 | 91精品国产自产在线观看永久 | 午夜精品视频一区 | 日韩av电影一区 | 免费h视频 | 国产一级在线播放 | 最新动作电影 | 在线观看黄 | 成人精品999 | 国产综合婷婷 | 中文字幕免费看 | 国产精品乱码高清在线看 | 欧美精品中文在线免费观看 | 91高清免费看| 国产精品久久久久久电影 | 激情视频在线观看网址 | 午夜av激情 | www.五月婷 | 国产一区二区三区在线免费观看 | 欧美久久精品 | 亚洲精品tv| 日韩欧美有码在线 | 色久av| 99色在线观看视频 | 美女网色| 一区二区三区四区五区六区 | 亚洲欧洲中文日韩久久av乱码 | av免费观看在线 | 国产偷国产偷亚洲清高 | 国产在线观看午夜 | 有没有在线观看av | 97超碰人人澡| 亚洲jizzjizz日本少妇 | 一本一本久久a久久 | 精品日韩中文字幕 | 亚洲一级电影在线观看 | 五月婷婷丁香 | 久久久久久久免费 | 亚洲综合爱 | 久久午夜影视 | 国产色在线观看 | 在线免费av网 | 欧美激情精品久久久久久变态 | 欧美人牲| 色综合久久88 | 日韩小视频 | 99色资源 | 国产第一页在线观看 | 国产视频 久久久 | 美女网站视频免费都是黄 | 久久不卡日韩美女 | 午夜在线日韩 | 激情网色 | 国产网站在线免费观看 | 在线免费观看国产 | 色在线网| 国产1级视频 | 亚洲视频h | 国产一级黄 | 粉嫩av一区二区三区入口 | 丁香九月激情综合 | 天天艹天天干天天 | 日批视频在线 | 久久精品国产免费看久久精品 | 中文字幕亚洲在线观看 | 日韩四虎 | 国产精品精品久久久久久 | 天天操天天透 | 国产专区在线 | 亚洲精品视频免费看 | 久久专区 | 麻豆国产露脸在线观看 | 欧洲精品在线视频 | av在线不卡观看 | 黄色a三级 | 2019精品手机国产品在线 | 91香蕉视频污在线 | 久久综合五月天婷婷伊人 | 成年人电影免费看 | 黄色国产高清 | 久久成人18免费网站 | 免费一级黄色 | 五月天婷婷在线视频 | 蜜桃视频在线观看一区 | 国产高清区 | 国产手机在线观看视频 | avlulu久久精品 | 奇米导航 | 免费 在线 中文 日本 | 操夜夜操| 欧美日韩国产xxx | 在线视频麻豆 | 91热视频在线观看 | 久久久久久网址 | 久久网站免费 | 91九色免费视频 | 看av在线 | 一区二区三区高清不卡 | 成 人 黄 色视频免费播放 | 五月婷婷综合激情网 | 日韩精品一区二区三区丰满 | 久久久www| 欧美极品一区二区三区 | 成年人看片 | 青青看片 | 日韩在线视频二区 | 日日日日日| 欧洲一区二区三区精品 | 2018精品视频 | 999精品| 成人在线观看免费 | 777奇米四色| 国产99久久久久久免费看 | 久久精品99国产精品酒店日本 | 97视频在线免费播放 | 日韩在线观看你懂得 | 色在线视频 | 九九热在线免费观看 | 亚洲一区二区三区毛片 | 亚洲视频 在线观看 | 国产亚洲91| 99精品毛片| 国产综合激情 | 成人精品电影 | 欧美激情综合色综合啪啪五月 | 日韩va欧美va亚洲va久久 | 午夜精品一二区 | 成年人看片网站 | 久久观看最新视频 | 亚洲一二三在线 | 天天干天天干天天干 | av大片网址 | 欧美精品一区在线发布 | 在线看岛国av | 狠狠色噜噜狠狠狠合久 | 国产精品女同一区二区三区久久夜 | av免费片| 日韩视频在线观看视频 | 久久99热这里只有精品 | 99产精品成人啪免费网站 | 国语精品免费视频 | 精品亚洲午夜久久久久91 | 国产午夜精品一区二区三区在线观看 | 国产高清视频免费在线观看 | 欧洲不卡av| 国产免费a | 成人亚洲精品国产www | 久久男人视频 | 国产区欧美 | 亚洲精品视频免费 | 免费亚洲精品 | 在线观看国产www | 欧美精品久久久久久久久免 | 在线а√天堂中文官网 | 亚洲日本精品视频 | 狠狠色丁香婷婷综合久久片 | 五月婷婷开心中文字幕 | 狠狠躁夜夜躁人人爽超碰91 | 日韩欧美精选 | 日韩精品久久久久 | 久久综合九色综合久久久精品综合 | 看国产黄色大片 | 久久久久久久久久网 | 99色视频在线 | 欧美成人xxxxxxxx | 97在线影视 | 久久久精品 一区二区三区 国产99视频在线观看 | 精品国产乱码 | 天天操夜夜曰 | 久章草在线观看 | 免费在线观看国产精品 | 亚洲国产影院av久久久久 | 中文字幕在线播放视频 | 亚洲永久精品视频 | 国产欧美精品在线观看 | www.久久精品视频 | 亚洲视频在线播放 | 久草香蕉在线 | 婷婷综合网 | av中文字幕在线观看网站 | 玖玖爱在线观看 | 日本午夜在线观看 | 欧美国产日韩一区二区三区 | 欧美精品在线视频观看 | 国产中文字幕一区 | 三级av小说 | 亚洲日韩中文字幕 | 国语自产偷拍精品视频偷 | .国产精品成人自产拍在线观看6 | 午夜精品一区二区三区在线视频 | 亚洲国产大片 | 欧产日产国产69 | 在线影视 一区 二区 三区 | 亚洲一区二区精品 | 久久人人精品 | 久久天天躁夜夜躁狠狠85麻豆 | 久久久久久影视 | 最近的中文字幕大全免费版 | 女人18片毛片90分钟 | 久久国产精品一区二区 | 日韩一区二区三免费高清在线观看 | 国产v亚洲v | 国产一区二区三区高清播放 | 日韩精品一区二区三区水蜜桃 | 黄色一级免费网站 | 亚洲精品国产第一综合99久久 | 中文有码在线视频 | 亚洲成人999 | 97超碰国产在线 | 久久免费毛片 | 久久男人中文字幕资源站 | 天堂在线视频免费观看 | 麻豆视频免费版 | 色综合小说 | 久久久精品欧美一区二区免费 | 国产精品久久久久亚洲影视 | 日韩av影视| 久久精品视频99 | 九九热.com| 欧美日韩国产二区三区 | 亚洲国产精品成人女人久久 | 久久精品国产亚洲 | 日韩在线观看电影 | 日本久久99 | 探花视频在线观看免费版 | 久草免费资源 | 在线亚洲午夜片av大片 | 久久综合精品国产一区二区三区 | 色噜噜日韩精品欧美一区二区 | 丁香影院在线 | 人人澡超碰碰 | 亚洲区另类春色综合小说校园片 | 色综合久久天天 | 麻豆你懂的| 99国产一区二区三精品乱码 | 免费色视频网址 | 亚州精品成人 | 久久精品国产亚洲精品2020 | 精品一区二区亚洲 | 国产亚洲激情视频在线 | 久久成人一区二区 | 亚洲激情综合 | 五月天com | 91av国产视频| 91私密视频| 国产精品久久久久久久久软件 | 91亚洲成人 | 国产一二三精品 | 免费毛片aaaaaa | 久久久久久久影视 | 天天操操操操操 | 黄p网站在线观看 | 国产成人99久久亚洲综合精品 | 操操操综合 | 欧美日韩一区二区免费在线观看 | 国产精品久久影院 | 日韩欧美一区二区三区在线 | www.五月天婷婷 | 免费在线观看av网站 | 久久视频在线视频 | 伊人中文网 | 日韩伦理片一区二区三区 | 国产视频九色蝌蚪 | 在线a人片免费观看视频 | 精品久久国产精品 | 国产成人久久久77777 | 国产午夜精品一区二区三区嫩草 | 美女久久久久久 | 日产乱码一二三区别在线 | 国产精品永久在线观看 | 日韩视频一区二区三区在线播放免费观看 | 欧美精品一区二区三区一线天视频 | 丁香色综合 | 91av视频在线免费观看 | 在线观看免费成人 | 国产精品美乳一区二区免费 | 伊人久久国产精品 | 制服丝袜亚洲 | 日韩免费高清在线观看 | 日韩美在线 | 又黄又爽的视频在线观看网站 | 一区二区理论片 | 亚洲综合干 | 国产aaa大片 | 成人免费 在线播放 | 久久一级电影 | 夜夜爽天天爽 | 碰超在线观看 | 久草视频免费在线观看 | 日韩视频三区 | 高清视频一区 | 欧美美女激情18p | 日韩欧美在线观看 | 日韩免费一区 | 96视频在线| 久艹视频免费观看 | 久99视频 | 久久免费美女视频 | 亚洲精品国产精品99久久 | 日韩一区二区三免费高清在线观看 | 色噜噜在线观看视频 | 91理论片午午伦夜理片久久 | 欧美日韩不卡一区 | 国产免费作爱视频 | 国产一线天在线观看 | 成人免费视频播放 | 91女神的呻吟细腰翘臀美女 | 狠狠插天天干 | 日韩视频免费观看高清 | 97电影手机 | 中文字幕人成不卡一区 | 在线 成人 | 久草精品视频在线观看 | 最近中文字幕mv免费高清在线 | 亚洲a在线观看 | 亚洲草视频| 日韩欧美极品 | 亚洲国产精品影院 | 日韩精品电影在线播放 | 久久精彩视频 | 97人人爽人人 | 在线视频 成人 | 99精品国产亚洲 | 久久免费视频观看 | 久久国产精品久久久 | 国产爽妇网 | 久久久综合 | 日韩免费电影 | 亚洲九九九在线观看 | 91香蕉视频污在线 | 欧美日韩伦理一区 | 97国产在线视频 | 91精品办公室少妇高潮对白 | 91免费网站在线观看 | 亚洲欧洲精品一区 | 亚洲最大激情中文字幕 | 国产黄免费在线观看 | 欧美亚洲三级 | 奇米影视四色8888 | 人人草人人做 | 天天操 夜夜操 | 深爱婷婷久久综合 | 国产成人亚洲在线观看 | 黄色高清视频在线观看 | 蜜桃视频精品 | 久久国产精品99久久人人澡 | 日本黄网站 | 日韩一级网站 | 91精品国产综合久久福利不卡 | 色播亚洲婷婷 | 91成版人在线观看入口 | 久久久精品福利视频 | 偷拍精品一区二区三区 | 丁香 久久 综合 | 在线观看精品黄av片免费 | 日韩一级片大全 | av在线永久免费观看 | 激情欧美丁香 | 久久伊99综合婷婷久久伊 | 国产精品一区二区久久精品 | 国产在线精品一区二区不卡了 | 又黄又爽又湿又无遮挡的在线视频 | 99久久久久免费精品国产 | 国产精品门事件 | www·22com天天操 | 在线黄色国产电影 | 国产性天天综合网 | 亚洲视频综合在线 | 91黄色在线视频 | 国产在线播放一区二区 | 国产在线无 | 超碰免费久久 | 一区二区三区四区不卡 | 免费碰碰| 亚洲资源视频 | 久久国产区 | 97碰碰视频 | 91日韩精品视频 | 国产一区二区中文字幕 | 日韩高清av | 国产精品男女 | 色综合久久久久 | 成人免费在线看片 | 亚洲电影网站 | 激情久久伊人 | 国产精品久久久一区二区三区网站 | 亚洲国产成人在线 | 久久综合在线 | 色偷偷男人的天堂av | 人人射人人爱 | 日本精品中文字幕在线观看 | 99热免费在线 | 国产精品久久久久久久久久三级 | 日本中文字幕电影在线免费观看 | 成人黄色在线视频 | 美女精品国产 | 在线成人性视频 | 日韩av电影免费在线观看 | 成人午夜电影在线观看 | 亚洲电影自拍 | 亚洲精品视频中文字幕 | 成人午夜毛片 | 久久精品一区八戒影视 | 91一区二区三区在线观看 | 亚洲人片在线观看 | 91色蜜桃| 久久96国产精品久久99软件 | 亚洲一区二区精品3399 | 996久久国产精品线观看 | 亚洲激情在线观看 | 免费在线观看黄网站 | 日韩久久精品一区二区三区下载 | 大型av综合网站 | 免费日韩电影 | 亚洲国产成人在线播放 | www.人人草| 久久图 | 成人理论在线观看 | 91成人免费观看视频 | 五月婷婷国产 | 最新av免费在线观看 | 日韩精品久久一区二区三区 | 成人午夜在线观看 | 欧美一级日韩免费不卡 | 中文字幕精品三区 | 99热这里只有精品免费 | 久久免费成人精品视频 | 免费国产在线观看 | 能在线观看的日韩av | 久久免费视频网 | 91九色在线播放 | 国产高清在线视频 | 伊人成人久久 | 伊人伊成久久人综合网小说 | 久久只有精品 | 亚洲精品在线视频观看 | 日韩免费成人 | 日韩另类在线 | 日韩美在线 | 欧美三级在线播放 | 日韩一二区在线 | 69国产精品成人在线播放 | 国产乱码精品一区二区三区介绍 | 中文字幕在线播放日韩 | 亚洲精品欧美专区 | 午夜视频99| 久久久久福利视频 | 国产欧美精品一区二区三区四区 | 亚洲更新最快 | 91探花国产综合在线精品 | 国产日韩视频在线播放 | 久久国产精品99国产精 | 在线免费国产 | 精品国产一区二区三区四区在线观看 | 天天爽天天爽夜夜爽 | 1024手机看片国产 | 五月天亚洲激情 | 韩日av一区二区 | 国产高清视频网 | 午夜 免费| 美女网站视频免费都是黄 | 在线观看成人福利 | 超碰av免费 | 久久久亚洲麻豆日韩精品一区三区 | 黄在线免费看 | 免费看三片 | 免费国产亚洲视频 | 国产精品99爱 | 91麻豆精品国产91久久久更新时间 | 亚洲天天摸日日摸天天欢 | 麻豆视频在线免费观看 | 成人久久国产 | 日韩亚洲在线视频 | 五月婷婷综合在线观看 | 二区三区在线 | 亚洲精品久久久蜜桃 | 在线免费观看国产黄色 | 亚洲视频电影在线 | 国产成人精品国内自产拍免费看 | 国产成人99av超碰超爽 | 久久狠狠亚洲综合 | 456成人精品影院 | 久久不卡日韩美女 | 亚洲国产wwwccc36天堂 | 日韩91在线 | 亚洲极色| 色网站在线免费观看 | 亚洲夜夜网 | 精品在线视频一区 | 久久精品影片 | 在线观看精品一区 | 九精品 | 五月天天av | 国产视频 亚洲精品 | 色狠狠一区二区 | 丝袜av一区 | 国产999在线观看 | 日本中文字幕在线视频 | 天天干天天想 | 久久综合免费视频 | 一区二区三高清 | 九九日九九操 | 国产一卡久久电影永久 | 久久视频 | 久久高清精品 | 亚洲精品在线视频 | 久久香蕉国产精品麻豆粉嫩av | 日韩动漫免费观看高清完整版在线观看 | 麻豆传媒电影在线观看 | 亚洲免费在线观看视频 | 国产精品久久久久婷婷二区次 | 久草在线最新视频 | 性日韩欧美在线视频 | 欧美大片在线看免费观看 | 综合久久婷婷 | 狠狠色2019综合网 | 国产黄色大片免费看 | 91桃色视频| 9999免费视频 | 99久久精品国产一区二区成人 | 日本少妇久久久 | av在线影视 | 国产视频久久 | 精品字幕在线 | 国产在线一区观看 | 日韩精品1区2区 | 亚洲精品久久激情国产片 | www.色婷婷 | 久久综合国产伦精品免费 | 免费a视频| 成人免费影院 | 91成人在线网站 | 欧美一区二区三区四区夜夜大片 | 国产爽视频 | 一级欧美黄 | a天堂在线看 | 97超碰在线视 | 操操综合| 免费在线色视频 | 特级黄色视频毛片 | 久久99精品国产麻豆宅宅 | 亚洲精品欧美精品 | 91精品国产欧美一区二区成人 | 日本中文字幕在线免费观看 | 欧美va天堂va视频va在线 | 久草免费在线 | 美女黄网久久 | 最新中文字幕在线资源 | 精品欧美一区二区精品久久 | 天天曰天天爽 | 精品久久久久久亚洲综合网站 | 久爱综合 | 国产中文字幕在线播放 | 99精彩视频在线观看免费 | 免费观看性生交 | 人人澡人人干 | 国产明星视频三级a三级点| 久久久99国产精品免费 | 久久久免费观看视频 | 久久尤物电影视频在线观看 | 正在播放五月婷婷狠狠干 | 日本性生活免费看 | 久久草精品 | 国产黄色片免费观看 | 在线观看韩国av | 久久99久久精品 | 成人av在线看| 国产精品永久久久久久久www | 2021国产视频 | 日本公妇在线观看高清 | avav片| 亚州免费视频 | 最近中文字幕免费视频 | 三级小视频在线观看 | 丁香av | 正在播放五月婷婷狠狠干 | 亚洲涩涩色| 国产xvideos免费视频播放 | 欧美日韩精品二区第二页 | 国产精品观看在线亚洲人成网 | 久久高清国产视频 | 精品免费观看视频 | 国产日韩在线播放 | 成人黄在线观看 | 久久久久在线观看 | 亚洲国产av精品毛片鲁大师 | 日韩一区二区三区免费视频 | 日本在线观看一区二区三区 | 超碰电影在线观看 | 在线观看视频一区二区三区 | 国产黄a三级三级三级三级三级 | 又黄又爽的视频在线观看网站 | 激情网站网址 | 中文字幕av在线免费 | 婷婷色综 | 免费av在| 久久爱992xxoo | 午夜精品久久久久久久99水蜜桃 | av一级在线 | 国产精品美女久久久久久久久久久 | 久久色在线观看 | 韩国av一区二区 | 超碰人人射 | 又黄又刺激视频 | 综合网av | 国产99久久九九精品免费 | 久久精品视频4 | av午夜电影 | 精品国模一区二区三区 | 日韩毛片在线免费观看 | 一本一道波多野毛片中文在线 | 九七视频在线 | 免费a一级 | 色a综合| www.夜夜爽 | 亚洲精品视频一二三 | 国产中文字幕一区二区三区 | 五月天婷婷丁香花 | 日韩二区在线观看 | 天天操天天摸天天爽 | 亚洲视频1区2区 | 最新精品视频在线 | 天天激情天天干 | 欧美精品小视频 | 一级欧美一级日韩 | 狠狠躁18三区二区一区ai明星 | 成年人在线电影 | 亚洲人成人在线 | 欧美最爽乱淫视频播放 | 免费在线观看a v | 一区二区精品视频 | 中文字幕在线视频国产 | 日韩在线观看一区二区 | 亚洲四虎| 精品久久国产一区 | 激情av五月婷婷 | 欧美精品二区 | www.天天操.com| 国产精品久久久久久久久久久久冷 | 久久99久久精品 | 欧美精品一区二区三区一线天视频 | 久久久久国产一区二区 | 日韩精品你懂的 | 亚洲日本成人网 | 在线视频欧美亚洲 | 黄色软件网站在线观看 | av专区在线 | 91色影院| 四虎成人精品永久免费av | 日韩理论片在线观看 | 97超碰中文字幕 | 国产乱码精品一区二区三区介绍 | 国产欧美日韩精品一区二区免费 | 成x99人av在线www | 亚洲天堂网在线播放 | 午夜国产福利在线 | 久久好看| 久久影院中文字幕 | 亚洲91视频 | 国产高清视频色在线www | 国产精品99久久久久的智能播放 | 91精品视频免费观看 | 91av在线视频免费观看 | 国产午夜视频在线观看 | 国偷自产中文字幕亚洲手机在线 | 四川bbb搡bbb爽爽视频 | www.久热| 色婷婷国产在线 | 欧美日韩一区二区免费在线观看 | 激情亚洲综合在线 | 成人毛片在线观看 | 久久久精选 | 亚洲最新av网站 | 成人影音av| 久久免费视频6 | 天堂av在线网站 | 欧美韩国日本在线观看 | 香蕉在线视频观看 | 婷久久| 国产理论影院 | 日韩在线一级 | 五月天狠狠操 | 欧美成人精品在线 | 国产99在线免费 | 欧美日韩亚洲国产一区 | 99热在线国产精品 | 色综合天天在线 | 国产第一页精品 | 久久国产精品免费观看 | 久久久久久高潮国产精品视 | 欧美少妇xxxxxx | 久久全国免费视频 | 亚洲国产精品一区二区久久hs | 麻豆国产露脸在线观看 | 国产精品久久久久久久午夜 | 91香蕉久久 | www.xxxx欧美| 国产精品粉嫩 | 国产一级免费视频 | 麻豆91在线| 成人久久精品视频 | 国内小视频在线观看 | 精品国产乱码一区二区三区在线 | 人人爽人人爽人人爽人人爽 | 人人澡av| 久久特级毛片 | 久久五月天综合 | 九九日九九操 | 国产大片免费久久 | 国内免费的中文字幕 | 国产一区二区三区免费在线 | 一区二区三区播放 | 人人插人人艹 | 国产精品久久久久久久午夜 | 久久一区国产 | 色婷婷天天干 | 国产一级黄 | 亚洲黄色在线观看 | 极品美女被弄高潮视频网站 | 经典三级一区 | 久久有精品 | 99av在线视频 | 国产第一页在线观看 | 色a在线观看 | 国产精品福利在线 | 又黄又爽又湿又无遮挡的在线视频 | 国产中文字幕在线免费观看 | 亚洲在线| 免费日韩 精品中文字幕视频在线 | 亚洲午夜久久久久久久久 | 国产高清第一页 | 天天射天天爱天天干 | 婷婷社区五月天 | av中文字幕不卡 | 91av在线播放视频 | 国产在线播放不卡 | 中文字幕在线高清 | 精品久久一区二区 | 国产 中文 日韩 欧美 | 国产在线观看 | 91在线蜜桃臀 | 国产大尺度视频 | 天天操福利视频 | 夜夜看av | 久久久久久久av | 波多野结衣在线视频一区 | 久久成视频 | 99视频免费在线观看 | 色综合久久天天 | 欧美日韩免费视频 | 日本在线观看一区 | 一区二区三区四区五区在线 | 国产一二区视频 | 狠狠干天天射 | 久久久久久久久久久久电影 | 国产精品一区二区三区观看 | 一区二区伦理 | 国产精品久久久久久久久久白浆 | 少妇自拍av | 午夜色大片在线观看 | 欧美va日韩va | 日韩精品一区二区在线观看 | 日韩毛片在线播放 | 久久人人97超碰国产公开结果 | 欧美激情第一区 | 五月天电影免费在线观看一区 | 五月天网站在线 | 在线亚洲观看 | 亚洲欧美乱综合图片区小说区 | 亚洲欧美在线综合 | 国产丝袜美腿在线 | 亚洲精品久久视频 | 国产91在线看 | 99精品成人 | 久久狠狠一本精品综合网 | 激情欧美日韩一区二区 | 国产资源站 | 亚洲成人中文在线 | 欧美乱码精品一区二区 | 国产精品久久久久久久久久ktv | www.人人干| 国产精品久久视频 | 综合激情av | 最新av网站在线观看 | 欧美天天综合 | 国产黄色一级大片 | 亚洲免费在线观看视频 | 色在线中文字幕 | 亚洲一区视频免费观看 | 久久久久久久久久久成人 | 亚洲综合视频在线播放 | 亚洲一级片在线观看 | 在线香蕉视频 | 91xav| 午夜国产影院 | 韩国av免费在线观看 | 亚洲 欧美 成人 | 97免费视频在线 | 久热电影 | 久艹视频在线免费观看 | 久草网在线观看 | 久久免费99精品久久久久久 | 久久久www成人免费精品张筱雨 | 久久久精品免费观看 | 久久福利在线 | 久久亚洲免费视频 | 成人免费看视频 | 天天激情天天干 | 欧美极品xxxx |