46

今日、PIL / Numpy / SciPyを使用して変換を行うための好ましい方法は何ですか?

4

5 に答える 5

73

リンクされた質問が行われた2010年以降、対応するコードはscipyから別のツールキットに移動しました: http ://scikit-image.org/

これが私が実際に探していたコードです:

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

ラボの性質上、 srgb- > lab変換は追加のパラメーターに依存することにも注意してください。ホワイトポイント。例:
   • PhotoshopはD50(iccの標準)と呼ばれるホワイトポイントを使用し
   ます。• OpenCVとskimageはD65( srgbの標準)。
   •デフォルトのMatlab実装はD50を使用します(他のものを使用できます)、

この素敵なFAQはそれをこのように説明しています:

他のものを使用する正当な理由がない限り、D65を使用する必要があります。
印刷業界では一般的にD50が使用され、写真では一般的にD55が使用されます。
これらは、屋内(タングステン)と日光の観察条件の間の妥協点を表しています。

(0,0,255)RGBをLabに変換することで、どのホワイトポイントを扱っているかがわかります。
   •D50は(30、68、-112)
   •D55(30、73、-110)
   •D65(32、79、-108)

「D」の後の数字は、白色点の(内部で)使用される色温度に対応します:D50 = 5003 K(黄色がかった)、D65 = 6504 K(青みがかった)

アレックスとローマンが私を正しい方向に向けてくれたので、彼らの答えに感謝しています。

于 2012-11-16T20:32:13.133 に答える
29

私はこのコードを古いAdobeCookbookサイトで見つけ、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
于 2013-04-15T16:22:13.360 に答える
7

編集:サンプルpyCMSコード:

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

編集:PILフォークであるPillowには、pyCMSが組み込まれているようです。

PILイメージで機能 するpyCMS(http://www.cazabon.com/pyCMS/ )を使用できます。

速度が重要でない場合は、python-colormath(http://code.google.com/p/python-colormath/)を使用してください。

于 2012-11-16T00:49:14.137 に答える
3

PIL画像のRGB<->LAB色空間を変換するためのクラスは次のとおりです。

from PIL import ImageCms

class ColorTrans:

    '''Class for transforming RGB<->LAB color spaces for PIL images.'''
    
    def __init__(self):
        self.srgb_p = ImageCms.createProfile("sRGB")
        self.lab_p  = ImageCms.createProfile("LAB")
        self.rgb2lab_trans = ImageCms.buildTransformFromOpenProfiles(srgb_p, lab_p, "RGB", "LAB")
        self.lab2rgb_trans = ImageCms.buildTransformFromOpenProfiles(lab_p, srgb_p, "LAB", "RGB")
    
    def rgb2lab(self, img):
        return ImageCms.applyTransform(img, self.rgb2lab_trans)

    def lab2rgb(self, img):
        return ImageCms.applyTransform(img, self.lab2rgb_trans)

使用例:

color_trans = ColorTrans()
c_img = Image.open(FILENAME)
c_img_lab = color_trans.rgb2lab(c_img)
c_img_rgb = color_trans.lab2rgb(c_img_lab)
于 2020-12-25T18:10:48.987 に答える
0

現時点では、それを行うための適切なパッケージが見つかりません。RGBはデバイスに依存する色空間であるため、プロファイルがない場合はXYZまたはCIEラボに正確に変換できないことに注意する必要があります。

したがって、色空間を指定したり、カラープロファイルをインポートしたりせずに、RGBからCIEラボに変換する多くのソリューションは、慎重に評価する必要があることに注意してください。ほとんどの場合、sRGB色空間を扱っていると想定している内部のコードを見てください。

于 2020-03-17T08:48:31.107 に答える