当前位置:   article > 正文

对mask进行rle编码然后进行解码-详细注释_mask to rle

mask to rle

代码来自:

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

代码如下

  1. import numpy as np
  2. # 进行mask存储,rle一种压缩存储方式
  3. # 还有一种是polygon(多边形)
  4. # 这个函数是对mask进行rle编码,所以输入的值非0即1
  5. import numpy as np
  6. # 进行mask存储,rle一种压缩存储方式
  7. # 还有一种是polygon(多边形)
  8. # 这个函数是对mask进行rle编码,所以输入的值非0即1
  9. def mask2rle(img):
  10. '''
  11. Convert mask to rle.
  12. img: numpy array,
  13. 1 - mask,
  14. 0 - background
  15. Returns run length as string formated
  16. '''
  17. print("看下输入的img",img)
  18. pixels= img.T.flatten()#转置后看图像
  19. print("pixels进行flatten以后=",pixels)
  20. # pixels进行flatten以后= [1 1 0 0 0 0 0 0 0 0 0 0 1 1]#14位
  21. pixels = np.concatenate([[0], pixels, [0]])
  22. print("pixels=",pixels)
  23. # pixels = [0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0]#16位
  24. runs = np.where(pixels[1:] != pixels[:-1])[0] + 1
  25. print("runs=",runs)#这个记录的是bit值开始变化的位置,这里+1是为了位置的调整
  26. runs[1::2] -= runs[::2]
  27. #这句代码写得很抽象,其实是在进行编码.
  28. #运行前的结果是:
  29. # runs= [ 1 3 13 15] #runs中的每个数值都代表像素值发生变化的位置
  30. # 运行后的结果是:
  31. # runs= [ 1 2 13 2]
  32. # 意思是第1个位置算起,共有2个bit是相同的,所以用3-1得到
  33. # 意思是第13个位置算起,共有2个bit是相同的,所以用15-13得到。
  34. # 对应上面头部和末尾的两个11
  35. print("runs=",runs)
  36. return ' '.join(str(x) for x in runs)
  37. # 这个是用来解码train.csv中的Encoded Pixels的
  38. def rle_decode(mask_rle: str = '', shape: tuple = (1400, 2100)):
  39. '''
  40. Decode rle encoded mask.
  41. :param mask_rle: run-length as string formatted (start length)
  42. :param shape: (height, width) of array to return
  43. Returns numpy array, 1 - mask, 0 - background
  44. '''
  45. s = mask_rle.split()#这个运算前后没啥区别
  46. print("-----------------------------------------------------------")
  47. print("s[0:][::2]=",s[0:][::2])#这个获取的是变化的像素的位置序号的列表
  48. # ['1', '13']
  49. print("s[1:][::2]=",s[1:][::2])#这个获取的是相同像素的长度列表(分别记录每个变化的像素后面连续的同等像素值的连续长度)
  50. #['2', '2']
  51. starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]
  52. print("看下最初的starts=",starts)#变化的像素的位置序号的列表
  53. print("lengths=",lengths)
  54. starts -= 1
  55. ends = starts + lengths
  56. print("ends=",ends)
  57. img = np.zeros(shape[0] * shape[1], dtype=np.uint8)
  58. for lo, hi in zip(starts, ends):#进行恢复
  59. img[lo:hi] = 1
  60. return img.reshape(shape, order='F')
  61. if __name__ == '__main__':
  62. img=np.array([[1,0,0,0,0,0,1],[1,0,0,0,0,0,1]])
  63. print("输入的图像是",img)
  64. result=mask2rle(img)
  65. print("mask2rle的编码结果=",result)
  66. result=rle_decode("1 2 13 2", (2, 7))
  67. print("rle_decode的解码结果=",result)

 

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

 

rle编码的格式是:

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

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/81014
推荐阅读
相关标签
  

闽ICP备14008679号