zoukankan      html  css  js  c++  java
  • 颜色空间的转换系列 (一) ——RGB2XYZ/LAB

    http://www.wk78.com/forum.php?mod=forumdisplay&fid=2&page=1

    文件在论坛。

    然后需要解决一个问题: 我直接复制过来了,自己看吧。

    本帖最后由 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来做中间层。


                    <ignore_js_op>            
    其中


           <ignore_js_op> 

    <ignore_js_op> InkHin_Cie.rar (20.39 KB, 下载次数: 2) 










     
     
     
       

    1

    主题

    7

    帖子

    44

    积分

    新手上路

    Rank: 1

    积分
    44
    QQ
    沙发
     
      楼主发表于 昨天 23:08 只看该作者
    rgb颜色转换为CIELAB和XYZ颜色模型后可以用来比较颜色的识别相似值,CIE的公式我就不写了,有需要的百度吧。 晚安
     
     
     
     
       

    1

    主题

    7

    帖子

    44

    积分

    新手上路

    Rank: 1

    积分
    44
    QQ
    板凳
     
      楼主发表于 3 小时前 只看该作者
    转换函数有问题,我等一会修正。
     
     
     
     
       

    1

    主题

    7

    帖子

    44

    积分

    新手上路

    Rank: 1

    积分
    44
    QQ
    地板
     
      楼主发表于 半小时前 只看该作者
    本帖最后由 InkHin 于 2019-2-22 21:20 编辑

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


    设以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
  • 相关阅读:
    centos-docker安装及基本使用
    List集合-03.Vector
    List集合-02.LinkedList
    List集合-01.ArrayList
    常用图像处理方法
    git使用
    bug记录
    bash vim等常用命令
    python常用
    MTCNN试用
  • 原文地址:https://www.cnblogs.com/lingqingxue/p/10420919.html
Copyright © 2011-2022 走看看