Подтвердить что ты не робот

Преобразование изображения RGB-> Лаборатория с помощью python

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

4b9b3361

Ответ 1

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

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

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

Следует также отметить, что из-за Lab природа преобразования srgb- > lab зависит от дополнительного параметра: whitepoint, например:
    • Photoshop использует белую точку под названием D50 (которая является стандартом для icc)
    • OpenCV и использование скина D65 (что является стандартом для srgb).
    • реализация по умолчанию Matlab использует D50 (она способна использовать другие),

Этот приятный FAQ объясняет это следующим образом:

Вы должны использовать D65, если у вас нет веских оснований для использования остальное.
В типографии обычно используется D50 и обычно использует D55.
Они представляют собой компромиссы между условиями (вольфрама) и дневного освещения.

Вы можете определить, с какой белой точкой вы столкнулись, конвертируя RGB (0,0,255) в Lab:
  • D50 даст вам (30, 68, -112)
  • D55             (30, 73, -110)
  • D65             (32, 79, -108)

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

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

Ответ 2

Я нашел этот код на старом сайте 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

Ответ 3

Изменить: Пример кода 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/).