• ベストアンサー

Excel VBA での計算について…

こんばんは、最近VBAを使い始めた初心者のものです。 画像処理をやってます。Bitmap形式の画像からRGB値を読み込んでそれぞれのワークシートに値を入れる所までは出来てます。 そのあと、RGB→XYZ→L*a*b*に変換した値を新しいワークシートの対応するセルにいれたいのですが、なにぶん初心者なのでどう書くのかわからず困ってます。 どなたか教えていただけないでしょうか? ちなみにRGB→XYZの変換式は X=0.607R+0.174G+0.201B Y=0.299R+0.587G+0.114B Z=0.066G+1.117B で、XYZ→L*a*b*の変換式は (X/0.983)>0.008856,(Y/1.000)>0.008856,(Z/1.183)>0.008856の時 L*=116(Y/1.000)^1/3 a*=500{(X/0.983)^1/3-(Y/1.000)^1/3} b*=200{(Y/1.000)^1/3-(Z/1.183)^1/3} (X/0.983),(Y/1.000),(Z/1.183)の値に0.008856以下のものがある場合は、 上式で対応する立法根の項をそれぞれ以下の式に置き換えて計算します。 (X/0.983)^1/3→7.787(X/0.983)+16/116 (Y/1.000)^1/3→7.787(Y/1.000)+16/116 (Z/1.183)^1/3→7.787(Z/1.183)+16/116

  • gmen
  • お礼率16% (2/12)

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

シートR,G,Bの変換数値の出力用に3シート(シート名はLab_L、Lab_a、Lab_b) を作成しておきます。シートを挿入してシート名をつけておきます。 X,Y,Z,L,a,b については、どのような意味合いの数値か分かりませんので Double で計算しています。 一応、L,a,b の値は計算できていますが、値の妥当性はまるっきり分かりません。 シートR,G,Bの『同じセル番地をセットで変換』するという理解で、変換の仕方を書いてみました。 シートRのセルを参照して、同じ番地のシートG,Bの値を使い、変換結果をシートLab_L、Lab_a、Lab_b の同じ番地に書き込んでいます。X,Y,Z はモジュールの中だけで使用しています。 ご参考に。 標準モジュールに貼り付けます(当方、Excel2000です) ↓ Public Sub HENKANN()   Dim wsR, wsG, wsB As Worksheet        'RGBシート     Set wsR = Worksheets("R")         'シートR     Set wsG = Worksheets("G")         'シートG     Set wsB = Worksheets("B")         'シートB   Dim wsLab_L, wsLab_a, wsLab_b As Worksheet  'Labシート     Set wsLab_L = Worksheets("Lab_L")     'シートLab_L     Set wsLab_a = Worksheets("Lab_a")     'シートLab_a     Set wsLab_b = Worksheets("Lab_b")     'シートLab_b   Dim rg As Range               '計算するセル   Dim Adr As String              '計算するセルの番地   Dim X, Y, Z, L, a, b As Double        'X,Y,Z と計算したL,a,b   Application.ScreenUpdating = False   'シートRのセルを順に計算対象として、この値と   '  対応するシートG,Bの値からX,Y,Z とL,a,bを計算   For Each rg In wsR.Range("A1:IV256")     'RGB→XYZの変換     Adr = rg.Address  'セルの番地     X = (0.607 * wsR.Range(Adr) + 0.174 * wsG.Range(Adr) + 0.201 * wsB.Range(Adr)) / 255     Y = (0.299 * wsR.Range(Adr) + 0.587 * wsG.Range(Adr) + 0.114 * wsB.Range(Adr)) / 255     Z = (0.066 * wsG.Range(Adr) + 1.117 * wsB.Range(Adr)) / 255     'XYZ→Labの変換     If (X / 0.983 > 0.008856) And (Y > 0.008856) And (Z / 1.183 > 0.008856) Then       L = 116 * Y ^ (1 / 3)       a = 500 * ((X / 0.983) ^ (1 / 3) - Y ^ (1 / 3))       b = 200 * (Y ^ (1 / 3) - (Z / 1.183) ^ (1 / 3))     Else       L = 903.3 * Y       a = 500 * (7.787 * (X / 0.983) + 16 / 116 - (7.787 * Y + 16 / 116))       b = 200 * (7.787 * Y + 16 / 116 - (7.787 * (Z / 1.183) + 16 / 116))     End If     'Labの各シートに書き出し     wsLab_L.Range(Adr) = L     wsLab_a.Range(Adr) = a     wsLab_b.Range(Adr) = b   Next   Application.ScreenUpdating = True End Sub

