こんばんは、最近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
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
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
ですか?数学的記述をするのではなく、プログラミング的記述で質問を行ってください。
>対応するセル
対応の法則がわかりません。
この回答への補足
すみません、補足します。
すべて色を表す表色系のことです。
画像処理をやってます。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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
RGB値をL*a*b*に変換したい
その他(プログラミング・Web制作)
-
Excelでセルに入力されたカラーコードを背景色にしたいです。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
同じ作業を複数のシートに実行...
-
【Excel VBA】Worksheets().Act...
-
XL:BeforeDoubleClickが動かない
-
特定の文字を含むシートだけマ...
-
Worksheet_Changeの内容を標準...
-
実行時エラー'1004': WorkSheet...
-
【ExcelVBA】全シートのセルの...
-
IFステートの中にWithステート...
-
エクセルで通し番号を入れてチ...
-
ブック名、シート名を他のモジ...
-
別のシートから値を取得するとき
-
エクセルの特定のシートのみを...
-
Excelマクロのエラーを解決した...
-
エクセル・マクロ シートの非...
-
エクセルVBA Ifでシート名が合...
-
ExcelVBA:複数の特定のグラフ...
-
【VBAで、On Error が効かない】
-
セルの値によって、シート見出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
excelのマクロで該当処理できな...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
別のシートから値を取得するとき
-
ブック名、シート名を他のモジ...
-
実行時エラー'1004': WorkSheet...
-
Excelマクロのエラーを解決した...
-
XL:BeforeDoubleClickが動かない
-
シートが保護されている状態で...
-
エクセルのシート名変更で重複...
-
実行時エラー1004「Select メソ...
-
VBAで同じシート名のコピー時は...
-
エクセルで通し番号を入れてチ...
-
同じ作業を複数のシートに実行...
-
Excel VBA リンク先をシート...
-
ExcelのVBAのマクロで他のシー...
-
Vba UserformからExcelシートの...
-
【Excel VBA】Worksheets().Act...
-
VBA 存在しないシートを選...
おすすめ情報