gpt4 book ai didi

python - 调整存储在数组中的所有图像的大小

转载 作者:行者123 更新时间:2023-12-02 16:08:28 24 4
gpt4 key购买 nike

我存储了读取的图像 cv2.imread在数组中 masks .数组的形状是 (10, 5248, 7936, 3) (10 images, image height, image width, 3 channels) .

我现在试图复制这个数组,但每个图像都调整为值 monitor_hmonitor_w .这是我所拥有的:

resized_masks = np.empty([masks.shape[0], monitor_h, monitor_w, masks.shape[3]])

for i in range(masks.shape[0]):
resized_masks[i] = cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h))

但是我从 cv2.imshow 得到的图像是黑白的。 channel 肯定发生了一些事情。任何线索?

最佳答案

要了解为什么您的图像显示为黑白,让我们逐步完成代码。

resized_masks = np.empty([masks.shape[0], monitor_h, monitor_w, masks.shape[3]])

这一行创建了一个 np.float 类型的数组默认情况下。
resized_masks[i] = cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h))

此行分配 cv2.resize 的结果到一片 resized_masks .

您的原始图像,以及 cv2.resize 的结果,大概是类型 np.uint8 .赋值将值转换为 float s 将它们放入缓冲区。 Actor 本身很好: 5转换为 5.0 , 255转换为 255.0 .问题是 float值被解释为被裁剪到范围 [0.0, 1.0] ,不是 [0.0, 255.0] .因此,您最终得到的图像实际上都是 0 和 1,即使它们包含看起来正确的值。

您可以通过显示来验证值是否正确
resized_masks.astype(masks.dtype)

这不是真正的修复。真正的解决方法是从正确的输出类型开始:
resized_masks = np.empty((masks.shape[0], monitor_h, monitor_w, masks.shape[3]), dtype=masks.dtype)

请注意,通常将元组用于形状,而不是列表,但这在功能上并不重要。

现在让我们看看为什么您的 patch工作。
resized_masks = list(resized_masks)

这将创建对每个子数组的引用的 Python 列表。既然你真的在切片,它们仍然会指向引擎盖下的一个连续缓冲区,但重要的是每个 resized_masks[i]是一个单独的引用,而不是同一个数组对象的切片。
resized_masks[i] = list(cv2.resize(np.copy(masks[i]), (monitor_w, monitor_h)))

resized_masks是一个包含引用的列表,现在正在分配 cv2.resize 的结果到 i第一个列表元素,不将内容分配到适当大小的切片中。您不需要 list这里是包装器,因为它引入了一个不必要的维度。
resized_masks = np.asarray(resized_masks)

这只是将列表重新组合成一个数组,因为所有元素的大小都正确(尽管您会看到额外的单位维度,如上所述)。可以想象,这种解决方案效率极低。除了您要往返于列表并分配多个不必要的缓冲区这一事实之外,您还丢弃了原来的 np.empty数组而不使用它。

你的补丁大致相当于做
resized_masks = np.array([cv2.resize(np.copy(mask), (monitor_w, monitor_h)) for mask in masks])

我不建议这样做。

关于python - 调整存储在数组中的所有图像的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60737595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com