语义分割的标签在原图像上显示

本文分享了一种在医学图像中直观展示语义分割结果的方法,通过将标签图像的非标签区域透明化并以彩色显示标签区域,实现了分割结果与原始图像的有效融合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做医学图像的语义分割,新手一枚,现实情况是小朋友我真得有很多问号【手动捂脸哭】。经过一段时间的钻(tuo)研(fa),终于有了些许眉目,也有时间在这里记录一下自己的一些想法。这篇博客主要介绍一种将最终标签在原始图像上显示的思路,在此之前在网上查找了好多,换了几种思路【新手总是要尝试些弯路,手动狗头】,希望有帮到也正在为这个问题发难的你。废话不多说了,上干货。

原始图像记为pic,分割后得到的标签图像label_pic,这两部分往往是单独的两个图片,或是两个数组。为了使分割结果更直观我们往往需要将标签在原始图像上进行显示,并希望显示的标签为彩色(pic往往是灰度图),不建议在原始图像上做修改,原因略。下面介绍我用的方法:

1. 要解决的第一个问题:将label图像上的非标签区域进行透明化,同时把标签区域设置为橙色(随意选择)。将标签数组(由于某些设计的需要和方便起见,我这里的标签是数组格式)转换为RGBA格式图像,因为RGBA格式图像可以修改透明度

from PIL import Image
import numpy as np
def show_label(label):
    img = Image.fromarray(np.uint8(label))  #我这里的label是数组形式,所以要改为图像格式
    img =img.convert('RGBA')   #转换成'RGBA格式
    x, y = img.size
    for i in range(x):
        for j in range(y):
            color = img.getpixel((i, j))
            Mean = np.mean(list(color[:-1]))
            if Mean < 255:      					# 我的标签区域为白色,非标签区域为黑色
                color = color[:-1] + (0,)    	    # 若非标签区域则设置为透明
            else:
                color = (255, 97, 0, 255)           # 标签区域设置为橙色,前3位为RGB值,最后一位为透明度情况,255为完全不透明,0为完全透明 
            img.putpixel((i, j), color)
    return img

以上代码参考借鉴:https://blog.youkuaiyun.com/qq_35106907/article/details/103223434

2. 把pic和步骤1转换出来的img一起显示就OK啦。

import matplotlib.pyplot as plt
new_label = trans(label)
plt.imshow(x, cmap='gray')
plt.imshow(new_label)
plt.show()

先简单记录下吧,以后有时间再讲的详细些。

感觉只要是语义分割的标签在原始图像上显示都可以采用这个思路,希望有帮到其他新手ヾ(◍°∇°◍)ノ゙,感谢点赞支持呀!

### 使用 PointNet++ 进行实例分割并训练自定义数据集 #### 数据集准备 为了使用 PointNet++ 对自定义数据集进行实例分割,首先需要准备好合适的数据集格式。通常情况下,PointNet 和 PointNet++ 的输入数据由点云的 XYZ 坐标组成,并可能附加 RGB 颜色信息和标签信息。根据已有资料[^3],标准点云样本数据集中应包含 (XYZ) 坐标以及 (label) 标签信息。 如果要扩展到实例分割任务,则需进一步提供每一点所属的具体实例 ID 或类别信息。例如,在 ShapeNet 数据集中,除了点云图像外还提供了 Label(分类类别)和 Target(分割类别)。而在 S3DIS 中仅输出点云图像和分割类别[^1]。因此,针对自定义数据集,建议按照以下格式存储: - **每一行表示一个点** - 每一列表示该点的不同属性,如 `X Y Z R G B Instance_ID`,其中: - X, Y, Z 表示三维空间中的坐标; - R, G, B 可选,用于颜色信息; - Instance_ID 是关键字段,用来区分不同对象实例。 可以借助工具如 CloudCompare 来处理始点云数据,并将其转换为目标格式[^4]。最终保存为 `.txt` 文件或其他支持的大规模点云文件格式。 #### 网络模型调整 PointNet++ 主要是设计来解决语义分割问题,即给定一组点云预测其对应的类别标签。然而,实例分割不仅涉及类别的判断还需要识别同一类别下的多个独立个体。为此可以在架构基础上引入额外机制实现这一目标。 一种常见方法是在最后阶段加入聚类算法或者 Mask Prediction 技术完成从像素级标注向实例划分过渡的过程。具体来说就是在有网络结构之后增加一层操作负责生成掩码(mask),并通过非极大值抑制(NMS)等方式提取单独的对象边界框或区域[^2]。 以下是基于 PyTorch 实现的一个简化版框架代码片段展示如何修改基础 PointNet++ 结构适应实例分割需求: ```python import torch.nn as nn from pointnet2_modules import PointNetSetAbstractionMsg, PointNetFeaturePropagation class InstanceSegmentationPointNetPP(nn.Module): def __init__(self): super(InstanceSegmentationPointNetPP, self).__init__() # Set Abstraction Layers with Multi-Scale Grouping self.SA_layer_1 = PointNetSetAbstractionMsg(...) self.SA_layer_2 = PointNetSetAbstractionMsg(...) # Feature Propagation Network for Upsampling self.FP_layer_1 = PointNetFeaturePropagation(...) self.FP_layer_2 = PointNetFeaturePropagation(...) # Additional Layer to Predict Masks per Point self.mask_predictor = nn.Sequential( nn.Conv1d(in_channels=..., out_channels=64, kernel_size=1), nn.BatchNorm1d(64), nn.ReLU(), nn.Dropout(p=0.5), nn.Conv1d(in_channels=64, out_channels=num_instances, kernel_size=1), # num_instances is the number of possible instances. ) def forward(self, xyz): l0_xyz = xyz ... fp_out = ... # Output from final FP layer masks_logits = self.mask_predictor(fp_out) return masks_logits ``` 上述代码展示了通过添加卷积层序列作为 mask predictor 输出每个点属于哪个实例的概率分布情况。实际应用时还需考虑损失函数的设计以优化这些预测结果的质量。 #### 训练过程注意事项 当开始训练之前,请确认以下几个方面设置无误: - 输入张量形状匹配所构建模型的要求; - 正确加载预处理后的自定义数据集; - 定义适合于实例分割任务的目标函数比如 Dice Loss 加上 Cross Entropy Loss 组合形式; 另外由于点云数据往往较大且稀疏特性明显,所以推荐采用 mini-batch SGD 方法配合 GPU 加速计算效率提升效果显著。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值