python 伪彩图转化效率太慢问题的解决

之前做了一个项目,需要用到伪彩色的转化,所谓伪彩色的转化,简单的理解就是将灰度图像转化为彩色图像。最开始的想法很简单,就是创建一个字典,这个字典关键词是灰度值,数值为[1,1,1]这张bgr的张量,比如{‘0’:’[1, 1,1,1],‘1’:’[1, 2, 2]’}代表的是灰度值0对应的bgr值为[1, 1,1,1],想法很简单,实现起来也很简单,就只需要几个循环就可以搞定,但是在后续的实验过程中,发现问题了,比如一张照片大小是200x200,那么我就要循坏200*200次,就要查询400000次字典,这个时间复杂度太高了,最后造成的结果就是:如果是灰度图像显示,最后效果可能是20帧左右,但是如果显示伪彩图,就只能5帧左右了,效果实在接受不了,正好某天在学Pytorch中,发现了一个函数:torch.gather(),这个函数跟查表很像,也就跟我伪彩图转化很像,都是将灰度值映射到一个彩色值,加上pytorch本来就是用c写的,所以抱着试一试的态度,哎呀,这效果不错,显示彩色图的帧率在15左右,人眼看起来较为流畅,如果电脑更好,速度很可能会更快,下面我就说一下怎么使用这个函数来达到伪彩图高效转化的目的。

好了,废话不多说,直接上代码:

'''this code was desinged by nike hu'''
def useColor(image):
    # print(datetime.datetime.now())
    global colorArrayFirst # 这个是伪彩色转化Tensor,维度为[256, 3],既然是全局变量,并且这个全局变量不能被改变,就要注意依据这个变量产生的数据不能同名
    # print(colorArrayFirst.shape)
    imageW = image.shape[1] # 图像的宽
    imageH = image.shape[0] # 图像的高
    image = torch.from_numpy(image) # 转化为tensor数据
    image = image.unsqueeze(-1).expand(imageH, imageW, 3) # 维度变化:[imageH, imageW]=>[imageH,imageW, 3]
    colorArray = colorArrayFirst.unsqueeze(0).expand(imageH, 256, 3) # 维度变化,[256, 3]->[imageH , 256, 3]
    # print('--------------------------', colorArray.shape)
    changeColor = torch.gather(colorArray, dim=1, index=image.long())
    # 第一个参数是待查的表,第二个参数代表查找的维度,这里dim=1,我们已知表的维度是[imageH, 256, 3],所以这里dim=1代表最后返回的数据的维度为[3]
    # ,第三个参数就是查找表的下标,我们这里得下标就是灰度值,第一个参数和第三个参数在dim=1也就是第一个维度之前维度一致,都是imageH
    reallColor = changeColor.numpy() # 将tensor数据转化为Numpy数据,并且要将数据格式转化过来,否则openv无法显示
    reallColor = reallColor.astype(np.uint8) # numpy转化数据类型只能这个函数,使用dtype转化会将数据增加,要注意必须有参数接收返回值
    # print(datetime.datetime.now())
    # cv2.imshow('jj', reallColor)
    # cv2.waitKey()
    return reallColor

好了,关于这个问题的解决方案就是这样了,感谢大家观看。

2020 4.14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值