日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

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

生活随笔

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

编程问答

发现你的身形——OpenCV图像轮廓

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

文章目錄

    • 寫在最前
    • 輪廓發(fā)現(xiàn)算法
    • 邊緣檢測(cè)
    • 寫在最后

寫在最前

我的意思不是說(shuō)你長(zhǎng)得很胖,emmmm,而是你的輪廓很大。
——五星上將詹姆斯下士如是說(shuō)


果然有圖沒(méi)圖,理解是不一樣的,這就體現(xiàn)了計(jì)算機(jī)視覺(jué)的重要性,2333
上一節(jié)最后,我們說(shuō)過(guò)這一次我們就將會(huì)講解真正的OpenCV圖像輪廓有關(guān)知識(shí)。輪廓發(fā)現(xiàn)的具體實(shí)現(xiàn)有多種方式,不過(guò)其實(shí)其使用在OpenCV中的使用并不困難,不過(guò)想用好還需要多點(diǎn)基礎(chǔ)知識(shí)。所以這里我們會(huì)首先講一講OpenCV中的輪廓發(fā)現(xiàn)算法,然后再講一講其他可以用于輪廓發(fā)現(xiàn)的特殊方法。這里我們主要使用了兩種來(lái)自于opencv官方的圖片(Note:上面那張不是),第一張是彩色快樂(lè)魚,第二張是水果分尸圖不對(duì),應(yīng)該是果繽紛才對(duì)。\(^o^)/~

輪廓發(fā)現(xiàn)算法

opencv中的輪廓發(fā)現(xiàn)算法來(lái)自于1985的一篇論文《TopologicalStructural Analysis of Digitized Binary Images by Border Following》,這篇論文主要講了兩種可有效利用于輪廓發(fā)現(xiàn)的邊界跟蹤算法,其中第一種是區(qū)分二值圖像邊界之間的保衛(wèi)關(guān)系(surroundness relations)第二種是第一種算法的變形,只跟蹤最外層輪廓。對(duì)于具體內(nèi)容這里不再過(guò)多描述,你可以自行查閱。至于具體的使用,我們直接使用OpenCV中的函數(shù)findContours即可。

由于opencv中的輪廓發(fā)現(xiàn)借鑒于論文《 Analysis of Digitized Binary Images by Border Following》,所以其只能接受二值化之后的圖像,也就是說(shuō)我們需要先對(duì)原始圖像進(jìn)行二值化處理,這里需要使用函數(shù)cvtColor將圖片進(jìn)行類型轉(zhuǎn)化,具體代碼如下:

# 灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化 ret, binary = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY)

其中COLOR_BGR2GRAY的作用一如其名,就是將BGR圖像轉(zhuǎn)化為GRAY(灰度圖,又名遺照)

之后我們就可以使用 cv2.threshold方法進(jìn)行二值化處理,就這樣一條彩色的快樂(lè)魚就變成了一張黑白的快樂(lè)魚遺照了。其中要注意的是,閾值是由我們自己選定的(這里是175),我們也可以通過(guò)修改閾值來(lái)獲取新的二值化參數(shù)。

最終,我們就可以將二值化之后的圖像傳進(jìn)輪廓發(fā)現(xiàn)算法,進(jìn)行輪廓發(fā)現(xiàn)并繪制。代碼與結(jié)果如下:

# 輪廓發(fā)現(xiàn) contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 輪廓繪制 cv2.drawContours(img, contours_new, -1, (0, 0, 255), 3)

現(xiàn)在快樂(lè)魚就被慘遭“分尸”了,嘴巴上多了一條大口子。而說(shuō)回正事,上面的代碼中drawContours函數(shù)就是繪制函數(shù),第一個(gè)參數(shù)是需要繪制的原圖像,第二個(gè)參數(shù)是之前我們使用算法發(fā)現(xiàn)的輪廓,第三個(gè)參數(shù)則表示繪制的輪廓索引,這里使用-1表示繪制所有輪廓,第四個(gè)參數(shù)則是繪制輪廓時(shí)線條的顏色,這里我們選擇紅色0。第五個(gè)參數(shù)則表示線條粗細(xì)度,如果是負(fù)值則在輪廓內(nèi)部繪制。除此之外還有一個(gè)隱身的六娃lineType表示線條類型,因?yàn)橛心J(rèn)數(shù)值LINE_8,所以這里沒(méi)有設(shè)置。

