如何在Python中计算二值图像轮廓到图像中心的最远距离?
Python中获取图像轮廓上距中心最远点的实现方法
核心思路
要找到轮廓上距离图像中心最远的点,核心是计算轮廓上每个点到中心的距离,再筛选出距离最大的点。无需依赖argmin/argmax找极值点的逻辑,直接通过距离计算即可实现。
实现步骤与代码
- 图像预处理:读取图像后转为灰度图,再二值化得到黑白轮廓图
- 提取轮廓:使用OpenCV的
findContours函数获取图像中的轮廓 - 计算图像中心:根据图像尺寸算出中心坐标
- 遍历轮廓点计算距离:对每个轮廓点,计算其到中心的距离(用平方距离可避免开根号,提升效率)
- 筛选最远点:找到距离最大的点的坐标
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
相关产品推荐
相关产品推荐

