为什么jpg文件的大小大于预期的大小?

问题描述 投票:0回答:1

我生成一个灰度图像并将其保存为jpg格式。

SCENE_WIDTH = 28
SCENE_HEIGHT = 28

# draw random noice
p, n = 0.5, SCENE_WIDTH*SCENE_HEIGHT
scene_noise = np.random.binomial(1, p, n).reshape((SCENE_WIDTH, SCENE_HEIGHT))*255
scene_noise = scene_noise.astype(np.uint8)

n = scene_noise
print('%d bytes' % (n.size * n.itemsize)) # 784 bytes

cv2.imwrite('scene_noise.jpg', scene_noise)
print('noise: ', os.path.getsize("scene_noise.jpg")) # 1549 bytes

from PIL import Image
im = Image.fromarray(scene_noise)
im.save('scene_noise2.jpg')
print('noise2: ', os.path.getsize("scene_noise2.jpg")) # 1017 bytes 

当我从以下位置更改时:

scene_noise = np.random.binomial(1, p, n).reshape((SCENE_WIDTH, SCENE_HEIGHT))*255

至:

scene_noise = np.random.binomial(255, p, n).reshape((SCENE_WIDTH, SCENE_HEIGHT))

文件大小减少了将近2倍:〜775字节。

您能解释为什么当我从黑白更改为全灰度光谱时,JPG文件比原始版本大,为什么尺寸减小了?

cv2.__version__.split(".") # ['4', '1', '2']
python jpeg
1个回答
0
投票

这里两件事:

  • 您能解释为什么JPEG文件比原始文件大吗?

大小不同,因为您没有比较相同的东西。第一个对象是NumPy数组,第二个对象是JPEG文件。 JPEG文件大于NumPy数组(即,在使用OpenCV创建它之后),因为JPEG编码包含NumPy数组不存储的信息。

  • 您能解释一下为什么我将颜色从黑白更改为完整的灰度光谱时尺寸会减小吗?

这是由于JPEG编码。如果您真的想了解所有发生的事情,我强烈建议您了解JPEG编码的工作原理,因为我不会对此做过多详细介绍(因为我对此主题的了解不多)。有关此信息,请参见the Wikipedia JPEG article。通常的想法是,图片中的对比度越大,尺寸上的对比度就越大。在这里,仅使用黑白图片将使您始终处于0到255之间,而灰度图片通常不会在相邻像素之间产生太大的变化。

© www.soinside.com 2019 - 2024. All rights reserved.