首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在cv2.imread()之后应用img_to_array()有什么用?

在cv2.imread()之后应用img_to_array()有什么用?
EN

Data Science用户
提问于 2020-11-18 07:26:39
回答 1查看 1.6K关注 0票数 0

在一本书中,我看到了从目录加载图像的以下代码:

代码语言:javascript
复制
1.image = cv2.imread(imagePath)
2.image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
3.image = cv2.resize(image, (28,28))            
4.image = img_to_array(image)
5.data.append(image)

cv2.imread()

它以BGR格式将图像转换为数字数组。

img_to_array()

它将PIL实例转换为numpy数组,但在这种情况下,图像将保持BGR格式,因为图像是由cv2加载的。

在cv2.imread()之后使用img_to_array() (来自keras.preprocessing.image模块)是什么,因为它已经在numpy数组中了。

还:

为了进行双重检查,我在使用cv2.imshow()应用img_to_array()之前和之后显示图像。

在应用img_to_array()

之前

应用img_to_array()

还包括:

但是,如果我尝试使用cv2将图像保存到一个文件中,它们都将被保存为正常的(即。就像第一张图片)。为什么会发生这种情况?

EN

回答 1

Data Science用户

回答已采纳

发布于 2020-11-18 09:42:32

这是因为您为imshow()函数提供了数据类型。

检查文档

该函数可以缩放图像,这取决于其深度:如果图像是8位无符号,它将按原样显示。如果图像是16位无符号或32位整数,则像素除以256.也就是说,值范围0 255*256映射到0,255。如果图像是32位或64位浮点,则像素值乘以255.也就是说,值范围0,1映射到0,255。

因此,当使用cv2.imread()时,它读取数据uint8,即8位无符号格式,因此imshow()显示原始数据。

但是,当您使用img_to_array()时,它会将数据转换为浮点数。因此imshow()将它乘以256。它期望浮点值以规范化的形式存在,即所有像素除以256。这就是这种展示的原因。

cv2.imread()数据是这样的.

它的数据类型..。

img_to_array()数据是这样的.

它的数据类型..。

如果您将图像除以1.0以将其转换为浮点数.

代码语言:javascript
复制
import cv2
# from keras.preprocessing.image import img_to_array
image = cv2.imread("car.jpg")
image = image/1.0
cv2.imshow("Divided by 1.0", image)
cv2.waitKey(0)

...this是您将得到的:

和img_to_array一样。

但是它用256.0来划分图像如下:

代码语言:javascript
复制
import cv2
# from keras.preprocessing.image import img_to_array
image = cv2.imread("car.jpg")
image = image/256.0
cv2.imshow("Divided by 256.0", image)
cv2.waitKey(0)

您将获得原始图像,因为imshow()将浮点数乘以256。

因此,您需要的是将img_to_array()输出除以256个或将其转换为uint8。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/85586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档