显示图像时出现奇怪的 matplotlib 行为

2024-01-03

当范围 (0,255) 内的常规 RGB 图像转换为 float,然后由 matplotlib 显示时,图像将显示为负数。如果它被转换为 uint8,它会正确显示(当然)。这给我弄清楚发生了什么造成了一些麻烦,因为我不小心将其中一张图像投射为浮动图像。

我很清楚,当转换为浮点数时,图像预计在 (0,1) 范围内,并且果然,当除以 255 时,显示的图像是正确的。但是,为什么范围 (0,255) 内的浮点数图像会显示为负数呢?我本来期望饱和度(全白)或自动推断输入的范围(从而正确显示)?如果发生这些预期的事情,我就能够更快地调试我的代码。我已经包含了重现该行为所需的代码。有谁知道为什么会发生这种情况?

    import numpy as np
    import matplotlib.pyplot as plt
    a = np.random.randint(0,127,(200,400,3))
    b = np.random.randint(128,255,(200,400,3))
    img=np.concatenate((a,b)) # Top should be dark ; Bottom should be light
    plt.imshow(img) # Inverted
    plt.figure()
    plt.imshow(np.float64(img)) # Still Bad. Added to address sascha's comment
    plt.figure()
    plt.imshow(255-img) # Displayed Correctly
    plt.figure()
    plt.imshow(np.uint8(img)) # Displayed Correctly
    plt.figure()
    plt.imshow(img/255.0) # Displays correctly

在来源中,在image.py, 在里面AxesImage类(什么imshow返回)一个方法_get_unsampled_image在绘图过程中的某个时刻被调用。相关代码从第 226 行开始(matplotlib-1.5.3):

if A.dtype == np.uint8 and A.ndim == 3:
    im = _image.frombyte(A[yslice, xslice, :], 0)
    im.is_grayscale = False
else:
    if self._rgbacache is None:
    x = self.to_rgba(A, bytes=False)
    # Avoid side effects: to_rgba can return its argument                        
    # unchanged.                                                                 
    if np.may_share_memory(x, A):
       x = x.copy()
    # premultiply the colors                                                     
    x[..., 0:3] *= x[..., 3:4]
    x = (x * 255).astype(np.uint8)
    self._rgbacache = x

所以输入的类型和大小A得到检查:

if A.dtype == np.uint8 and A.ndim == 3:

在这种情况下没有预处理。否则,在不检查输入范围的情况下,您最终会乘以 255 并强制转换为uint8:

x = (x * 255).astype(np.uint8)

我们知道如果x是从 0 到 255 而不是 0 到 1:

In [1]: np.uint8(np.array([1,2,128,254,255])*255)
Out[1]: array([255, 254, 128,   2,   1], dtype=uint8)

所以光变暗了。我认为这颠倒了形象可能不是有计划的行为。

您可以比较以下值_rgbacache在返回的对象中imshow对于每个输入案例来观察结果,例如im._rbacache where im = plt.imshow(np.float64(img)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示图像时出现奇怪的 matplotlib 行为 的相关文章

随机推荐