人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

数学の得意な方、変換をお願い致します。
Excelとvbaを使って計算するシートを作るにあたって、下記の式を
Y= X= Z=
の形式に変換したいと思いますが、^ 1/3(三分の一乗)のところの変換の仕方がわかりません。
Y= X= Z=の形に式を変換して頂けませんでしょうか。

L*a*b*表色系からXYZ表色系へ値を変換するための式になります。

L* = 116(Y/100)^ 1/3 - 16
a* = 500[(X/98.072)^ 1/3 - (Y/100)^ 1/3]
b* = 200[(Y/100)^ 1/3 - (Z/118.225)^ 1/3]

なお、L*a*b*に具体的な数値を当てはめた例は下記のとおりです。
63.4 = 116(Y/100)^ 1/3 - 16
0.0= 500[(X/98.072)^ 1/3 - (Y/100)^ 1/3]
-1.6 = 200[(Y/100)^ 1/3 - (Z/118.225)^ 1/3]


●質問者: nakamura12go
●カテゴリ:学習・教育 科学・統計資料
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●25ポイント

aaa= 1/3
L = 116*(Y/100)^ aaa - 16

といった感じにすればいいかと思います。


nakamura12goさんのコメント
ありがとうございます。

2 ● うぃんど
●50ポイント

関数を作ってみた

Function CIELAB2XYZ(L As Double, a As Double, b As Double) As Double()
 Dim Xn, Yn, Zn As Double
 Dim delta As Double
 Dim fx, fy, fz As Double
 Dim XYZ(2) As Double
 
 delta = 6 / 29

 Xn = 0.950456
 Yn = 1
 Zn = 1.088754

 fy = (L + 16) / 116
 fx = fy + a / 500
 fz = fy - b / 200

 XYZ(0) = IIf(fx > delta, Xn * fx ^ 3, (fx - 16 / 116) * 3 * delta ^ 2)
 XYZ(1) = IIf(fy > delta, Yn * fy ^ 3, (fy - 16 / 116) * 3 * delta ^ 2)
 XYZ(2) = IIf(fz > delta, Zn * fz ^ 3, (fz - 16 / 116) * 3 * delta ^ 2)
 
 CIELAB2XYZ = XYZ
End Function

呼び出し例

Sub Macro1()
 Dim XYZ() As Double
 XYZ = CIELAB2XYZ(63.4, 0, -1.6)
 MsgBox "X = " & XYZ(0) & vbCrLf & "Y = " & XYZ(1) & vbCrLf & "Z = " & XYZ(2) & vbCrLf
End Sub

参考にさせていただいた記事
http://ja.wikipedia.org/wiki/Lab%E8%89%B2%E7%A9%BA%E9%96%93#CIE_XYZ_.E3.81.B8.E3.81.AE.E5.A4.89.E6.8F.9B
http://opencv.jp/opencv-1.0.0/document/opencvref_cv_filters.html
http://komozo.blogspot.com/2011/04/rgbcielab.html


うぃんどさんのコメント
肝心の事を書き忘れましたので追記します・・・ >^ 1/3(三分の一乗)のところの変換 分母分子を入れ替えます ^(1/3) → ^(3/1) すなわち ^3

うぃんどさんのコメント
訂正 >|vb| XYZ(0) = IIf(fx > delta, Xn * fx ^ 3, (fx - 16 / 116) * 3 * delta ^ 2 * Xn) XYZ(1) = IIf(fy > delta, Yn * fy ^ 3, (fy - 16 / 116) * 3 * delta ^ 2 * Yn) XYZ(2) = IIf(fz > delta, Zn * fz ^ 3, (fz - 16 / 116) * 3 * delta ^ 2 * Zn) ||<

nakamura12goさんのコメント
大変ありがとうございます。参考になりました。

3 ● a-kuma3
●50ポイント ベストアンサー

X, Y, Z とも、全て 1/3 乗なので、X^(1/3) を X' というふうに (Y, Z も) 置き換えると、
普通の三元一次連立方程式になります。

L* = 116(Y/100)^ 1/3 - 16

L* = 116(Y'/(100^1/3)) - 16


で、X'、Y'、Z' を求めて、それぞれを三乗すれば求まります。


でも、方程式が解きたいわけじゃないんですよね?

■色変換式集 Lab
http://image-d.isp.jp/commentary/color_cformula/Lab.html

http://image-d.isp.jp/commentary/color_cformula/formula/LabtoXYZ.png


前の CMYK の質問のときには、計算式じゃなくてソフトを求めてたようだったので回答しませんでしたが、
他の色表現についての変換式も載ってますので、確認してみてください。


nakamura12goさんのコメント
色変換式集 Lab参考になりました。ありがとうございます。

nakamura12goさんのコメント
たぶん、これを見る方が勘違いされるとまずいと思ったので一応書いておきます。 ここに書いてあるL*a*b*とXYZの返還式には、他の変換式でXn,Yn,Znという形で提示されるD50とかD60とかA光源とかの変数が含まれていないようです。 ですので、いずれかの光源下であるという仮定の上での変換式だと思われます。

a-kuma3さんのコメント
>> 他の変換式でXn,Yn,Znという形で提示されるD50とかD60とかA光源とかの変数が含まれていない << ぼくが引用したページでは、X<sub>γ</sub> 、Y<sub>γ</sub> 、Z<sub>γ</sub> が、それに相当します。 ページの下の方にちいさーく、こんな但し書きもあります。 >> #ただし、XrYrZrは対象とする物体色と同一照明下の完全拡散反射面の3刺激値です。 通常Yr=100となるように標準化されています。 <<

nakamura12goさんのコメント
そうなんですね。見逃しておりました。失礼しました。

4 ● rsc
●25ポイント

こちらは参考になるでしょうか。
U = 98.072, W = 118.225として、
X = ((29 a+125 L+2000)^3 U)/3048625000000 = (98.072*(29*a+125*L+2000)^3)/3048625000000
Y = (25 (L+16)^3)/390224
Z = -((29 b-50 L-800)^3 W)/195112000000 = -(118.225*(29*b-50*L-800)^3)/195112000000

※参考URL
http://www.wolframalpha.com/input/?i=solve%5B%7BL+%3D+116%28Y%2F100%29%5E+1%2F3+-+16%2Ca+%3D+500%5B%28X%2FU%29%5E+1%2F3+-+%28Y%2F100%29%5E+1%2F3%5D%2Cb+%3D+200%5B%28Y%2F100%29%5E+1%2F3+-+%28Z%2FW%29%5E+1%2F3%5D%7D%2C%7BX%2CY%2CZ%7D%5D


nakamura12goさんのコメント
ありがとうございます。式で計算できるおもしろいサイトですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