之前做了一个项目,需要用到伪彩色的转化,所谓伪彩色的转化,简单的理解就是将灰度图像转化为彩色图像。最开始的想法很简单,就是创建一个字典,这个字典关键词是灰度值,数值为[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