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

如何在Python中计算二值图像轮廓到图像中心的最远距离?

Python中获取图像轮廓上距中心最远点的实现方法

核心思路

要找到轮廓上距离图像中心最远的点,核心是计算轮廓上每个点到中心的距离,再筛选出距离最大的点。无需依赖argmin/argmax找极值点的逻辑,直接通过距离计算即可实现。

实现步骤与代码

  1. 图像预处理:读取图像后转为灰度图,再二值化得到黑白轮廓图
  2. 提取轮廓:使用OpenCV的findContours函数获取图像中的轮廓
  3. 计算图像中心:根据图像尺寸算出中心坐标
  4. 遍历轮廓点计算距离:对每个轮廓点,计算其到中心的距离(用平方距离可避免开根号,提升效率)
  5. 筛选最远点:找到距离最大的点的坐标
import cv2
import numpy as np

# 1. 读取并预处理图像
img = cv2.imread('your_image_path.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化(根据图像调整阈值,这里用自动阈值)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 2. 提取轮廓
# 兼容OpenCV不同版本的返回值,取轮廓列表
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 假设处理最大的轮廓(如果有多个轮廓)
max_contour = max(contours, key=cv2.contourArea)

# 3. 计算图像中心
h, w = img.shape[:2]
center_x, center_y = w // 2, h // 2

# 4. 计算每个轮廓点到中心的平方距离(避免开根号,不影响大小比较)
# 把轮廓点转为二维数组,形状为(N, 2)
contour_points = max_contour.reshape(-1, 2)
# 计算每个点与中心的坐标差
dx = contour_points[:, 0] - center_x
dy = contour_points[:, 1] - center_y
dist_sq = dx**2 + dy**2

# 5. 找到最远点
max_dist_idx = np.argmax(dist_sq)
farthest_point = contour_points[max_dist_idx]
max_distance = np.sqrt(dist_sq[max_dist_idx])  # 如需实际距离则开根号

print(f"最远点坐标:{farthest_point}")
print(f"到中心的距离:{max_distance:.2f}")

# 可选:在图像上标记中心和最远点
cv2.circle(img, (center_x, center_y), 5, (0, 255, 0), -1)
cv2.circle(img, tuple(farthest_point), 5, (0, 0, 255), -1)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键说明

  • 如果图像中有多个轮廓,可选择遍历所有轮廓的点来寻找全局最远点,只需把max_contour替换为所有轮廓点的合并数组即可
  • 使用平方距离计算可以避免开根号运算,大幅提升计算效率,仅在需要实际距离数值时再开根号
  • OpenCV中轮廓点的坐标顺序是(x, y),与图像的宽、高对应(x对应宽度方向,y对应高度方向)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:03:20