求Python实现照片球体检测、尺寸换算及间距测量的最简方案
高对比度球体检测+自动测距Python实现方案
核心依赖库
仅需两个核心库即可完成全流程,无需复杂深度学习框架,非编程人员也能快速上手:
opencv-python:内置成熟的霍夫圆变换算法,专门适配高对比度背景下的圆形几何图形检测,无需训练模型numpy:配套做基础数值计算
可选依赖:matplotlib用于调试阶段可视化检测结果,批量处理时可移除
实现逻辑(无人工干预全自动化)
你的场景属于规则几何图形+固定实际尺寸+高对比度背景,逻辑非常简洁:
- 图像预处理:读入图像后转灰度图,做高斯模糊降噪,过滤背景杂点避免干扰检测
- 球体检测:调用霍夫圆检测接口,直接输出所有球体的圆心像素坐标、球体像素半径
- 比例尺计算:取所有检测到的球体的半径平均值,计算得到球体平均像素直径,结合已知的1cm实际直径,得到图像的厘米/像素换算比例
- 实际距离计算:任意两个球体的圆心像素距离乘以比例尺,即可得到二者的实际物理距离
最简可运行代码
import cv2 import numpy as np # ========== 可调参数(同批次图像调整1次即可固定使用) ========== # 球体最小/最大像素半径,根据你的图像实际大小填写大概范围即可 MIN_RADIUS = 5 MAX_RADIUS = 100 # 检测灵敏度:数值越高检测越严格,误检越少;出现漏检可适当调低 DETECT_SENSITIVITY = 30 # 两个球体的最小间隔(像素),避免同一个球被重复检测 MIN_DISTANCE = 2 * MIN_RADIUS # ================================================================= def process_image(img_path): # 读入图像并预处理 img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray_blur = cv2.GaussianBlur(gray, (5, 5), 0) # 检测所有圆形球体 circles = cv2.HoughCircles( gray_blur, method=cv2.HOUGH_GRADIENT, dp=1, minDist=MIN_DISTANCE, param1=50, param2=DETECT_SENSITIVITY, minRadius=MIN_RADIUS, maxRadius=MAX_RADIUS ) if circles is None: return None, None, None circles = np.uint16(np.around(circles))[0] # 计算图像比例尺(单位:cm/像素) avg_radius_pix = np.mean([c[2] for c in circles]) scale = 1 / (avg_radius_pix * 2) # 示例:计算前两个球体的实际距离,可根据需求替换为任意两个球的索引 real_distance = None if len(circles) >= 2: x1, y1 = circles[0][0], circles[0][1] x2, y2 = circles[1][0], circles[1][1] pix_dist = np.sqrt((x1 - x2)**2 + (y1 - y2)**2) real_distance = pix_dist * scale return circles, scale, real_distance # 调用示例 if __name__ == "__main__": circles, scale, real_dist = process_image("你的图像文件路径.jpg") print(f"当前图像比例尺:{scale:.6f} cm/像素") if real_dist: print(f"示例两个球体的实际距离:{real_dist:.2f} cm")
调参说明
同光照同拍摄距离的批次照片仅需调整一次参数即可通用:
- 先根据图像中球体的大概大小填写
MIN_RADIUS和MAX_RADIUS,排除明显不是球体的检测结果 - 调整
DETECT_SENSITIVITY:如果出现非球体的杂点被误检为圆,就调高数值;如果有球体没被检测到,就调低数值
内容的提问来源于stack exchange,提问作者BlueScreen
相关产品推荐
相关产品推荐

