我写这个题目,是为了吸引你进来,如果你进来了,ok太好了,:),不过应该不会失望
其实这个项目也是我自己想的,觉得还挺有意思,有缘指数,并没有一个确切的定义,于是我把两个人的相似指数定义为有缘指数,那么也不算骗你进来了。
在上篇**中
https://bbs.21ic.com/forum.php?mo ... peid%26typeid%3D350
我写了sobel滤波的原理和实现。通过图像与模板的卷积来实现,模板是微分运算的简化形式。
那么我们便可以实现很多不同的花样,应为最后都可以化为模板卷积的形式
具体可以看看效果
https://bbs.21ic.com/icview-1242440-1-1.html
在我原本的计划中,我是想实现一个基本的ps,在469上拥有基本的ps功能,应该说滤镜图片处理功能。
但是有一些算法过于复杂,时间的消耗上,更多的是469的内存上不足以让我实现,也就暂时放弃了,以后可能会尽量实现出来
扯了辣么多,还没有到正题,今天的主题是有缘指数
如果做的更远一点就是配对指数,在人群中寻找跟你更有缘的人,pc上搭建服务器,469访问。
不过先做最简单的办,判断两个是否有缘(相似)。
按照正常的步骤,需要首先对 图片进行人脸检测,取出图片的背景部分,但是受制于内存,哪怕实现adaboost也不是那么容易,而且也偏离了主题,也想过用最最简单的颜色空间的方式检测人脸,效率不高,计算也蛮复杂,469主频又不算高,想了想,省掉这一步吧,主要是懒,哈哈。
有缘指纹检测
图片那么大,像素个数辣么多,不可能按照捉个捉个像素的方式来比较,因此需要对图片进行降维,提取出能够代码图片的少量数据,可能pca是最常见的方法,公式很多,很数学,但是要在单片机上实现,悬
因此我找到一种更简单的方式,hash指纹
更复杂的原理,我就省略了,可参考一下博文【1】【2】【3】,
为了一切从简,我选中了基于低频的均值哈希
对于一种图片而言,可看成f(x,y)二维函数,包含了不同成分的频率,变化剧烈的高频分量,变化平滑的低频分量。高频描述了图片的细节,低频可以得到图片的整体样式。
而刚好,图片的整体框架便可以得到利用,就像平时我们去观察某个东西,可能会说,虽然细节不像,但整体看起来还挺像的。
对图片进行下采样,即缩小图像,就是损失高频细节,提取低频框架的过程。
于是通过以下步骤,便得到64bit的hash指纹
1、缩小图像尺寸
将图像缩放到8*8,不仅减少了数据量而且去除了高频成分,留下低频分量,并且相当于将不同尺度的图片归一化到同一尺寸,减少图片大小的影响一举多得。
2、转成gray图像
彩色图像不仅数据量大,而且也没有必要。
3、计算灰度平均值
将图片8*8 共64个像素求和,然后求平均
4、比较灰度大小
对每一个像素,如果灰度值大于平均值,记为1,否则为0.事实上这里可以实现不同的加权系数,比如高斯加权等等。
5、得出hash指纹
上一步,经过比较后,可以得到1,1,0,0,1.。。。。。。将64个1,0的数组合成一个64bit的整数,这就是图片的表示了,hash指纹。如何对指纹进行组合并不重要,因为我们并不需要也不会去比较这个数的大小,只是比较其中1,0的个数差异。当然了,对不同图片的次数必须保持一致。
6、比较两张图片的hash指纹
char bitdif=bitcount(hashA^hashb),bitcouont是一个计算1的个数的函数。
7、计算相似度
相似度的评价函数,则可以灵活的自定义了,最简单的莫过于,bitdif/64;
如果用1-G(bitdif),可能会好一些,其中G(x)为高斯函数
8、显示结果
将上一步计算得到的结果显示在tft上。
|