如何在matlab中实现RGB值与整数值之间的转换?

开始正文之前,讲几句题外话,咱又重新回到了知乎,知乎账号名称与公众号名称一致,都叫巴山学长。知乎账号分享的内容将更加灵活多样,任何想给大家分享的内容都会在知乎上给大家分享,而公众号将侧重于编程内容的分享。尽量不炒冷饭,把公众号的内容搬到知乎,或把知乎内容搬到公众号。此外,公众号将正式启用GitHub作为分享代码的仓库,地址如下:

github.com/bashancode. 今后的懂科学的程序员所属账号所公开分享的代码都将上传至GitHub,也希望有GitHub账号的多多去给bashancode点赞加星。

咱也注意到自从公众号改名以来,这几天的关注量都是负的。在此也再给大家说明一下,公众号仅仅是换了个名称而已,并不存在转让给其他任何第三方运营的事情,咱依旧是matlab爱好者,希望伙伴们能够继续支持“巴山学长”

言归正传,之前的学习中遇到了需要将整数值转换为RGB值的情况,于是就用matlab写了这么一个小脚本,可实现RGB与整数值之间得相互转换(PS: 这种方法可以应用到加密领域哦,其实本质上是一种256进制与十进制的相互转换)。RGB到整数值相对容易些,使用如下公式即可完成转换:

而整数值到RGB的转换则需要一点小技巧,从公式(1)中不难看出,整数DEC若对256求余,则可直接得到B,即有:

由(2)求出B之后,此时将DECB的差值作为整体来看待,则有:

可以看出,将(3)式两边同时除以256,则变成与(1)类似的式子,即:

让(4)左边对256求余即可得出G,如下:

现已知DECB以及G,由(1)式即可得出R的值,即:

本文给出rgb2dec的源代码,完整源代码请点击左下角阅读原文到咱的GitHub仓库下载:

function rgb = dec2rgb(dec)


%{
    Features: Converting decimal integers to rgb values.


    Formula 1: dec = 256^2*R + 256*G + B;
    ⟹ B = dec mod 256
       C−B = 256^2*R+256*G
    ⟹ (C−B)/256 = 256R+G
    ⟹ G ≡ (C−B)/256 mod 256
    
    And then:
       (C−B)/256−G = 256*R
    ⟹ R = (C−B)/256^2 − G/256.


    Input: decimal integers
    Output: rgb values.
    
    Ref.: https://math.stackexchange.com/questions/1635999/algorithm-to-convert-integer-to-3-variables-rgb
    Online tool: https://www.checkyourmath.com/convert/color/rgb_decimal.php


    Author(作者): 巴山(bashan)
    WeChat Official Account(微信公众号): 懂科学的程序员(ScientificProgrammer)
    Github: https://github.com/ScientificProgrammerOwner
    ZhiHu(知乎): https://www.zhihu.com/people/67-93-61-26-8
    BiliBili(B站): https://space.bilibili.com/205153905


    Welcome to subscribe! 欢迎订阅!
%}


try
    validateattributes(dec,{'numeric'},{'row','>=',0,'<=',16777215,'integer'});
catch
    validateattributes(dec,{'numeric'},{'column','>=',0,'<=',16777215,'integer'});
end


rgb(:,3) = mod(dec,256);                              % B
rgb(:,2) = mod(fix((dec-rgb(3))/256),256);            % G
rgb(:,1) = fix((dec-rgb(3))/65536) - fix(rgb(2)/256); % R

以下是相应的转换示例:

例1:多组rgb转整数值

rgb2 = [1 2 3;4 5 6;7 8 9;10 11 12];
dec2 = rgb2dec(rgb2)
dec2 =
       66051
      263430
      460809
      658188

例2:多组单R/G/B转整数值

R2 = [1 4 7 10];
G2 = [2 5 8 11];
B2 = [3 6 9 12];
dec4 = rgb2dec(R2,G2,B2)
dec4 =
       66051      263430      460809      658188

例3:多组整数转RGB值

dec6 = [66051 263430 460809 658188];
rgb2 = dec2rgb(dec6)
rgb2 =
     1     2     3
     4     5     6
     7     8     9
    10    11    12

当然,如果伙伴想用在线版,可访问checkyourmath提供的在线转换工具,链接如下:checkyourmath.com/convert/color/rgb_decimal.php.

若有问题,欢迎留言讨论!关注支持一下也不错哦!

特别鸣谢:本文采用ciaochaos开发的mpMath工具插入公式,在此对作者的辛勤付出深表感谢!(链接: github.com/ciaochaos/mpMath)

参考资料:

[1] math.stackexchange.com/questions/1635999/algorithm-to-convert-integer-to-3-variables-rgb

如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值