如何将图像分割掩码叠加到原始图像,生成带彩色分割标注的可视化效果
分割掩码彩色叠加效果实现方案
问题说明
我有原始图像及其对应的分割掩码,需要实现将彩色分割标注叠加在原始图像上的效果。参考相关资料编写了如下代码,但运行后输出结果和输入的原始图像完全一致,无法得到预期效果。
import skimage.filters.rank import skimage.morphology import numpy as np import cv2 # 以灰度模式读取图像,将原图转为BGR格式方便叠加彩色标注 seg = cv2.imread('segmented.png',cv2.IMREAD_GRAYSCALE) main = cv2.imread('main.png',cv2.IMREAD_GRAYSCALE) main = cv2.cvtColor(main,cv2.COLOR_GRAY2BGR) # 创建形态学操作的结构元素 selem = skimage.morphology.disk(1) # 提取类别1和类别2的边缘掩码 # 逻辑为查找黑像素周边半径1像素内、分割值为1/2的像素点 seg1 = (skimage.filters.rank.minimum(seg,selem) == 0) & (skimage.filters.rank.maximum(seg, selem) == 1) seg2 = (skimage.filters.rank.minimum(seg,selem) == 0) & (skimage.filters.rank.maximum(seg, selem) == 2) main[seg1,:] = np.asarray([0, 0, 255]) # 类别1边缘标红色 main[seg2,:] = np.asarray([0, 255, 255]) # 类别2边缘标黄色 # 保存结果 cv2.imwrite('result.png',main)
相关素材
- 原始图像:

- 分割掩码图像:

- 预期效果示例:

问题原因
- 原有代码逻辑仅适配分割掩码中类别取值为1、2的场景,你使用的掩码类别像素值不符合这个预设,导致
seg1、seg2两个布尔掩码全部为False,没有任何像素被修改,所以输出和原图完全一致。 - 原有逻辑仅绘制分割区域的边缘,和你需要的整区域半透明叠加的需求不匹配。
修复后代码
import numpy as np import cv2 # 读取图像 seg = cv2.imread('segmented.png', cv2.IMREAD_GRAYSCALE) main = cv2.imread('main.png') # 可先运行该行查看掩码中的所有类别值,按需调整color_map的键 # print(np.unique(seg)) # 定义类别到颜色的映射(BGR格式,为OpenCV默认通道顺序) color_map = { 1: [0, 0, 255], # 红色 2: [0, 255, 255], # 黄色 # 可按需添加更多类别对应的颜色 } # 叠加透明度,取值范围0-1,数值越大彩色标注越不透明 alpha = 0.4 for class_id, color in color_map.items(): mask = (seg == class_id) if not np.any(mask): continue # 生成彩色掩码层 color_layer = np.zeros_like(main) color_layer[mask] = color # 阿尔法混合实现半透明叠加 main[mask] = cv2.addWeighted(main[mask], 1 - alpha, color_layer[mask], alpha, 0) # 可选功能:叠加分割边界线 # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) # for class_id, color in color_map.items(): # mask = (seg == class_id).astype(np.uint8) # edge = cv2.morphologyEx(mask, cv2.MORPH_GRADIENT, kernel) # main[edge == 1] = color # 保存结果 cv2.imwrite('result.png', main)
内容的提问来源于stack exchange,提问作者AMANDEEP KAUR
相关产品推荐
相关产品推荐

