Python 如何使用残差正确地将numpy数组转换为图像?
我正在和GANs一起研究单图像超分辨率(SISR)问题,以4倍的比例缩放。我使用的是残差学习技术,所以我从训练过的网络中得到的是一个张量,其中包含放大后的输入图像和目标图像之间估计的残差图像。我用表示图像的标准化Python 如何使用残差正确地将numpy数组转换为图像?,python,python-3.x,numpy,python-imaging-library,Python,Python 3.x,Numpy,Python Imaging Library,我正在和GANs一起研究单图像超分辨率(SISR)问题,以4倍的比例缩放。我使用的是残差学习技术,所以我从训练过的网络中得到的是一个张量,其中包含放大后的输入图像和目标图像之间估计的残差图像。我用表示图像的标准化numpy数组(np.asarray(image)/255)为网络提供数据 为了得到最终的估计图像,我必须将放大后的输入图像与残差图像相加。以下是我使用的代码(输入图像的大小为64x64,而输出图像的大小为256x256): 现在,将这些图像设置为低分辨率、高分辨率和残差(网络输出):
numpy
数组(np.asarray(image)/255
)为网络提供数据
为了得到最终的估计图像,我必须将放大后的输入图像与残差图像相加。以下是我使用的代码(输入图像的大小为64x64
,而输出图像的大小为256x256
):
现在,将这些图像设置为低分辨率、高分辨率和残差(网络输出):
如果我将低分辨率图像与残差图像相加,如代码所示,得到的结果是:
那看起来有点太暗了。现在,假设数据结构是numpy数组,我尝试将数组的值拉回到范围(0255),然后将其转换回图像。在这种情况下,我得到:
比以前亮了一点,但还是很暗。我做错了什么?我怎样才能恢复我的形象
编辑:我将回答我的问题:问题是我忘记添加的每一层都有一个常数因子
尽管如此,我还有一个问题要问:在恢复正确的图像后,我注意到每张图像上都有某种噪音:
看看其他图像,比如婴儿,我注意到它是某种“水印自我图像”的9次重复(在3x3网格上)。无论我做什么或如何训练网络,每一张图片的模式都是相同的。
为什么我会看到这些工件?所以,我解决了两个问题。供日后参考:
per_channel\u MEANS=np.array([0.47614917,0.45001204,0.40904046])
。当要恢复图像时,我没有将该值加回去,因为每个通道的值都是固定的,所以会导致亮度偏移numpy
:显然,将数组从(3,256,256)
重塑为(256,256,3)`会改变数据分布,因此会发生变化。为了解决这个问题,我使用了:
output = torch.add(output, torch.from_numpy(PER_CHANNEL_MEANS).view((1, 3, 256, 256))).clamp(0, 255)
o = output.view((3, 256, 256))
o = o.data.numpy()
o = np.swapaxes(o, 0, 1)
o = np.swapaxes(o, 1, 2)
这不是一个优雅的方式,但它做的工作a
转换为图像,我使用了a.astype(np.uint8)
,但没有意识到如果值v
超过np.uint8
的最大值(255),那么结果值将是np.mod(v,255)
。这导致了颜色偏移,我在下面解决了这个问题
请随意为我的第二个问题的解决方案建议一种更优雅的方式,我将提供编辑
output = torch.add(output, torch.from_numpy(PER_CHANNEL_MEANS).view((1, 3, 256, 256))).clamp(0, 255)
o = output.view((3, 256, 256))
o = o.data.numpy()
o = np.swapaxes(o, 0, 1)
o = np.swapaxes(o, 1, 2)