我发现正确的情节更具艺术性……
matplotlib在解释图像时相当复杂.大致如下:
>如果图像是任何类型的NxM数组,则通过色彩图解释(自动缩放,如果没有另外说明). (原则上,如果数组是一个缩放到0..1的浮点数组,它应该被解释为灰度图像.这就是文档所说的,但实际上这不会发生.)
>如果图像是NxMx3浮点数组,则RGB分量将被解释为介于0..1之间的RGB分量.如果这些值在该范围之外,则采用正模1,即1.2 – > 1. 0.2,-1.7 – > 0.3等
>如果图像是NxMx3 uint8数组,则将其解释为标准图像(0..255组件)
>如果图像是NxMx4,则解释如上,但第四个组成部分是不透明度(alpha)
因此,如果为matplotlib提供除uint8或float之外的NxMx3整数数组,则不会定义结果.但是,通过查看源代码,可以理解奇怪的行为:
if A.dtype != np.uint8:
A = (255*A).astype(np.uint8)
其中A是图像阵列.所以,如果你给它uint16值0,1,2,3,4 ……,你得到0,255,254,253 ……是的,它看起来很奇怪. (恕我直言,解释可能会更直观,但这就是它的完成方式.)
在这种情况下,最简单的解决方案是将数组除以65535.然后图像应该符合预期.此外,如果您的原始图像是真正线性的,那么您需要进行反向伽马校正:
img1_corr = (img1 / 65535.)**(1/2.2)
否则你的中间色调会太暗.