Python 对空numpy数组进行预索引时,matplotlib plt.show()出现视觉故障
因此,我在创建空numpy数组并在其中加载图像时遇到了一个奇怪的视觉故障,如下所示: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
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。我对此感到非常困惑。这很奇怪,我在运行代码时没有收到任何警告,但现在一切都正常了:谢谢!