石鑫华视觉论坛

 找回密码
 注册会员
查看: 123|回复: 0

[原创] 将颜色U32值转换为RGB分量值LabVIEW实现方法1234567

[复制链接]
  • TA的每日心情
    开心
    前天 10:43
  • 签到天数: 3512 天

    连续签到: 6 天

    [LV.Master]2000FPS

     楼主| 发表于 6 天前 | 显示全部楼层 |阅读模式 来自:广东省东莞市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    将颜色U32值转换为RGB分量值LabVIEW实现方法1234567
    在石鑫华论坛的主题:LabVIEW将表示颜色的U32值转换为RGB对应的分量值LabVIEW实现方式http://visionbbs.com/thread-22940-1-1.html中,实现了一个简单的将U32转换为R、G、B颜色分量的方法。这种方法比较直观,对于新人很好理解。但是有经验的都说太复杂。那么,我们再来看一下,适合老鸟的一些方法。这些方法不止一种,有些比较简单,有些则比较复杂。
    先来看一下运行效果:
    image1.png
    多种U32颜色值转RGB颜色分量的方法运行效果
    image2.png
    多种U32颜色值转RGB颜色分量的方法程序框图
    这里一共使用了7种方法,前面两种方法在之前的帖子里介绍过了。
    方法三,使用拆分数字函数,将U32拆分为2个U16。再次使用拆分数字,将U16拆分为两个U8,这样得到ARGB。这里需要注意一下,LabVIEW Vision里的彩色颜色值,是使用U32来描述的,但是实际上可能只使用了其中的3字节24位,即只有R、G、B三个值,A代表的透明通道,在LabVIEW中一般是没有表现的。如果打开带A通道的png图像,一般是将其表现为纯黑色0值。所以,使用拆分字节函数,是有一个多出来的A通道的U8的,这个值一般都是没有值的(0值)。这里只是为了方便说明,也显示出来了,实际上可以不显示。这种方法反过来时,即得到了R、G、B分量值时,如果想得到颜色值,那么就可以合并数字,在一些使用dll驱动相机的驱动程序中,可能会使用的比较多。因为那些驱动,通常都是获取单通道的颜色平面,然后需要合并为彩色图像。如大恒工业相机的.NET驱动是这样实现的,而Halcon中的彩色图像转换为LabVIEW Vision的Image,也会涉及到这种情况。
    另外需要注意一下,这里的U32的各个颜色分量的组合是按照ARGB的方式来拼接的,透明通道在最高位,A次高位,G次低位,B是最低位的。可能和某些平台的RGBA拼接方式不太一样。
    方法四,使用强制类型转换,将U32数字转换为U8数组,再索引得到ARGB各个分量的值。U32颜色值中的排序是ARGB,感觉A是在高位、R是在次高位。但是转换为数组后,则A在前面、B在最后面,按照内存地址或数组元素索引来看,则A是低位、B是高位的,需要注意一下。方法三和四都是比较简单的一种方法。但是需要对LabVIEW的某些函数的使用方法比较了解。比较拆分数字、强制类型转换其实都是使用比较少的功能函数。
    而后面的方法五、六、七,则都是基于颜色值,然后进行一些计算,从而得到了R、G、B的分量。都是基于U32=256*256*R+256*G+B这个公式来处理的。
    方法五,B直接取U8,G强制转换为U16,再除以256后强制转U8,R直接除以65536,强制转U8。U32颜色值是按照ARGB的顺序将各个颜色分量使用4字节U8拼接成U32,那么将该数据直接转换为U8,就只取最后低一字节的值,则表示了B平面的值。所以,蓝色平面的值是最简单的,直接将U32强制转换为U8即可得到。G则是第二个U8字节,将U32强制转换为U16后,将保留G+B的分量。这时除以256(右移8)后,再强制转换为U8,则是G分量了。这里的G按道理来说,直接除以256就相当于是右移8位,这时再强制转换为U8就可以得到G分量了,但是实际运行时,颜色12345678对应的则G值是255,并不是真实的97。12345678/256=48225.3045875,整数部分48225,二进制是1011 1100 0110 0001,低8位0110 0001则是97。但是将48225.3045875强制转换为U8则为255。但是如果将48225.3045875先强制转换为U16,然后再强制转换为U8,则又可以得到97的正确值:
    image3.png
    方法五的另一种实现方法
    这里主要涉及到不同数据强制转换时的处理方法不一样。使用除法后,结果总是DBL类型的。对于DBL转整形,使用的是饱和处理方式。当结果超出强制转换的整形类型范围时,则只其结果只能是最大值或最小值,U8被强制限制为0~255。而如果使用长字节整形转换为短字节整形,则使用的是直接取其相应的低位字节,U16转U8时,则取低8位。
    方法六,和方法五是比较类似的,B直接强制转换为U8。G右移8位后强制转U8,R右移16位,强制转U8。G的获取则要简单很多了,这里没有使用除法,也就没有DBL浮点型,所以直接右移后仍然是整形,可以直接取低8位。
    方法七,则直接使用颜色值进行计算R=U32/65536;G=(U32-R*65536)/256;B=U32-R*65565-G*256。这里实际上就是最底层的加减乘除实现方法。但是也是最复杂的。
    后面这些34567的方法,都是针对U32数字的组合方式来处理的。直接操作其相应的字节,如果理解了使用方法,则有些方法要简单很多,老鸟首选。如果不是很理解这些方法,那则拆分相应的字符串会更容易明白一些,适合菜鸟。
    LabVIEW 2020版VI:
    游客,如果您要查看本帖隐藏内容请回复
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(24.09)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解2020-2024》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2025-4-14 06:17

    Powered by Discuz! X3.4

    © 2001-2025 Discuz! Team.

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