You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决代码中的ZeroDivisionError: float division by zero问题?

Python计算轮廓紧凑度与圆度时ZeroDivisionError的解决方法

问题场景

运行以下代码计算轮廓紧凑度和圆度时触发ZeroDivisionError: float division by zero:

compactness_list = []
circularity_list = []

for contour in contours:
    perimeter =  cv2.arcLength(contour, True)
    area = cv2.contourArea(contour)

    compactness = (perimeter ** 2) /(area)
    compactness_list.append(compactness)

    circularity = (4 * np.pi * area) / (perimeter)
    circularity_list.append(circularity)

报错追踪:

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-165-aa66a2f29568> in <cell line: 4>()
      6     area = cv2.contourArea(contour)
      7 
----> 8     compactness = (perimeter ** 2) / (area)
      9     compactness_list.append(compactness)
     10 

ZeroDivisionError: float division by zero

错误原因

核心问题是当前遍历的轮廓面积为0,导致紧凑度计算时除数为0。此外,若轮廓周长为0(比如单个像素点的无效轮廓),后续圆度计算也会触发同样错误。这类无效轮廓通常来自图像预处理不彻底残留的噪点、单像素线条等。

解决方法

在计算前过滤掉面积或周长为0的无效轮廓,同时设置极小阈值规避浮点数精度问题:

修改后的代码

import cv2
import numpy as np

compactness_list = []
circularity_list = []

# 设置极小阈值,避免浮点数精度导致的接近0的误判
MIN_AREA = 1e-6
MIN_PERIMETER = 1e-6

for contour in contours:
    perimeter = cv2.arcLength(contour, True)
    area = cv2.contourArea(contour)
    
    # 仅处理有效轮廓
    if area > MIN_AREA and perimeter > MIN_PERIMETER:
        compactness = (perimeter ** 2) / area
        compactness_list.append(compactness)
        
        # 注意:标准圆度公式分母应为周长平方,完美圆形结果为1,原代码公式可能有误,按需调整
        circularity = (4 * np.pi * area) / (perimeter ** 2)
        circularity_list.append(circularity)

额外可选处理

如果需要保留所有轮廓的计算结果(即使无效),可以给无效轮廓设置默认值:

for contour in contours:
    perimeter = cv2.arcLength(contour, True)
    area = cv2.contourArea(contour)
    
    if area > MIN_AREA and perimeter > MIN_PERIMETER:
        compactness = (perimeter ** 2) / area
        circularity = (4 * np.pi * area) / (perimeter ** 2)
    else:
        compactness = 0.0  # 或业务需求的其他默认值
        circularity = 0.0
    
    compactness_list.append(compactness)
    circularity_list.append(circularity)

内容的提问来源于stack exchange,提问作者bymln

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:27:30