Как сохранить те же цвета при преобразовании изображения CMYK в RGB с помощью PIL?

#python #image #image-processing #python-imaging-library #jpeg

#python #изображение #обработка изображений #python-imaging-library #jpeg

Вопрос:

При преобразовании изображения CMYK в RGB мои цвета инвертируются. Я хочу сохранить те же (визуально) цвета и удалить данные exif.

Мне нужно сделать это, чтобы иметь возможность отображать преобразованное изображение на любом изображении или в программе просмотра PDF.

Результат (код ниже)

Оригинальный CMYK

Изображение слишком тяжелое для загрузки -> https://www.dropbox.com/s/q9z2jejhasjqdoy/original.jpeg?dl=0

Преобразованный RGB

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

Преобразованный RGB после раскомментирования invert_pixels(image)

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

Преобразовано с помощью TinyJPG (это преобразование работает правильно в PDF и других средствах просмотра изображений. Я хочу по существу воссоздать этот профиль изображения)

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

Стек

  • Python 3.5.9
  • PIL 5.1.0

Тестовый код:

 image_filename = "original.jpeg"
image_file = open(image_filename, "rb")
image = Image.open(image_file)

orientate_image_using_exif(image)

image_data = list(image.getdata())

image_without_exif = image.convert("RGB")
image_without_exif.putdata(image_data)

# invert_pixels(image)

image_without_exif.save(
    u"RGB_{}".format(image_filename),
    progressive=True,
    icc_profile=image.info.get('icc_profile'),
    subsampling=0,
)
 

Комментарии

  • Я конвертирую в RGB только потому, что метаданные изображения TinyJPG показывают, что это RGB
  • Учитывая, насколько ближе меня приблизила инверсия пикселей, я предполагаю, что мне нужно найти правильную формулу для каждого преобразования пикселей с сохранением правильного цвета
  • orientate_image_using_exif не влияет на конечные цвета

Вопрос

  • Может кто-нибудь помочь мне заставить это работать правильно? Желаемый результат похож на изображение TinyJPG. Он выполняет сжатие без потерь. Я не хочу / забочусь об этом. Меня интересует только удаление данных exif (работает) и сохранение правильных цветов (не работает)

Комментарии:

1. Зачем вы вообще конвертируете свое изображение в RGB? JPEG может напрямую хранить изображения CMYK / YCCK.

2. Я пытаюсь добиться именно того, что показано на последнем изображении. То же, что и в последнем изображении, изменение исходного изображения на RGB, похоже, заставляет его работать в программе просмотра PDF. Исходное изображение CMYK при открытии с помощью программы просмотра PDF инвертирует цвета

3. Возможно, вам также следует удалить icc_profile при преобразовании изображения в RGB.

4. Кстати, изображение, которым вы поделились, не содержит данных Exif (сегмент маркера APP1).

5. Да, кажется, это не так. Это означает, что проблема заключается в том, как цветовое пространство представлено в разных считывателях. Идеальным решением было бы сохранить те же цвета визуально, что и сжатое крошечное изображение в формате jpg

Ответ №1:

Не уверен, что я понимаю, что вы здесь делаете. Я получаю правильно окрашенное, разделенное изображение с помощью этого кода:

 from PIL import Image

im = Image.open('original.jpg')
RGB = im.convert('RGB')
RGB.save('result.jpg')
 

Я вижу «Профиль ICC» в оригинале exiftool примерно так:

 exiftool original.jpg

ExifTool Version Number         : 12.00
File Name                       : original.jpg
Directory                       : .
File Size                       : 5.1 MB
File Modification Date/Time     : 2020:11:27 12:08:27 00:00
File Access Date/Time           : 2020:11:27 12:09:49 00:00
File Inode Change Date/Time     : 2020:11:27 12:08:43 00:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
DCT Encode Version              : 100
APP14 Flags 0                   : (none)
APP14 Flags 1                   : (none)
Color Transform                 : Unknown (RGB or CMYK)
Profile CMM Type                : Adobe Systems Inc.
Profile Version                 : 2.1.0
Profile Class                   : Output Device Profile
Color Space Data                : CMYK
Profile Connection Space        : Lab
Profile Date Time               : 2000:07:26 05:41:53
Profile File Signature          : acsp
Primary Platform                : Apple Computer Inc.
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             : Adobe Systems Inc.
Device Model                    : 
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Perceptual
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : Adobe Systems Inc.
Profile ID                      : 0
Profile Description             : U.S. Web Coated (SWOP) v2
Profile Copyright               : Copyright 2000 Adobe Systems, Inc.
Media White Point               : 0.7084 0.73595 0.57104
A To B0                         : (Binary data 41478 bytes, use -b option to extract)
A To B2                         : (Binary data 41478 bytes, use -b option to extract)
A To B1                         : (Binary data 41478 bytes, use -b option to extract)
B To A0                         : (Binary data 145588 bytes, use -b option to extract)
B To A1                         : (Binary data 145588 bytes, use -b option to extract)
B To A2                         : (Binary data 145588 bytes, use -b option to extract)
Gamut                           : (Binary data 37009 bytes, use -b option to extract)
Image Width                     : 4167
Image Height                    : 4167
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 4
Image Size                      : 4167x4167
Megapixels                      : 17.4
 

И я вижу, что он попал в выходной файл следующим образом:

 exiftool result.jpg

ExifTool Version Number         : 12.00
File Name                       : result.jpg
Directory                       : .
File Size                       : 718 kB
File Modification Date/Time     : 2020:11:27 12:15:48 00:00
File Access Date/Time           : 2020:11:27 12:16:14 00:00
File Inode Change Date/Time     : 2020:11:27 12:15:54 00:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Image Width                     : 4167
Image Height                    : 4167
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4167x4167
Megapixels                      : 17.4
 

Ключевые слова: Обработка изображений, Python, PIL, Pillow, EXIF, strip EXIF, профиль, ICC-профиль, профиль полосы.

Комментарии:

1. Большое спасибо, что нашли время и помогли. Хорошо, кажется, основную проблему было проще исправить, чем я думал. Простое преобразование открытого изображения в RGB позволяет программе просмотра PDF также корректно отображать его.

2. Однако цвета все равно будут разными, если вы сравните результат вашего кода: dropbox.com/s/6fh3yunscl25mz4/result_stack.jpeg?dl=0 и крошечное изображение JPG. Вы знаете, как это исправить?

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