plt.show无法显示图片,imread与random.randint生成narray数组的区别

使用np.random.randint生成了数组,但是没法像读取图像后生成的数组,使用plt.show显示图片显示如下错误(估计使用pil图像也是如此)

> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 4 (CV_32S)

初步分析,应该是与数据类型相关

对比imread与randint生成数组的数据类型

首先,我们看使用randint生成的数组数据类型

img4Random = np.random.randint(0,256,1200,dtype= 'i')
bgrImg4Random  = img4Random.reshape(20,20,3)

这里生成的数组,每个元素的范围是从0~255,但是数据类型是int32(dtype=‘i’)

print(bgrImg4Random[0,0])
print(bgrImg4Random[0,0,0])
print(bgrImg4Random[0,0,1])
print(bgrImg4Random[0,0,2])
type(bgrImg4Random[0,0,2])

显示结果如下

[ 20 103  51]
20
103
51
numpy.int32

如果省略dtype参数,默认数据类型是int64

img4Random = np.random.randint(0,256,1200)

显示结果如下

numpy.int64

现在我们看看从jpg生成的数组情况,如下

img1 = cv2.imread("ls.jpg")
print(img1[0,1,0])
type(img1[0,0,0])

数据类型是 unit8,也可以用print(image1.dtype)来显示数据类型

33
numpy.uint8

转换数组的数据类型

使用np.unit8或者astype两种方式都可以进行转换到unit8

bgrImg4Random  = img4Random.reshape(20,20,3)
#bgrImg4Random = np.uint8(bgrImg4Random)
#bgrImg4Random=bgrImg4Random.astype(np.uint8)

图像显示出来了,随机的3通道图像,20*20个像素
Screen Shot 2021-03-06 at 2.37.07 PM

参考

数据读入就是unit8,使用np.unit8转换,这里介绍了pil图像,暂时我没有使用过;
解释opencv灰度图和RGB图数据类型,int是32位,而8位就足够了,采用int会浪费存储空间。
介绍opencv处理图像使用unit8