如何使用Python提取图像中蓝色特定像素的x、y坐标并实现流程自动化
分割图像蓝色点坐标自动化提取方案

最优方案:直接从原始分割掩码提取坐标(无坐标偏移)
你现有代码已经生成了分割掩码full_mask,不需要再读取保存后的图片(matplotlib保存的图片会自带坐标轴、白边,导致坐标和原图不匹配),直接在原有代码的基础上添加坐标提取逻辑即可。
完整修改后代码
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('./S3/frame35.jpg') result = image.copy() image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 原有红色范围分割逻辑 lower1 = np.array([0, 100, 20]) upper1 = np.array([10, 255, 255]) lower2 = np.array([160,100,20]) upper2 = np.array([179,255,255]) lower_mask = cv2.inRange(image, lower1, upper1) upper_mask = cv2.inRange(image, lower2, upper2) full_mask = lower_mask + upper_mask # ==========新增坐标提取逻辑========== # opencv中图像维度顺序为(高,宽),np.where返回的第一个数组是y坐标(行号),第二个是x坐标(列号) y_coords, x_coords = np.where(full_mask > 0) # 打包为(x,y)格式的坐标集合 point_coords = list(zip(x_coords, y_coords)) # 输出结果 print("所有目标点坐标集合:", point_coords) # 可选:将坐标保存为txt文件,方便后续调用 np.savetxt("target_points.txt", point_coords, fmt="%d", header="x y") # ================================== result = cv2.bitwise_and(result, result, mask=full_mask) plt.figure(figsize=[20,20]) plt.axis("off") plt.subplot(122);plt.imshow(result, cmap='gray');plt.title("Mask of red Color",fontdict={'fontsize': 25});plt.axis('on'); # 若需要保存无偏移的分割图,添加以下参数避免白边和坐标轴干扰 plt.savefig('mask_1.jpg', bbox_inches = 'tight', pad_inches=0) cv2.waitKey(0) cv2.destroyAllWindows()
备用方案:从已保存的分割图提取蓝色点坐标
如果仅保留了mask_1.jpg没有原始掩码,可通过蓝色颜色分割提取坐标:
import cv2 import numpy as np # 读取保存的分割图 mask_img = cv2.imread("mask_1.jpg") hsv = cv2.cvtColor(mask_img, cv2.COLOR_BGR2HSV) # 蓝色HSV阈值,可根据实际显示的蓝色深浅调整 lower_blue = np.array([90, 50, 50]) upper_blue = np.array([130, 255, 255]) blue_mask = cv2.inRange(hsv, lower_blue, upper_blue) # 提取坐标 y_blue, x_blue = np.where(blue_mask > 0) blue_point_coords = list(zip(x_blue, y_blue)) print("蓝色点坐标集合:", blue_point_coords)
注意事项
- 优先使用第一种方案,得到的坐标和原始输入图像的像素坐标完全对应
- 第二种方案得到的坐标是分割图的像素坐标,和原图坐标存在偏移,仅适用于无原始数据的场景
内容的提问来源于stack exchange,提问作者AMANDEEP KAUR
相关产品推荐
相关产品推荐

