Почему размер файла jpg больше ожидаемого? - PullRequest
0 голосов
/ 06 января 2020

Я создаю изображение в градациях серого и сохраняю его в формате 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']

1 Ответ

1 голос
/ 06 января 2020

Здесь две вещи:

  • Вы можете объяснить, почему файл JPEG больше, чем необработанная версия?

Размер отличается, потому что вы не сравниваете те же вещи. Первый объект - это массив NumPy, а второй - файл JPEG. Файл JPEG больше массива NumPy (ie. После его создания в OpenCV), поскольку кодировка JPEG включает в себя служебную информацию, которую массив NumPy не хранит и не нуждается.

  • Вы можете объяснить, почему размер уменьшается, когда я меняю цвета с черного и белого на полный спектр оттенков серого?

Это связано с кодированием JPEG. Если вы действительно хотите понять все, что происходит, я настоятельно рекомендую понять, как работает кодирование JPEG, поскольку я не буду go подробно рассказывать об этом (я ни в коем случае не специалист в этой теме c). Информация об этом хорошо документирована в статье Wikipedia JPEG . Общая идея заключается в том, что чем больше контраст на вашей картинке, тем больше она будет с точки зрения размера. В данном случае наличие только черно-белого изображения заставит вас всегда go между 0 и 255, тогда как изображение в градациях серого обычно не видит большого изменения между соседними пикселями.

...