基于Python实现沿自定义中线分割图像的技术方案咨询
解决方案
可以通过创建掩码+位运算的方式实现沿中线分割图像,以下是基于OpenCV和NumPy的具体实现步骤:
步骤1:导入依赖库
import cv2 import numpy as np
步骤2:定义坐标与加载图像
# 你的中点坐标数组 midline_points = [(954, 88), (905, 97), (855, 107), (805, 114), (755, 125), (705, 134), (655, 139), (605, 141), (555, 139), (505, 134), (455,139), (405, 146), (355, 146), (305, 144), (255, 145), (205, 125), (155, 120), (105, 114), (55, 104), (1, 156)] # 转换为OpenCV可处理的int32格式数组 points = np.array(midline_points, np.int32) # 加载原始图像,替换为你的图像路径 img = cv2.imread("原始图像.png") height, width = img.shape[:2]
步骤3:生成上下区域掩码并分割图像
提取上半部分图像
上半区域需要将中线与图像顶部边界连接成闭合多边形,以此生成掩码:
# 构建上半区域闭合多边形顶点 upper_polygon = np.concatenate([ [[0, 0]], # 图像左上角 [[width - 1, 0]], # 图像右上角 points[::-1], # 反转中线坐标,从最后一个点回到第一个点 [[0, 0]] # 闭合多边形 ]) # 创建上半区域掩码 upper_mask = np.zeros((height, width), dtype=np.uint8) cv2.fillPoly(upper_mask, [upper_polygon], 255) # 提取上半部分图像 upper_img = cv2.bitwise_and(img, img, mask=upper_mask)
提取下半部分图像
下半区域将中线与图像底部边界连接成闭合多边形:
# 构建下半区域闭合多边形顶点 lower_polygon = np.concatenate([ [[0, height - 1]], # 图像左下角 [[width - 1, height - 1]], # 图像右下角 points, # 原始中线坐标顺序 [[0, height - 1]] # 闭合多边形 ]) # 创建下半区域掩码 lower_mask = np.zeros((height, width), dtype=np.uint8) cv2.fillPoly(lower_mask, [lower_polygon], 255) # 提取下半部分图像 lower_img = cv2.bitwise_and(img, img, mask=lower_mask)
步骤4:保存或查看结果
# 保存分割后的图像 cv2.imwrite("上半部分图像.png", upper_img) cv2.imwrite("下半部分图像.png", lower_img) # 显示结果(可选) cv2.imshow("Upper Part", upper_img) cv2.imshow("Lower Part", lower_img) cv2.waitKey(0) cv2.destroyAllWindows()
关键注意事项
- 确保中线坐标的顺序是连续的(从图像一侧到另一侧),否则多边形可能出现异常
- 如果使用PIL库实现,逻辑类似:通过
ImageDraw绘制闭合多边形掩码,再用Image.composite提取区域
内容的提问来源于stack exchange,提问作者Mirote
相关产品推荐
相关产品推荐

