こんばんは、最近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

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0

質問の意味が全く理解できてません。



>そのあと、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
ですか?数学的記述をするのではなく、プログラミング的記述で質問を行ってください。

>対応するセル
対応の法則がわかりません。

この回答への補足

すみません、補足します。
すべて色を表す表色系のことです。
画像処理をやってます。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までの整数です。
いかがでしょうか?

補足日時:2001/12/17 11:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q4桁の数字を A*1000+B*100+C*10+D 以外で表現したい。

A=1
B=2
C=3
D=4

のとき 
1234をA*1000+B*100+C*10+D以外で表現したいのですが
何かいい方法がないでしょうか?
4桁ならいいんですが
15、6桁を10行ぐらいコーディングしないといけないのでなえてます↓助けてください。

Aベストアンサー

No.4です。

VB2005でも問題なくできますよ。実際に確認済みです。

Dim A As Integer = 1
Dim B As Integer = 2
Dim C As Integer = 3
Dim D As Integer = 4
Dim E As integer

E = (A & B & C & D) * 1
MsgBox(E)

これで試してください。

Q算術記号(+,-,/,*)を文字としてあらわして計算に使用する方法

ビジュアルベーシック初心者です。
タイトルでは誤解をうむと思いますが、やりたいことは以下のようなことです。

kigouという変数をstringsで宣言しそこに文字として算術記号を代入する。  例 kigou = "+"

このkigou変数を用いて、実際の計算をする。
例 i = 1 kigou 2
この場合、kigou変数には+が代入されているので、iの値は3になる。

このように、kigouに入れる算術記号を任意にかえ、kigouという変数を用いて実際の計算をさせたいのですが、正しい記述方法などがわかりません。方法はありますか?

Aベストアンサー

#3です。
プログラムは、どれだけ多く使われるかによって、作るのにどれだけ手間をかけてもよいか、が決まるものです。例えば、それだけの需要があれば、次のようなプログラムを作っても採算がとれるはずです。

例えば、
keisan (2, +, 3) よりも一歩進めて、keisan ("(2 + 3) * 4") の値が 20 となるような function keisan を作ることは可能です。中級者以上の練習問題に適していると思います。

Q1+(1+2)+(1+2+3)....+(1+2+...+N)の計算式をVBで・・

表すにはどうしたらいいでしょうか。
もう3時間くらい格闘しているのですが、
答えを出せません。

Dim S AS LONG
DIm N As Integer

Dim i As Integer
N = Val(TextBox1.Text)

S = 0
i = 1

For i = 1 To N Step 1
S = S + i

Next

Label4.Text = Format(S, "#,##0")

で、1+2+3+...+Nはいけるのですが、
上記の式は、Nが1づつ増えていくにしたがって、
Sの値が1 4 10 20 ...となっていくために、…。

どなたか、回答していただける方がおりましたら、
非常に助かります。
よろしくお願いいたします。。

Aベストアンサー

  Dim total    As Long
  Dim index    As Integer
  Dim index2   As Integer
  Const MAX_VALUE As Integer = 3
  '
  total = 0
  For index = 1 To MAX_VALUE
    For index2 = 1 To index
      total = total + index2
    Next index2
  Next index
  '
  MsgBox (total)
------------------------
こんなカンジでしょうか。

QIf myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou こちらについて教えていただきたいです。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, i + 24) = myTorikomibi
Next i
マクロを編集しようとしましたところこちらが解読できづに困っています。
こちらだけとりだして実行しながら解読していますが混乱してしまっています。ご存知の方いらっしゃいましたら教えてください。Then以降がわかりません。よろしくお願いいたします。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells...続きを読む

Aベストアンサー

こんにちは。maruru01です。

ヘルプはご覧になりましたか?
特に、Cellsについて。
Cellsは、

Cells(行番号, 列番号)

で、セルを参照します。
なので、各条件の時に、変数「myTantou」や「myTorikomibi」に格納されている値をそれらのセルに代入しているだけですが。
ただし、行番号が、

「myPrefNO + 3 - 47」
「myPrefNO + 3 - 47 - myCityNu」

などとちょっとややこしくなっていますが。
これも、変数「myPrefNO」「myCityNu」に入っている値から行番号が決まるというだけです。
例えば、
myPrefNO=60
myCityNu=2
なら、下の例は、
60+3-47-2=14
で、14行目となるということです。

Q正規表現のパターン " [^<]*?>"

正規表現のパターンの
" [^<]*?>"
これはどういう意味なのでしょうか?

Aベストアンサー

*: 最長一致
*?: 最短一致
*+: 後戻りしない最長一致
というようなバリエーションが、あります。
* に対してと同じように、?、{m,n} にも同じバリエーションがあります。


人気Q&Aランキング

おすすめ情報