我也采用了 imageio,但我发现以下机器对预处理和后处理很有用:
import imageio
import numpy as np
def imload(*a, **k):
i = imageio.imread(*a, **k)
i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
return i/255
def imsave(i, url, *a, **k):
# Original order of arguments was counterintuitive. It should
# read verbally "Save the image to the URL" — not "Save to the
# URL the image."
i = np.flip(i, 1)
i = i.transpose((1, 0, 2))
i *= 255
i = i.round()
i = np.maximum(i, 0)
i = np.minimum(i, 255)
i = np.asarray(i, dtype=np.uint8)
imageio.imwrite(url, i, *a, **k)
理由是我使用 numpy 进行图像处理,而不仅仅是图像显示。为此,uint8s 很尴尬,所以我转换为 0 到 1 范围内的浮点值。
保存图像时,我注意到我必须自己剪切超出范围的值,否则我最终会得到一个非常灰色的输出。 (灰度输出是 imageio 将 [0, 256) 之外的整个范围压缩为范围内的值的结果。)
还有其他一些奇怪的东西,我在 cmets 中提到过。