不過(guò)除了這些基本的操作外,我們還可以有很多其他的操作,比如借助之前我們學(xué)過(guò)的濾波函數(shù)對(duì)圖像進(jìn)行處理,去除那些意義不大的小色塊,或者使用邊緣檢測(cè)算法如Canny先一步獲取圖形邊緣(代替直接二值化哪一步),然后再進(jìn)行輪廓發(fā)現(xiàn),這些操作避免發(fā)現(xiàn)錯(cuò)誤輪廓,同時(shí)我們也可以使用判斷方法選擇一定周長(zhǎng)或者面積的輪廓。前者直接使用cv.blur(src_gray, (3,3)),以及函數(shù)canny_output = cv.Canny(gray, threshold, threshold * 2)即可,后者則需要幾個(gè)opencv的函數(shù)進(jìn)行配合,具體代碼如下:

# Detect edges using Canny threshold = 100 # Detect edges using Canny canny_output = cv2.Canny(gray, threshold, threshold * 2) for i in range(len(contours)):# 計(jì)算輪廓所包含的面積area = cv2.contourArea(contours[i])# 計(jì)算輪廓的周長(zhǎng)perimeter = cv2.arcLength(contours[i], True)if perimeter >= 10 and area >= 20:print("第{0}個(gè)輪廓的面積為{1},周長(zhǎng)為{2}".format(i+1,area,perimeter))contours_new.append(contours[i])

第一段代碼的作用是使用Canny進(jìn)行邊緣檢測(cè)(展示的圖片也經(jīng)過(guò)了均值模糊),然后得到一張只有邊緣數(shù)據(jù)的圖,這樣就避免了之前直接二值化產(chǎn)生的像素閾值產(chǎn)生的本來(lái)不存在的誤差,而第二行代碼則是利用計(jì)算輪廓面積和計(jì)算輪廓周長(zhǎng)的函數(shù)進(jìn)行輪廓篩選。其實(shí)這里我們也可以選擇不進(jìn)行篩選直接進(jìn)行獲取,但是在一般情況下

均值模糊,邊緣檢測(cè),周長(zhǎng),面積等都是十分有用的操作,至于怎么用則需要根據(jù)實(shí)際情況進(jìn)行調(diào)整。

邊緣檢測(cè)

這里還提到了邊緣檢測(cè),邊緣檢測(cè)顧名思義就是檢測(cè)圖片的邊緣。在一些特殊情況下其實(shí)邊緣檢測(cè)比直接輪廓獲取有用,不過(guò)也有些時(shí)候圖像分割的一些技術(shù)更有用一些。這幾項(xiàng)技術(shù)的特點(diǎn)都是作用于圖像中的區(qū)域?qū)ζ溥M(jìn)行處理。只不過(guò)在沒(méi)有深度學(xué)習(xí)的時(shí)代,沒(méi)有像目標(biāo)檢測(cè),或者現(xiàn)代的更直接的自動(dòng)進(jìn)行圖像分割的技術(shù),只能使用各類算法進(jìn)行手動(dòng)操作,從不同的圖片中手動(dòng)設(shè)置不同的方法獲取我們想要的信息。

Canny就是一種比較常見的邊緣檢測(cè)方法,下面就是一個(gè)例子。我們將會(huì)在下一屆仔細(xì)的講講的邊緣檢測(cè)等有關(guān)圖像處理技術(shù)。


寫在最后

大概寫到這個(gè)時(shí)候感覺(jué)確實(shí)可以出個(gè)專欄了,所以正式規(guī)劃了《漫談?dòng)?jì)算機(jī)視覺(jué)》,頻率大概會(huì)一周一更,大概會(huì)從OpenCV將其,然后一直串到這兩年各個(gè)計(jì)算機(jī)視覺(jué)領(lǐng)域比較經(jīng)典深度神經(jīng)網(wǎng)絡(luò)。同時(shí)代碼會(huì)開源,之后代碼和有關(guān)數(shù)據(jù)前往FontTian的Github下載即可,包括之前的內(nèi)容都會(huì)穿上去,項(xiàng)目位置在這:https://github.com/FontTian/Gossipage_About_CV。

總結(jié)

以上是生活随笔為你收集整理的发现你的身形——OpenCV图像轮廓的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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