如果我们将空间中(x,y,z)坐标的涂上对应的(r,g,b)颜色,它就会变成这样:
这就是颜色空间,看这个图我们就能知道肉眼上看上去相近的颜色,实际就是在颜色空间里面距离相近的颜色。半透明实际就是前景色和背景色两种颜色构成的线段上的颜色。两种颜色之间的中垂面分割的颜色空间,就可以二值化这两种颜色构成的图像,等等。这样就把颜色问题转成了立体几何了。k means里所提到的距离,也是这个意思。
如果我们有一张图,这张图上有数字,我们要把这些数字识别出来,怎么做呢?
我们能看出这个东西是有两种颜色构成的,一种是淡黄背景色,一种是青蓝相间,所以我们可以用k means先做聚类(手选两个颜色也行), 然后把图像二值化,一个简单实现如下:
import
现在把这10个数字抠下存成10个字库文件以备用。新出现的数字做二值化,也变成黑白两色,然后和已有的字库做匹配就可以识别出是什么字了。
如何匹配呢?有两个图
当然我们这里只能识别字库中存着的文字,容忍透明度,色偏,噪点,不容忍形变,缩放,字体字号变了就要重做字库。(如果想做不区分字体的通用识别算法,可以使用机器学习,参考OCR的KNN算法,本文不作赘述)
如果背景色不固定,比如动态画面上出现的半透明文字,那怎么办?那就要自己手工标注颜色然后用标注数据做聚类了,具体情况具体分析。
文字的识别基本就是这样,先聚类,再二值化,然后把文字存成字库,然后把画面二值化,然后在里面用字库去做匹配,匹配的方法就是卷积。
一个简单实现如下,screen和image都是黑底白字的二值化图像,函数返回所有在screen中与image区配的位置坐标,误差tolerance为0时严格匹配,默认为0.1。
def
——————————————————————————————
opencv有一个模板匹配教程,
Template Matchingdocs.opencv.org我们用
我们看这个式子,如果
展开有
一个简单实现如下,screen是RGB格式,image是RGBA格式,函数返回所有在screen中与image区配的位置坐标,误差tolerance为0时严格匹配,默认为0.1。
def
——————————————————————————————
判断两张图是不是同一张图,最简单的做法是对两张图不透明的部分求曼哈顿距离,设定阈值即可。
如果要在图库中搜索指定图片,而所有的图的alpha通道都是一样的,这个问题就等价于kd树搜索了,不过由于维度灾难kd树在高维情况下是不实用的。
实践中一般用暴力计算加剪枝优化,因为涉及大量迭代运算,不适合用python实现,这里不给出代码了。
(顺便提一下,用python写算法不慢的前提是将循环都用numpy作矢量加速,如果代码中有大量迭代运算,numpy是无能为力的,注意我写的上述python代码都是没有for循环的)
——————————————————————————————
我们平时存档的声音文件,比如.wav文件,波形图如果画出来实际是这样的
这种数据我们可以对它进行频谱分析,即fft,这样就将原始复杂的声音分离成了各种频率的纯音。
观察音乐播放器,这种跳动的柱状图,实际叫频谱,就是对原始声音进行fft所得。
横轴x是频率也就是高音低音,纵轴y是振幅也就是声音的大小,随着时间轴t的推移,这个频率和振幅分布不断变化,就混成了我们平时听到的声音。
如果我们将频率作为纵轴,时间作为横轴,振幅作为强度,那我们可以将声音绘成一张图,这也就是时频谱。(这张图和原始声音在信息上是等价的)
和波形图不一样,波形图沿时间的变化是极其剧烈的(每秒峰谷往返数千次),它只能用于精确匹配。时频谱沿时间和频率的变化是平滑的,对畸变和噪声的容忍能力要强得多,可以用于精确和模糊匹配。
我们比较两段音频,实际是将两段音频的时频谱进行比较。两段一样的音频,在视觉上时频谱就是一样的。时间上的畸变会表现为横向的平移,音调上的畸变会表现为纵向的平移,音量上的畸变会表现为强度上的变化。
由于两段声音整体上只在t轴,也就是时间轴上有差异,我们依然可以用沿t轴的卷积来匹配。
我们假设有两段音频,
我们用
求两段声音是否匹配就是求上式
这就构成了一个简易的声音匹配算法,容忍音量差异和轻微的畸变。不容忍回声,明显卡顿,多音频同时播放等(比如有背景音乐的情况下检测指定声音)。
注意,此算法要求无背景音,容忍背景音的只能用曼哈顿距离暴力计算,因为涉及大量迭代运算,不适合用python实现,这里不给出代码了。
——————————————————————————————
可能有人会问,上面反复讲到如何将计算过程转换成卷积,汉明距离要转换成卷积,欧氏距离也要转换成卷积,目的何在呢?都有式子了,不能直接算吗?
我们假设两图在内存中占的字节数分别是n和m,且n>m,两图直接匹配的计算复杂度是
——————————————————————————————
凡是2d图标,凡是印刷体文字,凡是可以重放的音频,都是可以100%准确率识别的。
以上内容仅涉及计算机本科专业知识,非科班读者想实现并优化这些算法需自学,学习方法请参考此文:
aniyo:推荐的自学资料zhuanlan.zhihu.com