Python+Opencv实现计算闭合区域面积

叶初
叶初
发布时间:2026-10-15| 4人浏览过
原创

本文介绍利用Python和OpenCV计算闭合区域面积的两种方法。首先解析cv2.contourArea函数基于格林公式的原理,说明逆时针与顺时针输入对结果正负的影响。其次提供通过填充连通域并统计非零像素个数来计算面积的替代方案,适用于需要精确像素计数的场景。

一、cv2.contourArea

在初次使用这个函数时,返回的面积值有时为0或负数,让人难以理解。经过研究后发现,这涉及到具体的计算原理。

OpenCV中计算轮廓内部面积的函数,其底层逻辑是基于格林公式(Green's Theorem)来实现的,具体公式如下:

格林公式在计算单连通域面积时,默认以逆时针方向为正方向。如果输入的轮廓数组是按照顺时针方向排列的,计算出的面积就会显示为负数。而面积为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 #取最大面积的个数
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()

运行结果如下:

二、按像素个数计算连通域面积

这里介绍另一种基于连通域内部像素数量来计算面积的方法:

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)):
    # 对每一个连通域使用一个掩码模板计算非0像素(即连通域像素个数)
    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 #取最大面积的个数
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()

关于Python结合OpenCV计算闭合区域面积的讲解就到这里,更多关于Python和OpenCV面积处理的内容,欢迎查阅本站往期文章或继续浏览后续内容,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。