0

以下に、開発しようとしているこのプログラムのすべてのコードを提供しました。これが入力として受け取るのは、N x 3 ファイルです。以下で使用しているサンプルを提供します (5x3 のサンプルのみ)。各サンプルは、多次元スケーリングを使用して XYZ 座標にスケーリングされた画像内のピクセルの座標を表します。このプログラムの目的は、XYZ 座標から LaB 色に移行することです...その後、sRGB に変換されます。以下のコード (2 番目の部分) は、XYZ から LaB への変換を示しています。上の部分 (Fast XYZ - RGB というラベルが付いています) は、LaB ステップを切り取って XYZ から RGB に移動することがわかったショートカットです。問題は Fast XYZ - RGB ステップにあります。

私がやろうとしているのは、sRGBmat = (1 + val) * RGBLin ^ (1/2.4) - val を作成することです。

私が遭遇し続ける問題は、RGBLin が負の数になることがあるということです...つまり、Cmath などを使用する必要があります。Cmath を使用してみましたが、間違った値が返されました。MatLab では、まだ使用できる適切な数値 (実数 + 虚数部) が表示されます。

ファイル xyztest.txt には、次の値を持つ 5x3 行列が含まれています。

.2345   .9817   .7612
.5465   .7897   .3514
.7796   .6765   .5645
.1221   .6376   .8790
.5432   .5853   .4652

出力は (さらにいくつかの計算を行うと) N x 3 マトリックスになります。各行は、行 1 (最初の n 値) のピクセル 1-n の RGB 値を表し、次の n は行 2 を表します。 +1 値-

どんな助けでも大歓迎です!

import numpy as np
d=open('xyztest.txt', 'r')
import cmath

a=[]
count = 0
b = []
AoverAn = []
XoX = []
YoY = []
ZoZ = []
aova=[]
c = 0
while 1:
    line = d.readline()
    a.append(line.split())
    count = count + 1
    if not line:
        break
#print a #contains all of the line elements in a list
t=[]
XYZM = []

illuminant = [94.9423, 100.0000, 108.7201]
##or is it [ .9424, 1.000, .8249] which is in matlab-

#print count
for i in range(count-1):
    b = a[i:(i+1)]
    #print "this is", b
    c = b[0]
    x = c[0]
    y = c[1]
    z = c[2]
    XoverXn = round(float(x) /illuminant [0], 10)
    YoverYn = round(float(y) / illuminant [1], 10)
    ZoverZn = round(float(z) / illuminant [2], 10)
    XoX.append(XoverXn)
    YoY.append(YoverYn)
    ZoZ.append(ZoverZn)
    x.replace('\'', '')
    mmaker = (float("".join(x)), float("".join(y)), float("".join(z)))
    XYZM.append(mmaker)

L = []
a = []
b = []
fXoX = []
fYoY = []
fZoZ = []
Lab = []

##print "YOUR XYZ MAT", XYZM
##Get an XYZ matrix so i can use fast XYZ to RGB

高速 XYZ > RGB

##A is the thing we want to multiply
A= np.matrix('3.2410, -1.5374, -0.4986 ;-.9692, 1.8760, 0.0416 ; .0556, -.2040, 1.0570')

##we get [R,G,B]' = A * [X,Y,Z]'
##Must be in the range 0-1 
RGBLin=[]
##XYZM = float(XYZM)
print "XYZ"
print XYZM
xyzt = np.transpose(np.matrix(XYZM))
RGBLin = np.transpose(A * xyzt)


val = 0.555
temp = (RGBLin <= 0.00304)
#print temp


print "RGB"
##print RGBLin
## Do power multiplcation because numpy doesnt want to work for non square mat
for i in range(len(RGBLin)):
    for j in range(1):  
        rgbline = RGBLin[i].tolist()
        for item in rgbline:
            for i in range(3):
                print item[i]
                item[i] = 1.055 + item[i+1]**(1/2.4)
                print item[i]
            print item
        #print rgbline
        #te[i][j] = pow(RGBLin[i][j] , (1./2.4))
#print te

-> 問題はこのステップにあります。行列を (1/2.4) 乗しようとしていますが、行列の一部の値が負です。Python に値を与えるにはどうすればよいですか??!

#te = pow(RGBLin, (1./2.4))

XYZ -> ラボ

for i in range(len(XoX)):
    #print YoY[i]

    xyz = []

    test = float(pow(YoY[i],(1./3)))
    #print test
    if (YoY[i] > 0.008856):
        L.append((116 * (YoY[i] **(1./3))) - 16)               
        #L1 = (116 * (YoY[i] **(1./3))) - 16
    else:
        L.append(903.3* YoY[i])
        #L1 = 903.3* YoY[i]
    ##    
    if (XoX[i] > 0.008856):
        fXoX.append(pow(XoX[i], (1./3)))
        #A1 = pow(XoX[i], (1./3))
    else:
        fXoX.append((7.787 * XoX[i])+(16/116))
        #A1 = (7.787 * XoX[i])+(16/116)
    ##   
    if (YoY[i] > 0.008856):
        fYoY.append(pow(YoY[i], (1./3)))
        #B1 = pow(YoY[i], (1./3))
    else:
        fYoY.append((7.787 * YoY[i])+(16/116))
        #B1 = (7.787 * YoY[i])+(16/116)
    ##
    if (ZoZ[i] > 0.008856):
        fZoZ.append(pow(ZoZ[i], (1./3)))
        #Z1 = pow(ZoZ[i], (1./3))
    else:
        fZoZ.append((7.787 * ZoZ[i])+(16/116))
        #Z1 = (7.787 * ZoZ[i])+(16/116)
    ##

    a.append(500*(fXoX[i]-fYoY[i]))
    b.append(500*(fYoY[i]-fZoZ[i]))
    xyz.append((L[i], a[i], b[i]))
    ##print xyz
######### NOW we must go from Lab to RGB, where XYZ is the LaB co-ordinates######
4

1 に答える 1

1

数値が複素数であることを numpy に伝えます。

In [1]: import numpy as np

In [2]: r = np.array([-5, 2, 8, -1])

In [3]: r ** (1/2.4)
/usr/local/share/python3/ipython3:1: RuntimeWarning: invalid value encountered in power
   #!/usr/local/Cellar/python3/3.2.2/bin/python3.2
Out[3]: array([        nan,  1.33483985,  2.37841423,         nan])

In [4]: c = r.astype(complex)

In [5]: c ** (1/2.4)
Out[5]: 
array([ 0.50609696+1.88877958j,  1.33483985+0.j        ,
        2.37841423+0.j        ,  0.25881905+0.96592583j])

これについてはscipy.orgで議論されています。

于 2012-04-21T19:12:08.343 に答える