Конвертировать изображение в RGB-> Lab with python

Каков сегодня предпочтительный способ конвертации с использованием PIL / Numpy / SciPy?

 Antony Hatchkins15 нояб. 2012 г., 21:50
прочитал этот вопросstackoverflow.com/questions/3228361/... и это дает неработающую ссылку на color.py, который отсутствует в магистрали scipy.
 Antony Hatchkins15 нояб. 2012 г., 21:58
Да я'мы нашли этот файл глубоко в репозитории scipy git, но я могуне верюНет такого стандартного способа сделать такую простую вещь, используя такие мощные инструменты.
 Antony Hatchkins15 нояб. 2012 г., 21:58
И да, я знаю о code.google.com/p/python-colormath lib, и все же могуне понимаю, почему неэто пробивается в любой из этих трех инструментов.

Ответы на вопрос(3)

Решение Вопроса

С 2010 года, когдасвязанный вопрос был задан соответствующий код, перемещенный из scipy в отдельный инструментарий:http://scikit-image.org/

Так вот's код, который я действительно искал:

from skimage import io, color
rgb = io.imread(filename)
lab = color.rgb2lab(rgb)

Следует также отметить, что из-залаборатория природа srgb->лабораторное преобразование зависит от дополнительного параметра:точка белогоНапример:

• Photoshop использует белую точку под названием D50 (которая является стандартом для ICC)

• OpenCV и Skimage использовать D65 (который является стандартом для srgb).

• дефолтMatlab реализация использует D50 (он может использоватьдругие),

Это милоЧасто задаваемые вопросы объясняет это так:

Вы должны использовать D65, если у вас нет веских причин использовать что-то еще.

В полиграфии обычно используется D50, а в фотографии - D55.

Они представляют собой компромисс между условиями в помещении (вольфрам) и дневного освещения.

Вы можете сказать, какая белая точка выимеем дело с преобразованием RGB(0,0,255) в лабораторию:

 • D50 даст вам (30, 68, -112)

 • D55            (30, 73, -110)

 • D65            (32, 79, -108)

Числа после 'D' соответствуют (внутренне) используемой цветовой температуре белой точки: D50 = 5003 К (голубоватый), D65 = 6504 К (желтоватый) I '

Я благодарен Алексу и Роману за их ответы, потому что они указали мне правильное направление.

 Antony Hatchkins22 мар. 2019 г., 11:40
@eoyilmaz спасибо, исправил
 Pylyp10 апр. 2014 г., 09:00
Вskimage Вы можете изменить точку белого на D50 или что-то ещеstackoverflow.com/a/22968744/2863099
 eoyilmaz18 мар. 2019 г., 15:54
Я считаю, что D50 = желтоватый и D65 = голубоватый

мы нашли этот код на старомСайт Adobe Cookbook и адаптировали для Python. Это нене требуются сторонние модули или компоненты:

def rgb2lab ( inputColor ) :

   num = 0
   RGB = [0, 0, 0]

   for value in inputColor :
       value = float(value) / 255

       if value > 0.04045 :
           value = ( ( value + 0.055 ) / 1.055 ) ** 2.4
       else :
           value = value / 12.92

       RGB[num] = value * 100
       num = num + 1

   XYZ = [0, 0, 0,]

   X = RGB [0] * 0.4124 + RGB [1] * 0.3576 + RGB [2] * 0.1805
   Y = RGB [0] * 0.2126 + RGB [1] * 0.7152 + RGB [2] * 0.0722
   Z = RGB [0] * 0.0193 + RGB [1] * 0.1192 + RGB [2] * 0.9505
   XYZ[ 0 ] = round( X, 4 )
   XYZ[ 1 ] = round( Y, 4 )
   XYZ[ 2 ] = round( Z, 4 )

   XYZ[ 0 ] = float( XYZ[ 0 ] ) / 95.047         # ref_X =  95.047   Observer= 2°, Illuminant= D65
   XYZ[ 1 ] = float( XYZ[ 1 ] ) / 100.0          # ref_Y = 100.000
   XYZ[ 2 ] = float( XYZ[ 2 ] ) / 108.883        # ref_Z = 108.883

   num = 0
   for value in XYZ :

       if value > 0.008856 :
           value = value ** ( 0.3333333333333333 )
       else :
           value = ( 7.787 * value ) + ( 16 / 116 )

       XYZ[num] = value
       num = num + 1

   Lab = [0, 0, 0]

   L = ( 116 * XYZ[ 1 ] ) - 16
   a = 500 * ( XYZ[ 0 ] - XYZ[ 1 ] )
   b = 200 * ( XYZ[ 1 ] - XYZ[ 2 ] )

   Lab [ 0 ] = round( L, 4 )
   Lab [ 1 ] = round( a, 4 )
   Lab [ 2 ] = round( b, 4 )

   return Lab
 Antony Hatchkins17 апр. 2013 г., 20:22