その他の回答 (1)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

質問の意味が全く理解できてません。 >そのあと、RGB→XYZ→L*a*b*に変換した値を新しいワークシートの対応するセルにいれたいのですが、なにぶん初心者なのでどう書くのかわからず困ってます。 XYZ? L*a*b? 全く意味不明です。 X=0.607R+0.174G+0.201B Y=0.299R+0.587G+0.114B Z=0.066G+1.117B とは? 0.607R = 0.607 * R ですか?数学的記述をするのではなく、プログラミング的記述で質問を行ってください。 >対応するセル 対応の法則がわかりません。

gmen
質問者

補足

すみません、補足します。 すべて色を表す表色系のことです。 画像処理をやってます。Bitmap形式の画像からRGB値を読み込んでそれぞれのワークシート"R"、"G"、"B”に画素毎に値を読み込んでます。 最終的にL*a*b*表色系の値が欲しいのでRGB表色系→XYZ表色系→L*a*b*表色系の手順で値を変換しなくてはなりません。 それが下記の計算です。 まずはRGB→XYZへの変換です(以前の式とは変わってます) X =(0.607 * R + 0.174 * G + 0.201 * B)/ 255 Y =(0.299 * R + 0.587 * G + 0.114 * B)/ 255 Z =(0.066 * G + 1.117 * B)/ 255 で、XYZ→L*a*b*への変換は (X/0.983)>0.008856,(Y/1.000)>0.008856,(Z/1.183)>0.008856の時 L = 116 * (Y/1.000)^(1/3) a = 500 * [(X/0.983)^(1/3) - (Y/1.000)^(1/3)] b = 200 * [(Y/1.000)^(1/3) - (Z/1.183)^(1/3)] (X/0.983),(Y/1.000),(Z/1.183)の値に0.008856以下のものがある場合は、 L = 903.3 * Y a = 500 * [7.787 * (X/0.983) + 16/116 - (7.787 * (Y/1.000) + 16/116)] b = 200 * [7.787 * (Y/1.000) + 16/116 - (7.787 * (Z/1.183) + 16/116)] となります。 おおもとのR、G、Bのデータはそれぞれ256×256個あって、0~255までの整数です。 いかがでしょうか?

