Это поведение зависит от различных несовместимых версий libjpeg , используемых cv2 и PIL / Pillow, как уже указывалось @fireant.
Например, когда я пытаюсь запустить этот код с более старыми версиями Pillow (например, 3.4.2), он генерирует тот же вывод. В моих тестах, Pillow 3.4.2 и старше (самая старая версия пробовала 2.2.0) все используют libjpeg 8, в то время как Pillow 4.0.0 и новее используют libjpeg 9.2.
OpenCV, с другой стороны, может использовать разных версий в разных системах :
В ОС Microsoft Windows * и MacOSX * кодеки, поставляемые с образом OpenCV (libjpeg, libpng, libtiff и libjasper), используются по умолчанию.
В Linux *, BSD-версиях и других Unix-подобных операционных системах с открытым исходным кодом OpenCV ищет кодеки, поставляемые с образом ОС. Установите соответствующие пакеты (не забудьте файлы разработки, например, «libjpeg-dev» в Debian * и Ubuntu *), чтобы получить поддержку кодека или включите флаг OPENCV_BUILD_3RDPARTY_LIBS в CMake.
Таким образом, в системах Debian / Ubuntu opencv может использовать libjpeg-turbo
, который поставляется с ОС. (В частности, на моей машине была установлена версия 8.)
Способ исправить это - убедиться, что и Pillow, и OpenCV используют одну и ту же версию libjpeg.
Вы можете попробовать это:
если у вас относительно новый PIL / Pillow, понизьте его до версии <= 3.4.2 (это то, что у меня сработало) </p>
pip install Pillow==3.4.2
если у вас старая версия Pillow, вы можете попробовать обновить ее до версии> = 4.0.0
Если это не поможет, ваше решение может быть одним из двух:
- перекомпилируйте ваш OpenCV с тем же вкусом libjpeg, который использовал Pillow.
- переустановка Pillow из исходного кода с использованием той же версии libjpeg, что и в OpenCV.