Хотя я бы сослался на оригиналeasyrgb сайт вместо Adobe поваренной книги.
 Mark Ransom07 июл. 2016 г., 17:41
@jez гамма 2.4, которую вы видите здесь, является стандартом sRGB. Он соединяется вместе с линейным преобразованием при более низких значениях, и они вместе близко соответствуют кривой гамма 2,2. Я бы нене могу ничего изменить.
 Antony Hatchkins17 апр. 2013 г., 20:32
Я должен сказать, что ваш код не совсем питонический. По крайней мере, ябуду использоватьenumerate вместоnum переменная и1/3. вместо0.3333333333333333
 jez13 июл. 2015 г., 17:10
Этот код, по-видимому, выполняет гамма-коррекцию (** 2.4 ). Что если я знаю, что моя гамма равна 2,2, а не 2,4? Достаточно ли изменить показатель степени до 2,2 или нужно изменить другие жестко закодированные константы (например, 1,055)?
 Drunken Master13 апр. 2017 г., 09:05
Спасибо за разработку этого, ямы пробовали несколько значений, и они совпадают сcolormine.org/convert/rgb-to-lab
 Antony Hatchkins17 апр. 2013 г., 20:21
Это неТ прямо ответить на вопрос: мне нужна была одна строка. Но это все равно полезно. Спасибо!

Изменить: Пример кода PyCMS:

from PIL import Image
import pyCMS
im = Image.open(...)
im2 = pyCMS.profileToProfile(im, pyCMS.createProfile("sRGB"), pyCMS.createProfile("LAB"))

Изменить: Подушка, вилка PIL, кажется, встроенный PyCMS.

Вы можете использовать pyCMS (http://www.cazabon.com/pyCMS/), который работает с изображениями PIL.

Если скорость не имеет значения, используйте python-colormath (http://code.google.com/p/python-colormath/).

 Antony Hatchkins16 нояб. 2012 г., 05:30
Да, я упомянул python-colormath в третьем комментарии к вопросу.
 Antony Hatchkins16 нояб. 2012 г., 05:31
Нет, это не матрица.
 Antony Hatchkins16 нояб. 2012 г., 21:33
d удалите последнюю часть, относящуюся к решению PIL-only, поскольку оно неверно.
 Antony Hatchkins16 нояб. 2012 г., 15:01
Вопрос неесли есть одна строка (две были приведены в моих комментариях к вопросу), а скорееЗачем ни один из этих двоих не попал в PIL / Numpy / Scipyили же если там'некоторые лучшие альтернативы.
 Antony Hatchkins18 апр. 2013 г., 11:33
После некоторых исследований я значительно улучшил свой ответ и чувствую, что его следует принять сейчас. Я компенсировал вашу репутацию;)
 Antony Hatchkins16 нояб. 2012 г., 05:29
pyCMS имеет дело с профилями ICC, цветовые пространства "побочный эффект", Я попросил однострочник.
 Antony Hatchkins16 нояб. 2012 г., 16:23
Также там'нет необходимости впортирование» Colormath для NumPy, поскольку он использует NUMPY с момента его создания.
 Antony Hatchkins16 нояб. 2012 г., 16:23
Если вы приведете пример использования pyCMS для этого преобразования, я приму ваш ответ.
 fchen05 февр. 2013 г., 00:30
pyCMS выглядит хорошо, но использовать его рискованно - кажется, он не будет в хорошем состоянии.
 Alex I16 нояб. 2012 г., 09:21
Энтони, однако ты прав, что это не одна матрица, потому что xyz->Лабораторное преобразование определяется по-разному в разных диапазонах XYZ. Ну, я нене думаю, что тамс одной строчкой, если не считать портирования соответствующей части colormath на numpy первым :)

Ваш ответ на вопрос