处理mask图像为单通道彩色图


一、问题说明

最近在训练mask rcnn时发现输入的mask格式不对,后面发现通过labelme标注并转换得到的Mask是单通道彩色图,Mask图像的像素值代表了像素点所属的类别标签。对于单个类别的数据集来说, Mask像素值应该是[0,1], 其中0表示背景区域;对于多个类别的数据集, Mask像素值应该是[0,1,2,…],显示为彩色以区分不同目标。如下图所示,虽然看上去是彩色图像,但是打开属性看其位深却是8。

二、解决办法

最开始采用OpenCV读取,但里面自动转换成了3通道图(24位),类似于这篇博客在深度学习中遇到的opencv坑,后面采用Pillow库,查看其官网说明,支持8位的调色板格式图片,如下图所示。

通过PIL读取后再依次处理即可正常训练

三、保存mask为单通道彩图

tmp_image = np.zeros((h, w), np.uint8)
for mask_id, mask in enumerate(masks):
    tmp_image[mask >= 1] = mask_id + 1

tmp_image = Image.fromarray(tmp_image, "P")
palette_data = [0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 128, 128, 0, 128, 0, 128, 128, 128, 128, 128,
               64, 0, 0, 192, 0, 0, 64, 128, 0, 192, 128, 0, 64, 0, 128, 192, 0, 128, 64, 128, 128, 192, 128, 128,
               0, 64, 0, 128, 64, 0, 0, 192, 0, 128, 192, 0]  # 调色板
tmp_image.putpalette(palette_data)
tmp_image.save("D:/mask.png")

参考链接

numpy转PIL.Image: 处理Mask图像为单通道的彩色/灰度图colormap.png
在深度学习中遇到的opencv坑


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM