Python 对空numpy数组进行预索引时,matplotlib plt.show()出现视觉故障

Python 对空numpy数组进行预索引时,matplotlib plt.show()出现视觉故障,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,因此,我在创建空numpy数组并在其中加载图像时遇到了一个奇怪的视觉故障,如下所示: import numpy as np from imageio import imread import matplotlib.pyplot as plt dir_path = os.path.join('path/to/image', 'a.jpg') # Pre-indexing numpy array X = np.empty((1, *(111, 455), 4)) # Loading image

因此,我在创建空numpy数组并在其中加载图像时遇到了一个奇怪的视觉故障,如下所示:

import numpy as np
from imageio import imread
import matplotlib.pyplot as plt

dir_path = os.path.join('path/to/image', 'a.jpg')
# Pre-indexing numpy array
X = np.empty((1, *(111, 455), 4))

# Loading image in the traditional way:
img_0 = imread(dir_path)
# Loading image and saving it in the pre-indexed array:
X[0] = imread(dir_path)

# Check whether image contents are the same
print((img_0 == X[0]).all())

# Display images
imgplot = plt.imshow(X[0])
plt.show()
imgplot = plt.imshow(img_0)
plt.show()
因此,在这段代码中,我通过传统的imread或将图像保存在numpy数组中导入图像。理论上这两个方法应该是等价的,事实上printimgu 0==X[0]。all返回True

然而,这是plt.show结果:

numpy图像:

传统形象:


如果两个数组的内容完全相同,那么当使用相同的imread函数导入时,两个图像的显示方式如何可能不同?

问题是,当您将图像放入数组X时,图像从int变为float,并且缩放方法与plt不同。imshow在int和float之间。这在您可能收到的警告消息中有描述:

使用RGB数据[0..1]将输入数据剪裁到imshow的有效范围(浮点数)或[0..255]将输入数据剪裁到整数

您可以将X实例化为int数组,或将X[0]强制为dtype int,或通过除以255将图像规格化为介于0和1之间:

# Method 1:
X = np.empty((1, *(111, 455), 3), dtype=int)
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0])
plt.show()

# Method 2:
X = np.empty((1, *(111, 455), 3))
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0].astype(int))
plt.show()

# method 3:
imgplot = plt.imshow(X[0]/255)
plt.show()
按照上述任一方法,您将获得:


问题是,当您将图像放入数组X时,它从int变为float,并且int和float之间的缩放方法与plt.imshow不同。这在您可能收到的警告消息中有描述:

使用RGB数据[0..1]将输入数据剪裁到imshow的有效范围(浮点数)或[0..255]将输入数据剪裁到整数

您可以将X实例化为int数组,或将X[0]强制为dtype int,或通过除以255将图像规格化为介于0和1之间:

# Method 1:
X = np.empty((1, *(111, 455), 3), dtype=int)
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0])
plt.show()

# Method 2:
X = np.empty((1, *(111, 455), 3))
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0].astype(int))
plt.show()

# method 3:
imgplot = plt.imshow(X[0]/255)
plt.show()
按照上述任一方法,您将获得:


也见也见,谢谢!这很清楚。我不知道例如float1.0==int1在Python中会返回True。我对此感到非常困惑。这很奇怪,我在运行代码时没有收到任何警告,但现在一切都正常了:谢谢!谢谢这很清楚。我不知道例如float1.0==int1在Python中会返回True。我对此感到非常困惑。这很奇怪,我在运行代码时没有收到任何警告,但现在一切都正常了:谢谢!