関連するQ&A

  • エクセルVBAの入力について

    "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)すべてコピーして、 貼り付ける場所が"Sheet2"のA1:Z10の範囲内で、 A1はB列、C1はG列、F1はH列、G1はZ列の空白セルに上詰めで貼り付ける。 なおF、G、H、Z列以外の列には値が入力されていたり空白もあります。 また同時に、 "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)の内でA1とF1のみコピーして、 貼り付ける場所が"Sheet3"のC1:Y10の範囲とC13:Y23範囲内で、 A1はC列、F1はY列の空白セルに上詰めで貼り付ける。 なおC、Y列以外の列には値が入力されていたり空白もあります。 またC11:Y12の範囲内にはすべて値が入力されています。 よろしくお願いします。

  • ラグランジアンのUの表し方

    お世話になっております。 L=T-UにおけるUの表し方について少々混乱したので質問させていただきます。 仮に、円筒座標(r, φ, z)系においての一般的な保存力Fr Fφ Fz (各々rφzは添え字)が与えられていた場合ラグランジアンはどうなるのでしょうか? 簡単のために、質量mの質点の運動とします #運動エネルギーに関して T= m/2 * (x'^2 + y'^2 + z'^2) を変数変換して (x=rcosφ ,y =rsinφ , z = z) =m/2 (r'^2 + r^2・φ'^2) となるのはわかりました。 #ポテンシャルエネルギーに関して さて、ベクトルF=-∇U なので Fr = - (U)r 式(a) ただし、(A)iはAのiによる偏微分とする。 Fφ= - (U)φ/r 式(b) Fz = - (U)z 式(c) です。 ここで質問なのですが ポテンシャル原点を(x0,y0,z0)としたとき Uはどのようにあらわされるのでしょうか? 式aをとけば U = -Fr・r + g(φ,z) ただしgは関数 (式A cより U = -Fz・z + h(r,φ) (式B となりますが bの扱い方がよくわかりません。 (U)φ = -rFφ として U = -rφ・Fφ + i(r,z) (式C としてしまうと 式CはAに矛盾してそうです。 一体どこがおかしいのでしょうか?普通のxyz座標におけるUだと思われる U = -Fx・(x-x0) - Fy・(y-y0) - Fz(z-z0)に類似した式までの変形過程をお教えいただけるとありがたいです。 どうぞよろしくお願いいたします。

  • プログラミングによる色度図の作成方法

    プログラミングで、三刺激値XYZ(Yxy)から、RGB値に変換して、 以下のURLみたいに、中心部分が光って、外側の色が濃い色度図(光源色の色度図?)を作成したいです。 http://www.nichia.co.jp/jp/product/lamp-color.html 以下のURL,ソースを参考にして、色度図をプログラミングで描きました。 http://www.cs.rit.edu/~ncs/color/t_chroma.html http://www.cs.rit.edu/~ncs/color/API_JAVA/source.html (Diagram.java) 実際には、上記HPの様な、中心の光っている部分が小さいグラフしかかけません。 XYZからRGBへの変換式が違うかと思い、以下の式を試してもだめでした。 R = (2.280088812 * X -0.373460254 * Y -0.645622953 *Z); G = (-1.777655271 * X +3.944993595 * Y -0.901963019 *Z); B = (0.313713797 * X -0.754043019 * Y + 1.084705426 *Z); XYZ: 3刺激値 ガンマ = 1 (http://www.babelcolor.com/download/RGB%20Coordinates%20of%20the%20Macbeth%20ColorChecker.pdf) 中心を光らせるには、何か特別なコツがいるのでしょうか?

  • ブール代数

    ブール代数の問題です。 わかる方はぜひお応えください。 1.次の式を証明しなさい。また、双対を書きなさい。 (1)a+a'*b=a+b (2)(a+b)*(b+c)=a*c+b (3)(a*1)*(0+a')=0 2.次のブール式を加法標準形にしなさい。 (1)xz+xyz (2)xz+y'z+xyz (3)(x+y'z)'+(xyz'+x'y)' 3.次のブール式を完全加法標準形にしなさい。 (1)xy+xz' (2)z(x'+y)'+y' 4.次のブール式を加法標準形にし、さらに完全加法標準形にしなさい。 (1){(x'+y)'+x'y}' (2)x(x'+y)+y'z (3)(x'y')'(x'+xyz') (4)(x+y)(x+yz') 結構多いのですが、丁寧な解説をお願い致します。 全部できなくて構いません。 できる問題だけでも大丈夫です。

  • 対称式

    こんばんは。 よろしくお願いいたします。 x=2+√5,y=2+√3, z=-(√5+√3)/2のとき、次の式の値を求める問題で質問があります。 1/x^3+1/y^3+1/z^3-3/(xyz) 私は a=1/x, b=1/y c=1/zとおいて、 a^3+b^3+c^3=(a+b+c)(a^2+b^2+c^2-ab-bc-ca)+3abcの法則を使って説いたのですが、解答は[0]らしいので最後に3abcをかけたらおかしいなと思いました。 どういった考えをすればよいでしょうか。 よろしくお願いいたします。

  • 色彩について

    CIE基準で、x=0.28、y=0.52になるとき、赤青緑の3色で作られる白色LEDの 緑色として最適である、 なんて教科書に書いてあったんですが、これはなぜなんでしょうか? というのは、RGB系からCIEへの換算では、 x=0.6R-0.28G-0.32B y=0.2R-0.52G+0.31B という式が使われますが、たしかに、この式から、 RGB系でG=1、R=B=0(グリーンのみ)のときを考えると、 x=0.28 y=0.52 となります。だから、緑色として最適なのか?とは思いますが、しかし x=0.28、y=0.52 になるときは、「G=1、R=B=0」 以外のときでもあるのではないでしょうか?たとえば、y=0.52は、 「G=0、R=1、B=1」 (青と赤が混ざっている) でも、y=0.51 となると思うのです。

  • 数と式  計算問題の解き方・考え方

    数学の問題を解く際、解く人間は天才ではないので、なんらかのとっかかりをもって解きにかかるのが常道だと思っています。 次の問題ついて、解法が全く思い当たらず、解き方を見ても納得がいかないのですが、どのように解き方を検討するのが正しいのでしょうか? x^3+y^3+z^3=3 (1) x+y+z=3 (2) が成立するとき (x+y)(y+z)(z+x) (3)を求めよ ・私の考えた道筋 ----------------- 1.未知数がx,y,zの3つで、与式がx,y,zに関する2つ。他に条件はなし。よって、x,y,zを個別に求めることはできない。(求まったとしても、各々の比まで) 2.与式も、求める式(3)も、対象式の形で成り立っている。そのため、基本対象式さえ分かってしまえば、値を簡単に求めることができる。 3.x,y,zに関する基本対象式は、x+y+z,xy+yz+zx,xyzの3つ。与式はたった2つだし、この3つはどうもうまく求まりそうにないな。最初の一つは分かってるから、どうにか(1)と(2)の変形で残り2つが判明すれば、求める式(3)を基本対象式に変形すれば何とかなりそうだぞ… ----------------- →(1)を変形してから(2)を代入し、 xy+yz+zx=4の値を得ました。  (この時点で、基本対象式の1つが判明して安堵すると同時に、残り一つが分からないため、与式展開がうまくいかない、という予感は抱いています。xyzが判明していません。) 恐る恐る(3)を変形すると、12-xyzというところまで変形できました。案の定、xyzが求まらず、答えを求めるには至りません! --------------------------- この問題の解法はどのようにするのか、と思い、解答を見てみると、 1:(1)(2)を変形して、3(xy+yz+xz)-xyz=8を得る 2:(3)に(2)を代入して変形し、3(xy+yz+xz)-xyzを得る 3:1の結果を2に代入し、解8を得る とありました。 解答の方法は非常に直感的方法であり、ある種のひらめきがないと解けない方法の気がするのですが、問題を一瞥した時点でこの解法にたどりつくには、どのような予測・指針の立て方が考えられるのでしょうか。 ((1)、(2)で基本対象式のうち2つまで求まりそうだ、となった時点で、(3)も対象式だから、(1)、(2)のいずれかと組み合わせることで、基本対象式になりそうだから、その値と、(1)、(2)による基本対象式が等しければよい…というのは、単純に式変形の結果の結果論であり、予測が困難な気がしています。(それとも、この程度の式変形は頭の中で一瞬でするのが常識なのでしょうか? であれば、火星人のような人間しか解けない気がするのですが…)) 是非、類似の問題(あるいは数学分野全体)に通じる考え方で、ご教授願います。

  • エクセル)ファイルを検索し、セルを参照

    Aフォルダ内に入っている複数のファイルがあります。 abc01xyz.xls abc02xyz.xls abc03xyz.xls それぞれのブックのシートX、セルA1にはファイル名にある数字と同じ数字が入っています。 ■質問 abc02xyz.xlsのセルB2に、abc(abc02xyz.xlsのシートX、セルA1の値-1)xyz.xls のシートY、セルB2の値をコピーしたいのですが、どんな関数を使えばよいのでしょうか、いろいろ本をめくったり、インターネットで調べたのですが、なかなか参考になるケースがなくて困っておりまして、どなたか詳しい方、ご指南いただけませんでしょうか・・・。 INDIRECT関数を使うのでしょうか

  • 指数 x、y、z3文字の値

    「x^(xyz)=y^2、y^(xyz+1)=z^3、z^(xyz+2)=x^4を満たす正数x、y、zの値を求めよ。」 この問題に取り組んでいます。3文字もあるので文字を消去したいと思って、3式の辺々をかけたり、対数をとったりしてみたのですが変形がうまくいかなくて消去できないです。 直感でx=y=z=1の時に3式を満たすのはわかるのですが、ほかにもあるかもしれないですし、論理的ではないので・・・ 何かアドバイスやヒント的なものでかまわないので回答よろしくお願いします

  • 高校一年生の数学です。

    (y+z)/x=(z+x)/y=(x+y)/z  (xyzは0ではない) の時、この式の値を求めよ。 上の問題が分かりません。 教えてください。 よろしくお願いします!!

専門家に質問してみよう