python数字图像处理、色彩空间类型转换_颜色空间的转换系列 (一) ——RGB2XYZ/LAB...

本文介绍了在Python数字图像处理中,从RGB转换到XYZ/LAB色彩空间时遇到的计算错误,特别是涉及到负数处理的问题。通过分析问题根源,提出了解决方案,即在二进制转换十进制时考虑负数,并在计算A和B值时正确处理负数边界,确保结果的准确性。
摘要由CSDN通过智能技术生成

本帖最后由 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值