数字图像处理怎么讲yiq空间变成rgb空间_颜色空间,二值化,模板匹配,声音,卷积...

如果我们将空间中(x,y,z)坐标的涂上对应的(r,g,b)颜色,它就会变成这样:

3337f1077ddf9d961b71498ae4678c84.png

这就是颜色空间,看这个图我们就能知道肉眼上看上去相近的颜色,实际就是在颜色空间里面距离相近的颜色。半透明实际就是前景色和背景色两种颜色构成的线段上的颜色。两种颜色之间的中垂面分割的颜色空间,就可以二值化这两种颜色构成的图像,等等。这样就把颜色问题转成了立体几何了。k means里所提到的距离,也是这个意思。

如果我们有一张图,这张图上有数字,我们要把这些数字识别出来,怎么做呢?

a37e6f63bf5429b81bc28e2e42079df0.png

我们能看出这个东西是有两种颜色构成的,一种是淡黄背景色,一种是青蓝相间,所以我们可以用k means先做聚类(手选两个颜色也行), 然后把图像二值化,一个简单实现如下:

import 

8d6c20ffd3c8827e4b5d2ce14890545a.png

现在把这10个数字抠下存成10个字库文件以备用。新出现的数字做二值化,也变成黑白两色,然后和已有的字库做匹配就可以识别出是什么字了。

如何匹配呢?有两个图

,都由bool值组成,那么直接做异或操作
再求和,就得出两图的汉明距离。现在我们需要对每个可能匹配的位置都求汉明距离,也就是逐像素平移并做异或操作,如何做呢?bool数组的异或操作可以转换成乘积,
,那么全图逐像素平移异或操作,这里就能转换成卷积(卷积有翻转过程,方便起见以下代码都使用互相关correlate而不是卷积convolution来实现)。

当然我们这里只能识别字库中存着的文字,容忍透明度,色偏,噪点,不容忍形变,缩放,字体字号变了就要重做字库。(如果想做不区分字体的通用识别算法,可以使用机器学习,参考OCR的KNN算法,本文不作赘述)

如果背景色不固定,比如动态画面上出现的半透明文字,那怎么办?那就要自己手工标注颜色然后用标注数据做聚类了,具体情况具体分析。

文字的识别基本就是这样,先聚类,再二值化,然后把文字存成字库,然后把画面二值化,然后在里面用字库去做匹配,匹配的方法就是卷积。

一个简单实现如下,screen和image都是黑底白字的二值化图像,函数返回所有在screen中与image区配的位置坐标,误差tolerance为0时严格匹配,默认为0.1。

def 

——————————————————————————————

opencv有一个模板匹配教程,

Template Matching​docs.opencv.org
5f19a8ced703cbba242a6ab992ae5c50.png

我们用

描述图像
图像
处的差异。

我们看这个式子,如果

这意味着什么?意味着
严格等于
,也就是说我们找到了
的位置,它就是
,当然很多时候不会是严格等于0,只会是小于一个阈值,所以找全局最小值,然后看这个最小值是不是小于预设阈值。

展开有

,第一项是
自乘后的总和,第二项是
自乘后和
的alpha通道的卷积,第三项是
的卷积乘2,所以匹配图像的问题就完全转化成了卷积运算,这就是模板匹配的数学原理。这个算法同样是容忍透明度,色偏,噪点,不容忍形变,缩放的,必须逐像素匹配。

一个简单实现如下,screen是RGB格式,image是RGBA格式,函数返回所有在screen中与image区配的位置坐标,误差tolerance为0时严格匹配,默认为0.1。

def 

——————————————————————————————

判断两张图是不是同一张图,最简单的做法是对两张图不透明的部分求曼哈顿距离,设定阈值即可。

如果要在图库中搜索指定图片,而所有的图的alpha通道都是一样的,这个问题就等价于kd树搜索了,不过由于维度灾难kd树在高维情况下是不实用的。

实践中一般用暴力计算加剪枝优化,因为涉及大量迭代运算,不适合用python实现,这里不给出代码了。

(顺便提一下,用python写算法不慢的前提是将循环都用numpy作矢量加速,如果代码中有大量迭代运算,numpy是无能为力的,注意我写的上述python代码都是没有for循环的)

——————————————————————————————

我们平时存档的声音文件,比如.wav文件,波形图如果画出来实际是这样的

4dcc1d8389a50508ba958c77babb92f8.png

这种数据我们可以对它进行频谱分析,即fft,这样就将原始复杂的声音分离成了各种频率的纯音。

观察音乐播放器,这种跳动的柱状图,实际叫频谱,就是对原始声音进行fft所得。

6183310ee4b77d77c3b43e9036253190.png

横轴x是频率也就是高音低音,纵轴y是振幅也就是声音的大小,随着时间轴t的推移,这个频率和振幅分布不断变化,就混成了我们平时听到的声音。

如果我们将频率作为纵轴,时间作为横轴,振幅作为强度,那我们可以将声音绘成一张图,这也就是时频谱。(这张图和原始声音在信息上是等价的)

96cfc2a1a2fdd36bf03f6d9fa1364cd4.png

和波形图不一样,波形图沿时间的变化是极其剧烈的(每秒峰谷往返数千次),它只能用于精确匹配。时频谱沿时间和频率的变化是平滑的,对畸变和噪声的容忍能力要强得多,可以用于精确和模糊匹配。

我们比较两段音频,实际是将两段音频的时频谱进行比较。两段一样的音频,在视觉上时频谱就是一样的。时间上的畸变会表现为横向的平移,音调上的畸变会表现为纵向的平移,音量上的畸变会表现为强度上的变化。

由于两段声音整体上只在t轴,也就是时间轴上有差异,我们依然可以用沿t轴的卷积来匹配。

我们假设有两段音频,

是预录制的声音的频谱,
是实时声音的频谱,分别表述为
,考虑到两段音频振幅可能不一样,均已做过归一化处理。

我们用

描述音频
音频
处的差异。

求两段声音是否匹配就是求上式

的全局最小值是否小于某个预设阈值,小于阈值就匹配,大于阈值就不匹配。实现方法和上面类似,展开后转化为卷积再运算。

这就构成了一个简易的声音匹配算法,容忍音量差异和轻微的畸变。不容忍回声,明显卡顿,多音频同时播放等(比如有背景音乐的情况下检测指定声音)。

注意,此算法要求无背景音,容忍背景音的只能用曼哈顿距离暴力计算,因为涉及大量迭代运算,不适合用python实现,这里不给出代码了。

——————————————————————————————

可能有人会问,上面反复讲到如何将计算过程转换成卷积,汉明距离要转换成卷积,欧氏距离也要转换成卷积,目的何在呢?都有式子了,不能直接算吗?

我们假设两图在内存中占的字节数分别是n和m,且n>m,两图直接匹配的计算复杂度是

,做一次匹配需要几分钟到几小时左右,基本不可用。而卷积可以通过fft加速,复杂度是
,只需要几毫秒到几百毫秒,可以做到实时匹配。(特意选欧氏距离也是因为欧氏距离能转化为卷积,如果使用曼哈顿距离这里就无能为力了)

——————————————————————————————

凡是2d图标,凡是印刷体文字,凡是可以重放的音频,都是可以100%准确率识别的。

以上内容仅涉及计算机本科专业知识,非科班读者想实现并优化这些算法需自学,学习方法请参考此文:

aniyo:推荐的自学资料​zhuanlan.zhihu.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值