问题描述:
进行超分辨率重建,需要在YCbCr中的Y通道进行,但我们也要保存Cb和Cr通道的数据,到最后一部将它们合并起来。
具体的YCbCr转RGB公式为:
ycbcr2rgb = np.zeros(ima.shape)
ycbcr2rgb[:,:,0] = 1.164383 * (ima_y-16) + 1.596027 * (ima_cr-128)
ycbcr2rgb[:,:,1] = 1.164383 * (ima_y-16) - 0.391762 * (ima_cb-128)- 0.812969 * (ima_cr-128)
ycbcr2rgb[:,:,2] = 1.164383 * (ima_y-16) + 2.017230 * (ima_cb-128)
我们得到了ycbcr2rgb之后,然后想把它输出来看一下,无论plt.show()还是save(),来看结果,图像都是一片蓝或者一片绿。
探索过程:
1.我把Y,Cb,Cr通道都打印出来,发现他们的值很大,超过255
2.我把Y,Cb,Cr显示成图像,发现都能正常显示
3.我把Cb和Cr的值从数据预处理到最后合成之前的所有过程都打印出来看一下,发现并 没有变化
4.以为图像保存方式错了导致的问题,将图像有FloatTensor转为nunpy,再把范围规范到0-255,把类型转成uint8,最后Image.fromarray(output)转为PIL格式进行保存,但还是没办法解决问题
5.不知道为什么Y的值那么大,以为网络出了问题,其实把网络改了下还是不管用,值照样那么大
。。。。。。经过无数次实验
解决办法:
原来YCbCr转RGB或RGB转YCbCr都需要满足一个前提条件,就是两者都是在0-255这么范围,是三个通道都要在这个范围(我当时只规范了一个通道,所以pass了这个解决办法),后面看到需要满足这样一个条件才能进行转换,试了下,图片不再是全蓝或全绿的了,能够显示正常!
所以,注意一些函数的使用条件,避免调试都调一天,心累啊~