代码来自:

https://www.kaggle.com/artgor/segmentation-in-pytorch-using-convenient-tools

代码如下

import numpy as np# 进行mask存储,rle一种压缩存储方式
# 还有一种是polygon(多边形)# 这个函数是对mask进行rle编码,所以输入的值非0即1
import numpy as np# 进行mask存储,rle一种压缩存储方式
# 还有一种是polygon(多边形)# 这个函数是对mask进行rle编码,所以输入的值非0即1
def mask2rle(img):'''Convert mask to rle.img: numpy array, 1 - mask, 0 - backgroundReturns run length as string formated'''print("看下输入的img",img)pixels= img.T.flatten()#转置后看图像print("pixels进行flatten以后=",pixels)
# pixels进行flatten以后= [1 1 0 0 0 0 0 0 0 0 0 0 1 1]#14位pixels = np.concatenate([[0], pixels, [0]])print("pixels=",pixels)
#                 pixels = [0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0]#16位runs = np.where(pixels[1:] != pixels[:-1])[0] + 1print("runs=",runs)#这个记录的是bit值开始变化的位置,这里+1是为了位置的调整runs[1::2] -= runs[::2]#这句代码写得很抽象,其实是在进行编码.#运行前的结果是:# runs= [ 1  3 13  15]   #runs中的每个数值都代表像素值发生变化的位置# 运行后的结果是:# runs= [ 1  2 13  2]# 意思是第1个位置算起,共有2个bit是相同的,所以用3-1得到# 意思是第13个位置算起,共有2个bit是相同的,所以用15-13得到。# 对应上面头部和末尾的两个11print("runs=",runs)return ' '.join(str(x) for x in runs)# 这个是用来解码train.csv中的Encoded Pixels的
def rle_decode(mask_rle: str = '', shape: tuple = (1400, 2100)):'''Decode rle encoded mask.:param mask_rle: run-length as string formatted (start length):param shape: (height, width) of array to return Returns numpy array, 1 - mask, 0 - background'''s = mask_rle.split()#这个运算前后没啥区别print("-----------------------------------------------------------")print("s[0:][::2]=",s[0:][::2])#这个获取的是变化的像素的位置序号的列表# ['1', '13']print("s[1:][::2]=",s[1:][::2])#这个获取的是相同像素的长度列表(分别记录每个变化的像素后面连续的同等像素值的连续长度)#['2', '2']starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]print("看下最初的starts=",starts)#变化的像素的位置序号的列表print("lengths=",lengths)starts -= 1ends = starts + lengthsprint("ends=",ends)img = np.zeros(shape[0] * shape[1], dtype=np.uint8)for lo, hi in zip(starts, ends):#进行恢复img[lo:hi] = 1return img.reshape(shape, order='F')if __name__ == '__main__':img=np.array([[1,0,0,0,0,0,1],[1,0,0,0,0,0,1]])print("输入的图像是",img)result=mask2rle(img)print("mask2rle的编码结果=",result)result=rle_decode("1  2 13  2", (2, 7))print("rle_decode的解码结果=",result)

上述mask2rle与rle_decode是互为可逆的。

rle编码的格式是:

格式是像素位置,长度(这了包含其实位置的像素的计数)

根据大佬的说法是,rle编码能节省内存。

对mask进行rle编码然后进行解码-详细注释相关推荐

  1. 语义分割rle编码与mask的转换

    语义分割中,常用rle编码来节省标签的存储空间,但是在实际应用的时候还是需要将rle编码转换成mask来展示分割效果. rle编码是这样的:用一对pair值来表示值为1的mask的位置,比如(3,3) ...

  2. Segmentaion标签的三种表示:poly、mask、rle

    Segmentaion标签的三种表示:poly.mask.rle 不同于图像分类这样比较简单直接的计算机视觉任务,图像分割任务(又分为语义分割.实例分割.全景分割)的标签形式稍为复杂.在分割任务中,我 ...

  3. <DataWhale>- 语义分割 - RLE编码

    Task 01 语义分割-RLE编码 目录 思考 源码 自我理解RLE 关于源码中注释部分question的解释 思考 RLE是什么? 它是怎么运作的? 在mask.csv中图片后面的一系列数字具体表 ...

  4. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  5. python decode()函数 (使用登记用于编码的编解码器解码字节)

    def decode(self, *args, **kwargs): # real signature unknown"""Decode the bytes using ...

  6. 关于支付接口回调地址参数字段是“notify_url”,签名过后的特殊字符url编码以后再解码后出现错误(¬ , ¢, ¤, £)

    今天对接支付接口,参数拼接完了,开始调用的时候,一直报错,签名错误. 但是我用第三方给的签名测试mode测试签名,返回的是true. 这就非常他娘的奇怪. 经过一个个参数对比,我发现,notify_u ...

  7. des加密+base64编码,base64解码+des解密

    des加密+base64编码,base64解码+des解密 des简单介绍 base64简单介绍 运行效果图 TestActivity.java DataEncryptionUtil.java des ...

  8. Base64的编码(Encode)与解码(Decode)

    Base64的编码(Encode)与解码(Decode) 推荐第一种 效率更高. 第一种:java8 新版本 @Testpublic void test1(){//现在Base64编码 import ...

  9. 特殊字符url编码以后再解码后出现错误(not , cent, curren, pound)

    仅仅是在显示的时候,编码传送的时候不会影响 今天遇到一个问题 需要Url编码的原内容是 "&notify_url=xxxx"  经过url编码以后再解码回来  " ...

最新文章

  1. 五年引用量最高的10大论文:Adam第一,Transfromer上榜!竟然没有ResNet?
  2. linux type命令(用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令,如果给出的指令为外部指令,则显示其绝对路径)
  3. JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...
  4. oracle ||#039; where #039;||condition;,帝国cms后台添加字段提示#039;Row size too large. The maximum row size...
  5. 第一章 什么是数组名?
  6. scp 不输入密码登录
  7. 手机通话记录重复显示怎么处理_手机通话记录怎么找回
  8. python菜鸟教程python基础教程
  9. 软件测试-微信红包测试点
  10. 前后端开发接口文档模板(登录、注册、项目发布与需求发布)
  11. python文件写入方式_Python写入文件的方式
  12. 交易所交易规则和费用计算
  13. 初级面试常见sql练习
  14. Redis——Lettuce的主从哨兵模式
  15. 煤化工工控网络安全解决方案 第一部分
  16. 电脑运行应用程序出现0xc000007b的解决方法
  17. 建立里程碑,保证项目进度和质量
  18. SSM框架中 出现的406 (Not Acceptable)
  19. Paging内部原理
  20. zendstiduo背景色设置为保护眼睛的颜色》》》

热门文章

  1. SPOJ_SUBLEX
  2. 如何将一个数据库中的一个表复制到另一个数据库中去
  3. mysql 新增从数据库_从零开始学 MySQL - 创建数据库并插入数据
  4. 字数监控,价格监控等
  5. 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?
  6. 系统页面升级系统中_国产系统哪家强?华为EMUI系统大升级,拿下最强指日可待...
  7. 解决安卓模拟器没有网络的问题,刚开的做RN的我遇见这个问题真很头疼,所以希望看到我这篇文章能够解决。
  8. java面试的题积累【持续更新中......】
  9. windows下备份mysql 数据库
  10. 人脸检测的harr检测函数