Изображения, сгенерированные из одного и того же массива, отличаются во время сжатия изображений - PullRequest
0 голосов
/ 28 апреля 2020

В этом примере кода утверждение в функции не выполняется.

from pathlib import Path

import numpy as np
import PIL.Image


def make_images(tmp_path):
    np.random.seed(0)
    shape = (4, 6, 3)
    rgb = np.random.randint(0, 256, shape, dtype=np.uint8)
    test_image = PIL.Image.fromarray(rgb)
    image_path = tmp_path / 'test_image.jpg'
    test_image.save(image_path)
    return image_path, rgb


def test_Image_load_rgb(tmp_path):
    image_path, original_rgb = make_images(tmp_path)
    rgb2 = np.array(PIL.Image.open(image_path))
    assert np.array_equal(rgb2, original_rgb)


if __name__ == '__main__':
    test_Image_load_rgb(tmp_path)

Когда я смотрю на два массива, original_rgb и rgb2, они имеют разные значения, поэтому, конечно, это не получается, но я не понимаю, почему их массивы имеют разные значения.

Открытие их обоих как изображений с использованием PIL.Image.fromarray(), визуально они выглядят похожими, но не одинаковыми, значения яркости слегка изменяются визуально.

Я не понимаю, почему это так.

Два изображения:
test_image.jpg test_image2.jpg

Примечание. Это не работает одинаково как для Pytest, так и когда запустить как скрипт.

1 Ответ

0 голосов
/ 28 апреля 2020

Мне пришло в голову проверить это с изображениями BMP и PNG, и эта проблема не возникает с ними.

Так что мне приходит в голову, что процесс сжатия JPG каким-то образом слегка изменяет данные, поскольку Сжатие с потерями.

Но я был удивлен, что это дало бы эффект на таком маленьком и легком изображении.

Я оставляю этот вопрос на случай, если кто-то еще наткнется на это.

Было бы здорово, если бы кто-нибудь предложил более подробное объяснение!

ОБНОВЛЕНИЕ: Я заметил, что цвета в BMP / PNG сильно отличаются от JPG. Любая причина почему?

...