網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、cv2.contourArea
起初使用該函數(shù)的時(shí)候看不懂返回的面積,有0有負(fù)數(shù)的,于是研究了一下。
opencv計(jì)算輪廓內(nèi)面積函數(shù)使用的是格林公式計(jì)算輪廓內(nèi)面積的,公式如下:
由于格林公式計(jì)算單連通域面積是以逆時(shí)針為正方向的,而有時(shí)候我們輸入的邊緣數(shù)組是按照順時(shí)針輸入的,所以導(dǎo)致計(jì)算面積會(huì)出現(xiàn)負(fù)數(shù);計(jì)算面積存在0的情況一般是只存在一個(gè)像素點(diǎn)作為邊緣點(diǎn),所以面積為0。
?代碼如下:
img = cv2.imread('test.png', 0) contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) area = [] topk_contours =[] for i in range(len(contours)): a = cv2.contourArea(contours[i], True) area.append(abs(a)) topk = 2 #取最大面積的個(gè)數(shù) for i in range(2): top = area.index(max(area)) area.pop(top) topk_contours.append(contours[top]) x, y = img.shape mask = np.zeros((x, y, 3)) mask_img = cv2.drawContours(mask, topk_contours, -1, (255, 255, 255), 1) cv2.imwrite('mask_img.png', mask_img, [int(cv2.IMWRITE_JPEG_QUALITY), 100]) cv2.imshow('mask_img:', mask_img) cv2.waitKey(0) cv2.destroyAllWindows()
結(jié)果如下:
二、按像素個(gè)數(shù)計(jì)算連通域面積
這邊再給出一種用邊緣內(nèi)像素個(gè)數(shù)來計(jì)算連通域面積的方法:
img = cv2.imread('test.png', 0) contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) area = [] topk_contours =[] x, y = img.shape for i in range(len(contours)): # 對(duì)每一個(gè)連通域使用一個(gè)掩碼模板計(jì)算非0像素(即連通域像素個(gè)數(shù)) single_masks = np.zeros((x, y)) fill_image = cv2.fillConvexPoly(single_masks, contours[i], 255) pixels = cv2.countNonZero(fill_image) area.append(pixels) topk = 2 #取最大面積的個(gè)數(shù) for i in range(2): top = area.index(max(area)) area.pop(top) topk_contours.append(contours[top]) mask = np.zeros((x,y,3)) mask_img = cv2.drawContours(mask, topk_contours, -1, (255, 255, 255), 1) cv2.imwrite('mask_img.png', mask_img, [int(cv2.IMWRITE_JPEG_QUALITY), 100]) cv2.imshow('mask_img:', mask_img) cv2.waitKey(0) cv2.destroyAllWindows()
原文鏈接:https://blog.csdn.net/Vertira/article/details/123815246
相關(guān)推薦
- 2022-10-17 QT?TCP實(shí)現(xiàn)簡(jiǎn)單的通信示例_C 語(yǔ)言
- 2022-07-18 async+await:發(fā)送Ajax請(qǐng)求
- 2023-06-03 一文帶你吃透Python中的os和sys模塊_python
- 2022-08-12 Python中深拷貝與淺拷貝的區(qū)別介紹_python
- 2022-06-30 C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解_C 語(yǔ)言
- 2022-03-22 C++制作鼠標(biāo)連點(diǎn)器實(shí)例代碼_C 語(yǔ)言
- 2022-08-18 Flutter中關(guān)于angle的踩坑記錄_Android
- 2022-11-24 Flutter開發(fā)setState能否在build中直接調(diào)用詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支