如何用Python实现图像最大像素距离检测并完成标注
二值图像最大像素距离检测Python实现方案
前置依赖
你需要提前安装3个常用工具库,安装命令如下:pip install opencv-python numpy scipy
实现逻辑
- 读取输入图像,灰度化后转二值图,提取所有前景像素的坐标
- 批量计算所有前景坐标两两之间的欧氏距离,筛选出距离最大的一对坐标点
- 在原图上绘制红色线段连接两个最远点,在线段旁标注具体距离数值
完整代码
import cv2 import numpy as np from scipy.spatial.distance import cdist # 1. 读取图像并预处理 img = cv2.imread("你的输入图像路径.png") # 替换成你的实际图像路径 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理,threshold阈值可以根据你的图像亮度调整 _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 2. 提取所有前景像素坐标(值为255的区域) points = np.column_stack(np.where(binary == 255)) if len(points) < 2: print("前景像素点不足2个,无法计算距离") exit() # 3. 计算两两之间的欧氏距离,找到最大距离对应的两个点 dist_matrix = cdist(points, points, metric='euclidean') max_dist = np.max(dist_matrix) # 找到最大距离的索引 y_idx, x_idx = np.where(dist_matrix == max_dist) point1 = points[y_idx[0]][::-1] # 转成opencv要求的(x,y)格式 point2 = points[x_idx[0]][::-1] # 4. 绘制红色线段和标注 cv2.line(img, tuple(point1), tuple(point2), (0,0,255), 2) # BGR格式,(0,0,255)对应红色,线宽2 # 标注文本放在线段中间位置 text_pos = ((point1[0] + point2[0])//2, (point1[1] + point2[1])//2) cv2.putText(img, f"Max dist: {max_dist:.2f}px", text_pos, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2) # 5. 展示和保存结果 print(f"最大像素距离为: {max_dist:.2f} 像素") cv2.imshow("Result", img) cv2.waitKey(0) cv2.destroyAllWindows() # 如需保存结果可取消注释下面这行 # cv2.imwrite("result.png", img)
注意事项
- 输入图像如果本身就是二值图,可以跳过二值化步骤,直接提取坐标即可
- 如果需要计算实际物理距离,拿到图像的比例尺(比如1像素对应0.1毫米)后,把得到的
max_dist乘以比例尺即可 - 图像尺寸过大(超过2000*2000)且前景像素极多的情况下,
cdist计算会占用较多内存,这种情况可以先通过凸包算法简化前景坐标,再计算最大距离,能大幅提升运行效率
内容的提问来源于stack exchange,提问作者xXcCvV
相关产品推荐
相关产品推荐

