如何为Segment-Anything模型的可视化结果添加边缘效果?
解决Segment-Anything可视化带边缘的问题
你可以通过提取分割掩码的轮廓并叠加绘制来实现官网演示的带边缘效果。修改原有的show_anns函数,添加轮廓绘制逻辑即可,具体代码如下:
import cv2 import numpy as np import matplotlib.pyplot as plt def show_anns(anns): if len(anns) == 0: return sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True) ax = plt.gca() ax.set_autoscale_on(False) for ann in sorted_anns: m = ann['segmentation'] # 生成随机颜色掩码 color_mask = np.random.random((1, 3)).tolist()[0] img = np.ones((m.shape[0], m.shape[1], 3)) * color_mask # 绘制半透明掩码 ax.imshow(np.dstack((img, m * 0.35))) # 提取掩码的轮廓 mask = (m * 255).astype(np.uint8) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓(用黑色,和官网效果一致) for cnt in contours: # 转换为matplotlib的坐标格式 cnt = cnt.squeeze() if len(cnt.shape) == 2: # 确保轮廓是二维点集 ax.plot(cnt[:, 0], cnt[:, 1], color='black', linewidth=1)
关键说明:
- 使用
cv2.findContours从分割掩码中提取对象的外轮廓,这是实现边缘效果的核心步骤 - 把轮廓坐标转换为matplotlib兼容的格式后,用
ax.plot绘制黑色细线,和官网演示的边缘样式匹配 - 保持原有掩码的半透明绘制逻辑,只新增轮廓绘制部分,不影响原有掩码的显示效果
替换你原来的show_anns函数后,运行代码就能得到带边缘的可视化结果,和官网演示一致。
内容的提问来源于stack exchange,提问作者Hisan
相关产品推荐
相关产品推荐

