「知识盲区」按键精灵找图、多点找色、找字的原理(续)
大家好,我是公众号3分钟学堂的郭立员,今天给带来一期基础知识的文章,主要讲一下找图、多点找色、找字之间的联系与区别,这是一篇基础原理的教程,可能会有些枯燥。
由于篇幅比较长,分两期更新,这是第二期,本期主要讲图色命令相似度参数的原理以及多点找色和找字的原理,如果没看过第一期,可以先看昨天的文章。
相似度
上期文章,我们讲完了找图命令的偏色这个参数的原理,这期我们来说说相似度这个参数的原理。
关于相似度可能很多朋友会有一些误区,比如拿找图参数中默认的0.9相似度来说:
【误区一】假设找的图是10*10的图片,一共100个像素点,如果相似度是0.9,那么就是90%相似,100个点中有至少90个点一样,就认为是符合要求的图。
【误区二】假设要找的颜色点是646464,为啥是这个颜色,因为它换算成10进制以后,蓝色、绿色、红色就是100,100,100。如果相似度是0.9,那么每个颜色符合要求的就是90~110。
以上两个都是误区,那么相似度到底是怎么计算呢?
还是以相似度0.9为例,那么容差的范围就是±10%,这个10%是针对于颜色的色阶(256个等级)的。
计算公式:256*10%=25.6
这是一个颜色的,蓝绿红一共3个颜色分量,所以容差就是25.6*3=76.8
得到容差值以后,我们怎么算出颜色值的有效范围呢?
还是以646464这颜色为例,76.8这个差值怎么分呢?可以单独给蓝色,那么100+76.8=176(结果取整数部分),100-76.8=23(结果取整数部分),颜色的范围就是176464~B06464。同样的道理绿色和红色也是这样计算。
除了给单一颜色分量以外,还可以把76.8分给每一个分量,比如均分每一个颜色分量就是±25.6的。当然随意分也可以。
说到随意分,可不可以这样,比如给蓝色100,给红色-30,两个加起来是70,也在76.8这个容差范围内,这样写行不行?
答案是不行,我们说的±指的是变化趋势,3个颜色分量相加是绝对值相加,那么给蓝色100,给红色-30的结果是100+负30的绝对值,也就是130,已经超出了76.8的容差范围。
那么相似度是0.9时,有效容差范围是蓝绿红3色变化数值的绝对值相加在76.8这个范围内,就是符合要求的颜色。
总结一下,相似度的容差范围计算公式:
容差值=256*(1-相似度)*3
有效颜色:(蓝色变化量+绿色色变化量+红色变化量)<=容差值
多点找色的原理
多点找色我们还是以上一期的马里奥那张图片为例:
无论是找图也好,还是多点找色也好,其实它们都是找一个符合要求颜色点的坐标。
这句话什么意思呢?这句话重点是“找一个点坐标”,上一期我们找图其实就是找序号1那个颜色点的位置,找到和序号1相同颜色的像素点以后,再判断后面15个点,从而得到序号1的像素点坐标。
多点找色要找的那个点相对于找图就比较“随意”了,找图只能找序号1的点,而多点找色就没有这个限制了,上图中1-16号点,都可以当做找色点。
多点找色的原理:
它也是在找色范围内,逐一匹配要得到坐标那个点的颜色,如果匹配到了,接下来和找图不同,找图只能是2-16号点依次比对颜色是否相同。而多点找色的匹配规则是可以自己写。
比如上图,要获取坐标的点可以不是1号点,可以是任意点,我们以7号点为例,规则可以是这样:
7号点上一行左侧移1点和2号点是不是一样;
7号点上一行右侧移1点和4号点是不是一样;
7号点下一行左侧移2点和9号点是不是一样;
7号点下一行右侧移1点和12号点是不是一样;
7号点下二行左侧移1点和14号点是不是一样;
如果上面5个条件都满足,那么和7号点匹配一致的点,就是我们要的点,它的位置就是多点找色命令返回的坐标。
如果不满足5个条件之一,就要继续匹配7号点,循环上面的过程。
多点找色和找图的优缺点
本质上说找图命令就是多点找色的一种特殊情况,它匹配规则是矩阵式逐个匹配,就如例子中一样,需要把16个点都匹配一致。
多点找色写规则的时候也可以按照这种矩阵式匹配,那就和找图一样了。
当然我们多点找色通常是匹配几个点就行。
【优点】
多点找色由于匹配的点相较于找图少很多,所以匹配耗时也就少很多,所以多点找色要比找图速度快。
上一期有人问怎么找透明图,其实多点找色就是透明图,你可以看例子,白色部分都是不需要匹配的地方相当于图片的镂空,这也是它的优点。
【缺点】
多点找色由于找点比较少,存在误找的情况,比如要找色区域中有两块颜色相近的地方,如果多点找色选择的点正好是两个地方都有的,就会造成找色错误。
所以在用多点找色的时候,选颜色点不要太随意,尽量找具有唯一代表性的颜色,防止误找色,而且选点数量也不能太少。
找字的原理
关于找字命令的详细教程,我在基础课21课已经讲过了,它的原理和找图是一样的。
区别在于哪里,找图是全色系的匹配,找色是黑白二值化的匹配。
具体是什么意思呢?
找图的时候,我们是获取颜色点信息,然后和我们要找颜色比较是不是一样。
找字的时候,我们要先把当前要匹配像素点的颜色转成黑或者白,然后进行颜色匹配,这个相对于多了一个步骤,由于一张图有大量的像素点需要匹配,这也是为啥找字命令比找图命令慢很多的原因。
这里简单说一下黑白二值化的原理,在做字库的时候,会取一个颜色值,这个值作为基准颜色,会用白色表示,然后其它和这个颜色不一样的都用黑色表示,从而实现了黑白二值化。
考虑到一个找字的颜色可能存在细微差别,会把基准颜色+偏色,这样基准色就变成了一个范围色,使字体结构更加饱满。
关于找字这部分就说一下原理,具体操作部分就不说了,感兴趣的朋友可以看一下我的基础课第21课。