如何获取分割图像中矩形船舶的纵向对称线像素?
提取矩形船舶纵向对称线的可行思路
方法1:基于目标区域的重心计算
你的数据集是二值分割图,白色(像素值1)区域为矩形船舶,直接计算所有船舶像素的x坐标均值,这个均值对应的竖线就是纵向对称线:
- 遍历图像,收集所有像素值为1的点的
(x,y)坐标 - 计算所有x坐标的平均值
x_mean,纵向对称线即为x = x_mean这条竖线 - 代码示例(OpenCV+NumPy):
import cv2 import numpy as np mask = cv2.imread('ship_mask.png', 0) # 读取二值分割图 # 获取所有船舶像素的坐标 y_coords, x_coords = np.where(mask == 1) if len(x_coords) > 0: x_mean = np.mean(x_coords) symmetry_line_x = int(round(x_mean))
若之前用均值方法失败,大概率是误取了轮廓边缘像素而非所有目标区域像素,后者的均值才是更准确的重心位置。
方法2:基于垂直投影的峰值检测
垂直投影统计每一列的白色像素数量,矩形船舶的投影曲线呈中间高、两侧低的对称形态,峰值对应的列即为对称线:
- 生成垂直投影数组:
proj = np.sum(mask, axis=0),proj[i]代表第i列的白色像素总数 - 若存在噪声导致投影多峰值,可先用高斯滤波平滑曲线,再取峰值索引
- 代码示例:
proj = np.sum(mask, axis=0) # 平滑投影曲线 smoothed_proj = cv2.GaussianBlur(proj.reshape(-1,1), (5,1), 0).flatten() symmetry_line_x = np.argmax(smoothed_proj)
方法3:基于最小外接矩形的对称轴
利用矩形的几何特性,先获取船舶的最小外接矩形,其垂直中线即为纵向对称线:
- 提取图像轮廓时,筛选面积最大的轮廓(避免噪声小轮廓干扰)
- 用
cv2.minAreaRect获取矩形的中心坐标,中心x值就是对称线的x坐标 - 代码示例:
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 取面积最大的轮廓作为船舶主体 max_contour = max(contours, key=cv2.contourArea) rect = cv2.minAreaRect(max_contour) center_x, _ = rect[0] symmetry_line_x = int(round(center_x))
关键预处理建议
若分割图存在零星噪声像素,先通过形态学开运算(cv2.morphologyEx)去除噪声,避免干扰坐标计算;计算后可拿样本图像与手动标注的蓝色线对比,调整平滑窗口、轮廓筛选等参数优化结果。
内容的提问来源于stack exchange,提问作者Shadman Mahmood
相关产品推荐
相关产品推荐

