如何基于图像边界创建掩码?需实现绿圈、蓝黄区域的掩码生成
颜色区域掩码生成解决方案
问题根源
你当前代码的核心问题是颜色通道顺序不匹配:将图像从BGR转为RGB后,仍用BGR通道顺序定义颜色范围,导致cv2.inRange的阈值判断完全错误。此外,颜色阈值法易受光照、噪声干扰,如果你已经掌握区域边界坐标,用多边形填充生成掩码会更精准。
一、修复颜色阈值法提取绿色掩码
提供两种修正方案:
方案1:保留BGR格式处理
不转换图像通道,直接用BGR顺序定义颜色范围:
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(path + filenames[0], cv2.IMREAD_COLOR) # 颜色范围保持[B, G, R]顺序 lower = np.array([0, 90, 0]) upper = np.array([50, 235, 100]) thresh = cv2.inRange(img, lower, upper) plt.imshow(thresh, cmap='gray') plt.show()
方案2:转RGB后匹配通道顺序
转换为RGB图像后,将颜色范围调整为[R, G, B]顺序:
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(path + filenames[0], cv2.IMREAD_COLOR) RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 颜色范围改为[R, G, B]顺序 lower_rgb = np.array([0, 90, 0]) upper_rgb = np.array([100, 235, 50]) thresh_rgb = cv2.inRange(RGB_img, lower_rgb, upper_rgb) plt.imshow(thresh_rgb, cmap='gray') plt.show()
二、利用已知边界坐标生成精准掩码(推荐)
既然你已经掌握各区域的x、y边界坐标(如多边形顶点),直接用多边形填充生成掩码,完全不受颜色偏差影响:
示例代码(绿色眼睛区域)
假设green_eye_points是绿色眼睛的边界顶点列表(格式:[[x1,y1], [x2,y2], ..., [xn,yn]]):
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(path + filenames[0], cv2.IMREAD_COLOR) # 创建与原图尺寸一致的空白单通道掩码 mask = np.zeros_like(img[:, :, 0]) # 转换顶点格式为cv2要求的int32类型 points = np.array(green_eye_points, dtype=np.int32) # 填充多边形区域为白色(255) cv2.fillPoly(mask, [points], 255) plt.imshow(mask, cmap='gray') plt.show()
蓝色、黄色区域只需替换对应的边界坐标列表即可复用此代码。
进阶优化:HSV颜色空间阈值
如果颜色阈值法仍不理想,可切换到HSV空间(对光照变化更鲁棒):
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(path + filenames[0], cv2.IMREAD_COLOR) hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 绿色在HSV中的典型范围(可根据实际图像微调) lower_hsv = np.array([40, 40, 40]) upper_hsv = np.array([70, 255, 255]) thresh_hsv = cv2.inRange(hsv_img, lower_hsv, upper_hsv) plt.imshow(thresh_hsv, cmap='gray') plt.show()
内容的提问来源于stack exchange,提问作者user1631306
相关产品推荐
相关产品推荐

