Метод Tensorflow: DecodeJpeg дает разные значения пикселей на рабочем столе и мобильном устройстве для одного и того же изображения

Я использовал Tensorflow DecodeJpeg для чтения изображений во время тренировки модели. Чтобы использовать тот же метод на устройстве Android, я скомпилировал Tensorflow с Bazel для Android с DecodeJpeg.

Я попытался прочитать то же изображение на своем рабочем столе, который является x86_64 машиной с Windows. Я запустил метод DecodeJpeg на изображении со значениями по умолчанию со значением dct_method, установленным на '', INTEGER_FAST, INTEGER_ACCURATE.

Я сделал то же самое на устройстве arm64, для того же изображения. Но значения пикселей значительно различались для одного и того же изображения при одинаковых настройках.

Например, в (100,100,1) значение на рабочем столе - 213, в то время как это 204 на arm64.

Как я могу убедиться, что значения пикселей одинаковы на этих двух устройствах? [! [Это изображение, которое я использовал] [1]] [1]

Обновление: На Gimp в (100,100) значения пикселей равны (179,203,190)

Для dct_method, установленного на INTEGER_FAST, значение в (100,100) на x86_64 равно (171, 213, 165), на руке это (180, 204, 191)

Для dct_method, установленного в INTEGER_ACCURATE, значение в (100,100) на x86_64 равно (170, 212, 164), на руке это (179, 203, 190)

Это (170, 212, 164) с PIL, что я и получаю с cv2.imread.

Ответ 1

Согласно документации tensodeflow image decode_jpeg, я ожидаю, что она может относиться к некоторому атрибуту при декодировании jpeg. Скорее всего, атрибут channels и/или атрибут ratio и/или fancy_upscaling attr.

Оба они могут изменить значение пикселя...

Что касается channels:

Каналы attr указывают желаемое количество цветовых каналов для декодированного изображения.

Принятые значения:

0: Use the number of channels in the JPEG-encoded image.
1: output a grayscale image.
3: output an RGB image.

Что касается ratio:

Отношение attr позволяет уменьшить масштаб изображения с помощью целочисленного коэффициента во время декодирования. Допустимые значения: 1, 2, 4 и 8. Это намного быстрее, чем уменьшение масштаба изображения позже.

Что касается fancy_upscaling:

fancy_upscaling: Необязательный bool. По умолчанию используется значение True. Если true, используйте более медленное, но более удобное масштабирование плоскостей цветности (только yuv420/422).


Обратите внимание, что вам также может потребоваться явно указать значение для dct_method потому что в соответствии с документацией, если вы не укажете значение, оно будет использовать системный defaut.

И, на мой взгляд, это (dct_method empty arg) является наиболее вероятной причиной, объясняющей, почему у вас нет такого же результата на x86_64 и ARM.

внутренняя библиотека jpeg изменяется на версию, которая не имеет этой конкретной опции