如何使用Python+OpenCV在圖像上找到并繪制等高線(xiàn)?
在地形圖中,你有沒(méi)有注意到在山區(qū)和地形圖中海拔高的區(qū)域周?chē)?huà)的線(xiàn)?這些線(xiàn)被稱(chēng)為地形等高線(xiàn)。它們給出了地形的高程剖面圖。這些線(xiàn)條要么是手工繪制的,要么是電腦生成的。
在本文中,我們將看到如何使用OpenCV在一個(gè)簡(jiǎn)單的圖像上繪制等高線(xiàn)。
findContours函數(shù)OpenCV為我們提供了“findContours”函數(shù),該函數(shù)在二值圖像中查找輪廓,并將其存儲(chǔ)為一個(gè)numpy坐標(biāo)點(diǎn)數(shù)組。函數(shù)定義如下。cv.findContours(image,
mode,
method[,
contours[,
hierarchy[,
offset]]]) ->contours, hierarchy
image-源,一個(gè)8位單通道圖像。非零像素被視為1。零像素仍然是0,所以圖像被視為二進(jìn)制。mode-輪廓檢索模式。method-等值線(xiàn)近似法。以及其他三個(gè)可選參數(shù)。輪廓檢索模式第二個(gè)參數(shù),即輪廓檢索方式,用于檢索圖像中輪廓之間的關(guān)系。例如,在圖像中,可能會(huì)有輪廓內(nèi)的輪廓,就像嵌套輪廓一樣。在這種情況下,我們稱(chēng)外部輪廓為父線(xiàn),稱(chēng)內(nèi)部輪廓為子線(xiàn)。在使用findContours函數(shù)時(shí),應(yīng)該檢索輪廓之間的這些關(guān)系,并將其存儲(chǔ)在一個(gè)變量中。如果需要的話(huà),它們也可以在未來(lái)使用。OpenCV中有四種檢索模式,分別是cv.RETR_LIST,cv.RETR_TREE,cv.RETR_CCOMP,cv.RETR_EXTERNAL。為了清楚地了解檢索模式,強(qiáng)烈建議參考OpenCV的輪廓官方教程:https://docs.opencv.org/master/d9/d8b/tutorial_py_contours_hierarchy.html。輪廓近似方法OpenCv中有兩種輪廓逼近方法。它們是cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE。如果通過(guò)cv.CHAIN_APPROX_NONE,則將存儲(chǔ)輪廓的所有邊界點(diǎn)。但實(shí)際上,我們需要所有的點(diǎn)嗎?例如,你發(fā)現(xiàn)了一條直線(xiàn)的輪廓線(xiàn)。需要這條直線(xiàn)上的所有點(diǎn)來(lái)表示這條直線(xiàn)嗎?不,我們只需要這條線(xiàn)的兩個(gè)端點(diǎn)。這就是cv.CHAIN_APPROX_SIMPLE所做的。它刪除所有冗余點(diǎn)并壓縮輪廓,從而節(jié)省內(nèi)存。drawContours函數(shù)找到等高線(xiàn)后,將等高線(xiàn)的坐標(biāo)點(diǎn)(x, y)存儲(chǔ)在一個(gè)數(shù)組中,就可以用這些點(diǎn)在圖像上繪制等高線(xiàn)。我們使用OpenCV的drawcontour函數(shù)來(lái)做同樣的事情。cv.drawContours(image,
contours,
contourIdx,
color[,
thickness[,
lineType[,
hierarchy[,
maxLevel[,
offset]]]]]) ->image
image- 目標(biāo)圖像。contours-所有輸入的輪廓線(xiàn)。每個(gè)輪廓被存儲(chǔ)為一個(gè)點(diǎn)向量。contourIdx-表示要繪制的輪廓的參數(shù)。如果是負(fù)數(shù),則畫(huà)出所有的等高線(xiàn)。color-輪廓的顏色。thickness-繪制輪廓時(shí)所用的線(xiàn)的粗細(xì)。如果為負(fù)值(例如,thickness=FILLED),則繪制輪廓內(nèi)部,F(xiàn)在,我們已經(jīng)學(xué)習(xí)了函數(shù)findContours和drawContours,讓我們運(yùn)行一個(gè)簡(jiǎn)單的代碼以將這些函數(shù)應(yīng)用于圖像:這是原始圖像:
import cv2 as cv
#read the image
img = cv.imread("D://medium_blogs//pattern1.jpg")
#convert the image to grayscale
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#blur image to reduce the noise in the image while thresholding
blur = cv.blur(gray, (10,10))
#Apply thresholding to the image
ret, thresh = cv.threshold(blur, 1, 255, cv.THRESH_OTSU)
#find the contours in the image
contours, heirarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
#draw the obtained contour lines(or the set of coordinates forming a line) on the original image
cv.drawContours(img, contours, -1, (0,255,0), 20)
#show the image
cv.namedWindow('Contours',cv.WINDOW_NORMAL)
cv.namedWindow('Thresh',cv.WINDOW_NORMAL)
cv.imshow('Contours', img)
cv.imshow('Thresh', thresh)
if cv.waitKey(0):
cv.destroyAllWindows()
閾值圖像和畫(huà)上輪廓的原始圖像如下。閾值圖像:
原始圖像上繪制的等高線(xiàn):
這就是如何在圖像上找到并繪制等高線(xiàn)的方法。你也可以在地圖上試試看。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書(shū)】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線(xiàn)會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線(xiàn)下論壇】第三屆安富利汽車(chē)生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠(chǎng)展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專(zhuān)題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 大廠(chǎng)紛紛入局,百度、阿里、字節(jié)搶奪Agent話(huà)語(yǔ)權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠(chǎng)為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷(xiāo)中東?
- 8 Robotaxi新消息密集釋放,量產(chǎn)元年誰(shuí)在領(lǐng)跑?
- 9 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過(guò)于簡(jiǎn)單
- 10 “搶灘”家用機(jī)器人領(lǐng)域,聯(lián)通、海爾、美的等紛紛入局