首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的numpy文件比使用相同数组生成的PNG文件大?

为什么我的numpy文件比使用相同数组生成的PNG文件大?
EN

Stack Overflow用户
提问于 2020-07-27 01:38:47
回答 1查看 332关注 0票数 0

我需要找到一种文件类型,可以在不占用太多内存的情况下保存数组。我以为npy文件会比PNG文件少,但我想我错了。

代码语言:javascript
复制
            depth_img = np.uint16(depth * 256)

            cv2.imwrite(name_dest_im, depth_img)
            np.save(name_dest_npy, depth_img)

是因为我在导出数组时做错了什么,还是PNG是存储uint16的最有效的方式?

编辑:这是https://github.com/nianticlabs/monodepth2/blob/master/test_simple.py的修改版本

代码语言:javascript
复制
input_image = pil.open(image_path).convert('RGB')
            original_width, original_height = input_image.size
            input_image = input_image.resize((feed_width, feed_height), pil.LANCZOS)
            input_image = transforms.ToTensor()(input_image).unsqueeze(0)

            # PREDICTION
            input_image = input_image.to(device)
            features = encoder(input_image)
            outputs = depth_decoder(features)

            disp = outputs[("disp", 0)]
            disp_resized = torch.nn.functional.interpolate(
                disp, (original_height, original_width), mode="bilinear", align_corners=False)

            # Saving numpy file
            output_name = os.path.splitext(os.path.basename(image_path))[0]
            name_dest_npy = os.path.join(output_directory, "{}_disp.npy".format(output_name))
            scaled_disp, _ = disp_to_depth(disp, 0.1, 100)


            name_dest_im = os.path.join(output_directory, "{}_disp.png".format(output_name))
            # Saving colormapped depth image
            map_resized_np = scaled_disp.squeeze().cpu().numpy()
            map_resized_np = cv2.resize(map_resized_np, (original_width, original_height))
            depth = 5.4 / map_resized_np
            depth = np.clip(depth, 0, 80)
            depth_img = np.uint16(depth * 256)

            cv2.imwrite(name_dest_im, depth_img)
            np.savez_compressed(name_dest_npy, depth_img)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-27 01:41:56

PNG是压缩的,但np.save不使用压缩。您可以使用np.savez_compressed保存压缩数组。如果你的数据允许,你也可以保存为uint8,就像@vlovero在评论中建议的那样。

代码语言:javascript
复制
import cv2
import numpy as np

img = np.random.randint(0, 256, size=(128, 128, 3)).astype(np.uint16)

cv2.imwrite("random.png", img)
np.save("random.npy", img)
np.savez_compressed("random.npz", img=img)

f = np.load("random.npz")
img_loaded = f["img"]
# The loaded array is equal to the original.
np.testing.assert_array_equal(img, img_loaded)

文件大小如下:

代码语言:javascript
复制
$ du -h random*
100K    random.npy
64K random.npz
64K random.png
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63103569

复制
相关文章

相似问题

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