Цвет становится тусклым: opencv cv2.imread cv2.imwrite

Я использую модуль opencv для чтения и записи изображения. вот код, а ниже - изображение, которое я читаю, а второе изображение - после сохранения его на диск с помощью cv2.imwrite ().

import cv2

img = cv2.imread('originalImage.jpg')
cv2.imwrite('test.jpg',img)

исходное изображение

изображение сохранено с помощью opencv

На втором изображении заметно тусклые цвета. Есть ли способ обойти эту проблему, или мне не хватает каких-то параметров настройки ..?


person Riken Mehta    schedule 15.06.2017    source источник
comment
Попробуйте сохранить в другом формате изображения   -  person Rick M.    schedule 15.06.2017
comment
@RickM. можешь подсказать формат ..? мне попробовать PNG ..?   -  person Riken Mehta    schedule 15.06.2017
comment
Возможный дубликат без потери качества изображений, сохраненных с помощью cv2 .imwrite ()   -  person Shraddheya Shendre    schedule 15.06.2017
comment
С png я также сталкиваюсь с такой же деградацией качества.   -  person Riken Mehta    schedule 15.06.2017


Ответы (3)


Разница в том, что к исходному изображению (слева на схеме) прикреплен профиль ICC, а ко второму (справа) нет.

введите здесь описание изображения

Я получил это изображение, запустив утилиту ImageMagick под названием identify следующим образом:

identify -verbose first.jpg    > 1.txt
identify -verbose second.jpg   > 2.txt

Затем я запустил замечательный инструмент opendiff (который является частью macOS) следующим образом:

opendiff [12].txt

Вы также можете извлечь профиль ICC из первого изображения с помощью ImageMagick следующим образом:

convert first.jpg profile.icc
person Mark Setchell    schedule 15.06.2017
comment
Итак, как мне позаботиться об этом профиле ICC при записи изображения через opencv ..? - person Riken Mehta; 15.06.2017
comment
Хорошо поймал! Однако это не решает проблему OP! - person Ander Biguri; 15.06.2017
comment
Привет, @AnderBiguri. Да, я согласен, что это не решает проблему, но я считаю, что ответы, которые помогают понять, в чем проблема, вполне приемлемы, и если два человека знают половину ответа ... ну , возможно, мы сможем выработать полный ответ между нами. На данный момент я собираюсь сказать, что я считаю, что OpenCV более склонен к решению проблем компьютерного зрения и менее склонен беспокоиться о точности управления цветом для целей печати и воспроизведения, поэтому я подозреваю, что OP будет нужно учитывать профиль ICC сам. Я могу ошибаться :-) - person Mark Setchell; 15.06.2017
comment
@RikenMehta OpenCV не читает и не записывает профили ICC (или другие метаданные), поэтому вам нужно искать решение за пределами OpenCV. - person SSteve; 15.06.2017
comment
@SSteve, мне нужно сделать монтаж изображений и записать их обратно на диск для последующего использования визуальных эффектов. Можете ли вы предложить мне другие модули на Python, которые я могу использовать? - person Riken Mehta; 15.06.2017
comment
@RikenMehta Извини. Я знаю OpenCV, но не знаю модули управления изображениями Python. - person SSteve; 15.06.2017
comment
@RikenMehta Вы можете попробовать использовать модуль PIL (библиотека изображений Python). - person cs95; 15.06.2017

Я провел небольшое исследование вопроса, поднятого @mark в отношении профиля ICC. Я нашел способ справиться с этим в модуле Python PIL. вот код, который у меня сработал. Я также научился использовать формат файла PNG, а не JPEG, для преобразования без потерь.

import Image
img = Image.open('originalImage.jpg')
img.save('test.jpg',icc_profile=img.info.get('icc_profile'))

Надеюсь, это поможет и другим.

person Riken Mehta    schedule 18.06.2017
comment
Молодцы - и спасибо, что поделились своими выводами с сообществом. - person Mark Setchell; 18.06.2017
comment
Спасибо @Mark, именно благодаря вашему открытию я смог решить свою проблему. - person Riken Mehta; 18.06.2017

Ваше первое входное изображение имеет некоторый ICC-профиль, связанный с метаданными, который является необязательным атрибутом, и большинство устройств могут вообще не внедрять его. Профиль ICC в основном выполняет своего рода цветокоррекцию, а поправочные коэффициенты вычисляются для каждого уникального устройства во время калибровки.

Современные веб-браузеры и утилиты просмотра изображений в основном принимают во внимание эту информацию профиля ICC перед отображением изображения на экране, поэтому оба изображения отличаются друг от друга.

Но, к сожалению, OpenCV не считывает конфигурацию ICC из метаданных изображения для выполнения какой-либо коррекции цвета.

person ZdaR    schedule 16.06.2017
comment
у вас есть представление о какой-либо утилите, которая заботится о профиле ICC ..? На любом языке и в любых рамках.? - person Riken Mehta; 16.06.2017
comment
Я не догадываюсь, есть ли какая-либо библиотека, поддерживающая чтение изображений с метаданными, но вы можете посмотреть этот ссылка, чтобы получать изображения в профиле sRGB, а не в ICC. - person ZdaR; 16.06.2017