玩酷之家

 找回密码
 立即注册
查看: 2088|回复: 3

InkHin_颜色空间转换算法

[复制链接]

4

主题

20

帖子

157

积分

注册会员

Rank: 2

积分
157
QQ
发表于 2019-2-21 23:04:21 | 显示全部楼层 |阅读模式
本帖最后由 InkHin 于 2019-2-22 21:33 编辑

—————请注意三楼的回复———————


'需要添加一个常数声明:
Public Const Ne_BinMax As Double = 4294967296#
'然后把三楼的函数复制替换,其他自己改改就能用了。



InkHin_颜色空间转换算法



File{
         RGB2CIELAB  取值范围[0,255]   
         RGB2CIEXYZ  取值范围[0,255]
         举杯邀明月的移位操作对象库
}


公式:
                      RGB2CIEXYZ :


                            [X]        [0.433953    0.376219    0.189828 ]    [R]

                            [Y]     =  [0.212671    0.715160    0.072169 ]    [G]       (3)

                            [Z]        [0.017758    0.109477    0.872765 ]    [B]

                            [R]        [3.0799327   -1.537150   -0.542782]  [X]

                            [G]     =  [-0.921235   1.875992    0.0452442]  [Y]      (4)

                            [B]        [0.0528909  -0.204043  1.1511515  ]   [Z]


                           


                     RGB2CIELAB :


                                                          CIELAB 与 RGB之间没有直接的公式可以转换,所以需要用XYZ来做中间层。


                006164b74314e2fdcdc34ac9d0aa6fe4.jpg            
其中


       e513d25d50d406bfffb6ed3c854bd8a4.jpg

InkHin_Cie.rar (20.39 KB, 下载次数: 780)
细嗅蔷薇。
回复

使用道具 举报

4

主题

20

帖子

157

积分

注册会员

Rank: 2

积分
157
QQ
 楼主| 发表于 2019-2-21 23:08:40 | 显示全部楼层
rgb颜色转换为CIELAB和XYZ颜色模型后可以用来比较颜色的识别相似值,CIE的公式我就不写了,有需要的百度吧。 晚安
细嗅蔷薇。
回复

使用道具 举报

4

主题

20

帖子

157

积分

注册会员

Rank: 2

积分
157
QQ
 楼主| 发表于 2019-2-22 18:33:03 | 显示全部楼层
转换函数有问题,我等一会修正。
细嗅蔷薇。
回复

使用道具 举报

4

主题

20

帖子

157

积分

注册会员

Rank: 2

积分
157
QQ
 楼主| 发表于 2019-2-22 21:18:24 | 显示全部楼层
本帖最后由 InkHin 于 2019-4-16 16:51 编辑

在后面计算使用的时候我发现了一个错误,由于我们的最终取值范围是【0,255】,
即最大值是一个八位的二进制,所以取值上我截取了二进制值的尾部八位。
但是由于LAB的计算是包括负数的,在该公式的运行中,我使用二进制移位来优化计算,
没有考虑到BIN_To_DEC 函数 (二进制转换十进制)进行操作时
将原二进制负数判断为整形4294967295+,导致数据计算出现问题,
解决方法很简单。如下:


设以32位最大值为 (- 1):

                         1111 1111 1111 1111 1111 1111 1111 1111

        十进制(为了直观)  :


                        4294967293 -3

                        4294967294 -2

                        4294967295 -1

                        4294967296     0  

                        4294967297  1
               
                        4294967298  2
                        
                        4294967299  3

                                                     那么正确的值 = Value  - 4294967296

————————                        ——————————

可以将Mid()部分也顺便放进里面BIN_TO_DEC的函数里:
同时,由于A和B的值最后还要加上128 所以 (255 -128) = 127 < 255 ,计算得到的仍旧是一个八位的二进制值。

意味着我们只要从倒数第八位开始往左取四位,判断其是否 = “1111”,就可以筛选其是否为一个负数。


Code :

Public Function BIN_to_DEC(ByVal Bin As String, Optional Mid_Value As Byte = 8) As Currency
'Mid_Value = Mid 's length
Dim i As Long, Length As Long, Ne As Boolean, Value As String
    Length = Len(Bin)
If Mid(Bin, Length - 8 - 3, 4) = "1111" Then
    Value = Mid(Bin, Length - 7, 8)
    Value = "111111111111111111111111" & Value
    Ne = True
Else
    Value = Mid(Bin, Length - (Mid_Value - 1), Mid_Value)
End If
    Length = Len(Value)
For i = 1 To Length
    BIN_to_DEC = BIN_to_DEC * 2 + Val(Mid(Value, i, 1))
Next i
Debug.Print BIN_to_DEC
If Ne = True Then BIN_to_DEC = BIN_to_DEC - Ne_BinMax
End Function

细嗅蔷薇。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|玩酷之家 ( 鄂ICP备14012049号-1 )|

GMT+8, 2020-8-4 16:18 , Processed in 1.107602 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表