您好,登錄后才能下訂單哦!
小編給大家分享一下如何繪制OpenCV圖像輪廓,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
繪制輪廓的一般步驟:
1、讀取圖像
image = cv2.imread('image_path')
2、將原圖轉(zhuǎn)化為灰度圖像
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
3、將灰度圖像進(jìn)行二值化閾值處理
# 這里將閾值設(shè)置為127為例,最大閾值為255 t, binary = cv.threshold(image_gray, 127, 255, cv.THRESH_BINARY)
4、檢測二值化圖像中邊緣輪廓
# 這里以檢測所有輪廓,不建立層次關(guān)系為例 contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
5、在原圖上繪制圖像
# 這里將輪廓索引設(shè)置為-1,繪制出所有輪廓,顏色設(shè)置為紅色,寬度為2為例 cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
6、顯示圖像
cv2.imshow('image', image)
代碼如下:
# -*- coding: utf-8 -*- # @Time : 2021/8/17 # @Author : ZYh """ Introduction: 圖像輪廓檢測: OpenCV提供的findContours()方法可以通過計算圖像梯度來判斷出圖像的邊緣,然后將邊緣的點封裝成數(shù)組返回 contours, hierarchy = cv2.findContours(image, mode, mothode) 參數(shù): image->被檢測圖像必須是8位單通道二值圖像。如果原圖是rgb圖像,必須轉(zhuǎn)為灰度圖像,在進(jìn)行二值化閾值處理 mode->輪廓的檢索模式 參數(shù)值 含義 cv2.RETR_EXTERNAL 只檢測外輪廓 cv2.RETR_LIST 檢測所有輪廓,但不建立層次關(guān)系 cv2.RETR_CCOMP 檢測所有輪廓,并建立兩級層次關(guān)系 cv2.RETR_TREE 檢測所有輪廓,并建立樹狀結(jié)構(gòu)的層次關(guān)系 mothode->檢測輪廓時使用的方法 參數(shù)值 含義 cv2.CHAIN_NONE 儲存輪廓上的所有點 cv2.CHAIN_APPROX_SIMPLE 只保存水平、垂直或?qū)蔷€輪廓的端點 cv2.CHAIN_APPROX_TC89_L1 Ten_Chinl近似算法的一種 cv2.CHAIN_APPROX_TC89_KCOS Ten_Chinl近似算法的一種 retval: contours->檢測出的所有輪廓,list類型,每一個元素都是某個輪廓的像素坐標(biāo)數(shù)組 hierarchy->輪廓之間的層次關(guān)系 圖像輪廓繪制: image = cv2.drawContours(image, contours, contourIdx, color, thickness, lineTypee, hierarchy, maxLevel, offse) 參數(shù): image->被繪制輪廓的原始圖像,可以是多通道圖像 contours->findContours()方法得出的輪廓列表 contourIdx->繪制輪廓的索引,如果為-1則繪制所有輪廓 color:繪制顏色,BGR格式 thickness->可選參數(shù),畫筆的粗細(xì),如果為-1則繪制實心輪廓 lineTypee->可選參數(shù),繪制輪廓的線型 hierarchy->可選參數(shù),findContours()方法得出的層次關(guān)系 maxLevel->可選參數(shù),繪制輪廓的層次深度,最深繪制第maxLevel層 offse->可選參數(shù),偏移量,可以改變繪制結(jié)果的位置 """ import cv2 as cv # 讀取加載圖像 image1 = cv.imread('shape1.png') image2 = cv.imread('shape1.png') # 將圖像由RGB格式轉(zhuǎn)為灰度圖像 gray1 = cv.cvtColor(image1, cv.COLOR_BGR2GRAY) gray2 = cv.cvtColor(image2, cv.COLOR_BGR2GRAY) # 將圖像進(jìn)行二值化閾值處理, 返回t是處理時采用的閾值,binary是閾值處理后的圖像 t1, binary1 = cv.threshold(gray1, 127, 255, cv.THRESH_BINARY) t2, binary2 = cv.threshold(gray2, 127, 255, cv.THRESH_BINARY) # 檢測圖像中出現(xiàn)的所有輪廓,記錄輪廓的每一個點 contours1, hierarchy1 = cv.findContours(binary1, cv.RETR_LIST, cv.CHAIN_APPROX_NONE) # 顯示原圖 cv.imshow('image', image1) # 繪制所有輪廓,寬度為3,顏色為紅色 cv.drawContours(image1, contours1, -1, (0, 0, 255), 3) cv.imshow('cv.RETR_LIST', image1) # 檢測圖像中的外輪廓,記錄輪廓的每一個點 contours2, hierarchy2 = cv.findContours(binary2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE) # 使用cv2.RETR_EXTERNAL做參數(shù)繪制外輪廓,寬度為3,顏色為藍(lán)色 cv.drawContours(image2, contours2, -1, (255, 0, 0), 3) cv.imshow('cv.RETR_EXTERNAL', image2) cv.waitKey() cv.destroyAllWindows()
運行結(jié)果:
代碼如下:
# -*- coding: utf-8 -*- # @Time : 2021/8/18 # @Author : ZYh """ Introduction: 繪制花朵所有輪廓 """ import cv2 as cv image_flower = cv.imread('flower.png') # 顯示原圖 cv.imshow('flower1', image_flower) # 對圖像進(jìn)行中值濾波處理,去除噪聲 image_flower = cv.medianBlur(image_flower, 5) cv.imshow('flower2', image_flower) # 將圖像從RGB轉(zhuǎn)為單通道灰度圖像 gray_flower = cv.cvtColor(image_flower, cv.COLOR_BGR2GRAY) # 灰度圖像進(jìn)行二值化閾值處理 t, binary = cv.threshold(gray_flower, 127, 255, cv.THRESH_BINARY) # 顯示二值化圖像 cv.imshow('binary', binary) # 獲取二值化圖像中的輪廓以及輪廓層次 contours, hierarchy = cv.findContours(binary, cv.RETR_LIST, cv.CHAIN_APPROX_NONE) # 在原圖中繪制輪廓 cv.drawContours(image_flower, contours, -1, (0, 255, 255), 2) # 顯示繪制輪廓后的圖像 cv.imshow('cv.RETR_LIST', image_flower) cv.waitKey() cv.destroyAllWindows()
運行結(jié)果:
以上是“如何繪制OpenCV圖像輪廓”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。