Python 如何使用残差正确地将numpy数组转换为图像?

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): 现在,将这些图像设置为低分辨率、高分辨率和残差(网络输出):

我正在和GANs一起研究单图像超分辨率(SISR)问题,以4倍的比例缩放。我使用的是残差学习技术,所以我从训练过的网络中得到的是一个张量,其中包含放大后的输入图像和目标图像之间估计的残差图像。我用表示图像的标准化
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)