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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:06:01