N维码算法的探索(二),16色的16进制编码表达汉字的试探

前些天写了一篇《N维码算法的探索》,是利用颜色像素对n维码算法扩展的思考。读者非常有限,能够理解的可能需专业人士了。

这种研究的意义何在?不知道。用上了就是有用,用不上也就被历史淘汰了。普通人通常的逻辑是:既然有二维码用着,想太多就是别人的事情。

最近几年学编程,涉及的算法往往都是国外的,一堆外国人名字。而国内的往往是想办法找毛病、补bug,就算发展了。那么这样下去,只能跟在别人屁股后面跑。未来AI的比拼,最终的决胜在于算法的领先。

因此这种“没用”的研究和探索还是有意义的。成功的算法,是一堆失败的算法中脱颖而出的,笔者也就先凑个数。错误的雷达图数理不也用了几十年了,不差再多点算法。

四色问题

不研究,肯定没问题;一研究,就一堆问题了。

四色问题又称四色猜想,是世界近代三大数学难题之一。四色问题的内容是:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”用数学语言表示,即“将平面任意地细分为不相重迭的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。”

这问题也是数学都头疼的问题,据说人工证明尚未解决,但是电脑利用穷举法已经证明。也就是四色问题,现在可以当四色定理用了。

考虑n维码,那么先从简单的研究起,先搞4色的四维码试一试。前文已经说明,四色采用“白红绿蓝”这四种最容易识别的四纯色,而像素采用16进制的四像素的二进制表达方式。(这部分在我这已经过期,不再论述,下文将直接表达16色结果。)

既然中国的太空仓已经使用汉字标识,那么笔者也直接用中文说明。

unicode16进制编码

先看看16进制编码的结果,再看研究过程和出现的问题。
中文:

水调歌头
宋朝苏轼
丙辰中秋,欢饮达旦,大醉,作此篇,兼怀子由。
明月几时有,把酒问青天。
不知天上宫阙,今夕是何年。
我欲乘风归去,又恐琼楼玉宇,高处不胜寒。
起舞弄清影,何似在人间。
转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
人有悲欢离合,月有阴晴圆缺,此事古难全。
但愿人长久,千里共婵娟。

16进制unicode编码显示结果:
\u6c34\u8c03\u6b4c\u5934

\u5b8b\u671d\u82cf\u8f7c

\u4e19\u8fb0\u4e2d\u79cb\uff0c\u6b22\u996e\u8fbe\u65e6\uff0c\u5927\u9189\uff0c\u4f5c\u6b64\u7bc7\uff0c\u517c\u6000\u5b50\u7531\u3002

\u660e\u6708\u51e0\u65f6\u6709\uff0c\u628a\u9152\u95ee\u9752\u5929\u3002

\u4e0d\u77e5\u5929\u4e0a\u5bab\u9619\uff0c\u4eca\u5915\u662f\u4f55\u5e74\u3002

\u6211\u6b32\u4e58\u98ce\u5f52\u53bb\uff0c\u53c8\u6050\u743c\u697c\u7389\u5b87\uff0c\u9ad8\u5904\u4e0d\u80dc\u5bd2\u3002

\u8d77\u821e\u5f04\u6e05\u5f71\uff0c\u4f55\u4f3c\u5728\u4eba\u95f4\u3002

\u8f6c\u6731\u9601\uff0c\u4f4e\u7eee\u6237\uff0c\u7167\u65e0\u7720\u3002

\u4e0d\u5e94\u6709\u6068\uff0c\u4f55\u4e8b\u957f\u5411\u522b\u65f6\u5706\uff1f

\u4eba\u6709\u60b2\u6b22\u79bb\u5408\uff0c\u6708\u6709\u9634\u6674\u5706\u7f3a\uff0c\u6b64\u4e8b\u53e4\u96be\u5168\u3002

\u4f46\u613f\u4eba\u957f\u4e45\uff0c\u5343\u91cc\u5171\u5a75\u5a1f\u3002

我们可以发现,每个汉字前面都有个\u,这是unicode编码汉字显示的特征。汉字在其中占用4个16进制字符空间,也就是这个编码库中汉字有256*256=65536,通常我们只会用到3000-5000个汉字。也就是够用了。

去掉\u的16进制编码显示:

6c348c036b4c5934

5b8b671d82cf8f7c

4e198fb04e2d79cbff0c6b22996e8fbe65e6ff0c59279189ff0c4f5c6b647bc7ff0c517c60005b5075313002

660e670851e065f66709ff0c628a915295ee975259293002

4e0d77e559294e0a5bab9619ff0c4eca5915662f4f555e743002

62116b324e5898ce5f5253bbff0c53c86050743c697c73895b87ff0c9ad859044e0d80dc5bd23002

8d77821e5f046e055f71ff0c4f554f3c57284eba95f43002

8f6c67319601ff0c4f4e7eee6237ff0c716765e077203002

4e0d5e9467096068ff0c4f554e8b957f5411522b65f65706ff1f

4eba670960b26b2279bb5408ff0c670867099634667457067f3aff0c6b644e8b53e496be51683002

4f46613f4eba957f4e45ff0c534391cc51715a755a1f3002

这会给人一个字的感觉,“乱”。但是电脑并不这么认为,它认为:这是分毫不差的正确。

16色编码颜色的定义
颜色与16进制数字对应
这是颜色对应16进制数字的图。颜色可以更改,主要要求就是色差要大,易识别,不易混淆。这为后续rgb颜色的识别编程做准备。

其中的16进制的2与A的颜色,在这个图中色差较大,但在实际使用中,易混淆,笔者将A的rgb值修改了。另外,5与D的色差也较小,这个问题留着,以表达问题。读者可以自行修改其rgb值。当然,修改的原则,重点是考虑后续识别rgb颜色过程中编程的简洁性与准确性、容错性。

有色像素反向识别的技术问题

利用python,现在可对任意一像素点进行rgb颜色的反向识别,但是,由于污损、破坏、或者亮度等因素,识别的rgb结果的参数会有小误差。而上述方法的使用,要求100%的反向识别准确率。

那么采用的算法策略就是:主动增加30的像素识别误差。当识别值在255-225之间时,就确定其为255;当识别值在97-157之间时,就确定其为127;当识别值为30-0之间,就确定其为0。

这也是笔者在选择颜色的时候,特别注意rgb参数的极限意义的原因。个别颜色不具有上述特征,如上文刚刚说到的改动的A,要单独识别处理。因此,改变颜色参数,要特别注意上述要求。

下面是修改后的rgb编码:

0,rgb(0,0,0),linethick5;//0

1,rgb(0,0,255),linethick5;//1

2,rgb(0,255,0),linethick5;//2

3,rgb(0,255,255),linethick5;//3

4,rgb(255,0,0),linethick5;//4

5,rgb(255,0,255),linethick5;//5

6,rgb(255,255,0),linethick5;//6

7,rgb(255,255,255),linethick5;//7

10,rgb(255,127,0),linethick5;//8

12,rgb(127,255,127),linethick5;//9

11,rgb(0,87,55),linethick5;//A,已修改为墨绿色

13,rgb(0,127,127),linethick5;//B

14,rgb(127,0,255),linethick5;//C

15,rgb(255,127,255),linethick5;//D

16,rgb(127,127,0),linethick5;//E

17,rgb(127,127,127),linethick5;//F

这里主要引入了0、255之间的中间值127。如果仅仅使用0、255编码,将只有23=8种颜色组合;增加了127,会有33=27种组合,选择其中色彩易识别的8种,修改了一种。

这样,任何一个16进制的编码都有一个对应的显示颜色。

现在假设用像素的方式,用类似二维码的方式显示汉字:(从左向右显示,这是现在中文书写习惯方向。)

汉字16进制编码与颜色对应示意图
汉字16进制编码利用颜色的实际显示结果

上图为了显示过程,保留了像素块中的16进制数字,而下图,去掉了数字,电脑用不着。这就是利用这种16进制像素块方法显示汉字的最终结果。

青埂峰上的一块大石头刻上这种有颜色的像素块,刻出《石头记》,因此是有可行性的。而这个全过程,只需输入汉字,彩色像素结果就出来了。想读的时候,反向识别就可以了。

这种16进制像素表达方式的优缺点:

1、如果颜色进一步增多,例如64、256种颜色甚至更多,能够起到一定的压缩作用。(但是,要考虑识别的时候容易出错。)

2、如果仅仅采用主色(rgb值0、255相关的八种颜色),有利于反向识别过程中的纠错判断。但是,像素块使用数量会比这种方法增加一倍。

3、整个书写过程以及反向识别过程可编程实现,功能等同于二维码或信息码之类的。

4、颜色编码具有随意性,可个性修改;只有定为标准,才可通用。

一些算法,谁制定了编码标准,就相当于拿到了技术的话语权,笔者搞不定这种事情,只说明算法原理的过程。就像64进制编码,外国采用26个字母大小写再加上几个符号,来解决问题,看着很不爽。因为这些字符和符号的编码在基础的ascii编码库中,占用内存最小。如果用64卦编码64进制,会非常直观好看。前提是需要把64卦弄到ascii编码库中。因此,制定标准是技术话语权的关键。有时候,并不是已经成为标准的编码就是最优秀的,但前提是这标准被技术性的广泛认可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值