|
分享源码
界面截图: |
|
是否带模块: |
纯源码 |
备注说明: |
- |
本帖最后由 gongquanlin 于 2016-6-30 16:00 编辑
刚高考完这几天闲着没事,除了上班(站八个小时的大堂(⊙﹏⊙)b)就是写写代码什么的。昨天看到了超级模块里有一个找图源码(好像是超级模块),原理就是遍历图像中所有字节找到相匹配的区域,就是相似图片。这样比较精准,但是缺点也显而易见,如果遇到截图方式不同(调用的api层级不同)那在每台机器上截出来的图像数据可能不同,这个方式没有一点容错机制,所以还是有一定局限性的。然后今天花了几个小时,写了个这个小程序,可以判断相似度,有一定的容错性。
介绍一下原理:RGB图像通过公式转化为灰度图像,完成图像的灰度化,建立灰度直方图,通过两幅图像的灰度直方图,以4个灰度值为一组,建立64组数据,因为灰度直方图的定义域就是0~255,所以总共有256组数据,将所得的64组数据中的每4个数据,通过加权求和,得到64个数值,这些数值便是图像的“指纹”,将两组图像的指纹映射到64维空间,得到两组64维空间向量,通过空间夹角余弦公式得到两组图像的余弦值,将余弦值加一后除二,得到的小数乘100便是相似度。
这个程序的具体实现呢,大致分为三部分:1、将图像灰度化;2、将灰度化的图像建立直方图;3、将直方图映射到多维空间得到向量后计算夹角余弦值。
要想看懂这篇文章,最好还是先了解一下空间向量夹角余弦公式,因为易语言的开发者比较低龄化(个人认为^_^)
第一步图像灰度化与第二步建立灰度直方图
这个方式比较简单,就是利用画板,得到图像每个像素的RGB数据,转化为字节集,根据网上的灰度化计算公式,再将每个点的RGB都替换成灰度值,就ok了。代码(不好意思网慢,直接从源码里复制了):
.版本 2
.计次循环首 (画板1.取图片宽度 (tp1), x)
.计次循环首 (画板1.取图片高度 (tp1), y)
处理事件 ()
RGB = 到字节集 (画板1.取点 (x, y))
RGB_ [1] = 到数值 (RGB [1])
RGB_ [2] = 到数值 (RGB [2])
RGB_ [3] = 到数值 (RGB [3])
RGB_2 [1] = RGB_ [1] × 0.3
RGB_2 [2] = RGB_ [1] × 0.59
RGB_2 [3] = RGB_ [1] × 0.11
Gray1 = 到整数 (RGB_2 [1] + RGB_2 [2] + RGB_2 [3])
GRAY1SZ [Gray1 + 1] = GRAY1SZ [Gray1 + 1] + 1 ’在这里建立了灰度直方图
处理事件 ()
画板1.画点 (x, y, 取颜色值 (Gray1, Gray1, Gray1))
.计次循环尾 ()
.计次循环尾 ()
可能有同学不明白什么是灰度直方图,灰度直方图就是遍历整个图像,得到每个像素的灰度值,因为灰度值的取值范围是0~255,所以从0开始到255每个灰度的强度上,每个灰度出现的频率(次数),做出的图称为灰度直方图。ps:刚高考完的小伙伴肯定非常熟悉直方图。
第三步,加权求和映射空间向量
得到直方图后,通过将这256个数分成64组,通过4个数组的加权求和算出64个数,具体代码:
.版本 2
.支持库 spec
.计次循环首 (64, rq)
临时x = rq × 4 - 3
.计次循环首 (4, rq2)
调试输出 (rq)
调试输出 (rq × 4 + rq2 - 4)
result [1] [rq] = result [1] [rq] + GRAY1SZ [rq × 4 + rq2 - 4]
result [2] [rq] = result [2] [rq] + GRAY2SZ [rq × 4 + rq2 - 4]
.计次循环尾 ()
.计次循环尾 ()
这样result[1]和result[2]分别是图像1和图像2的64组数据加权求和后的“指纹”的数组。
下面将result[1]和result[2]当作一个64维的空间向量,根据空间向量夹角余弦公式(ps刚高考完的山东理科生非常熟,立体几何夹角余弦值秒杀公式,文科生可能不知道,因为文科生的考纲中没有空间坐标系……)不过不知道的小伙伴这里也给你们补充一下:
定义在直角坐标系xoy中有两个向量a,b(向量就是有方向和大小的值),定义a的坐标为(x1,y1)b的坐标为(x2,y2)那么向量a,b在空间坐标系中的夹角余弦值
cosθ=(x1x2+y1y2)/根号下(x1^2+y1^2)X根号下(x2^2+y2^2),而对于n维向量,这个公式仍然成立。那么对于64维向量(就是坐标从x,y,z……有64个描述这个点位置的量的向量)而言,利用这个公式就能求出夹角余弦值。而根据余弦图像(ps,依旧是刚高考完的同学很熟悉~每年数学第16题必考的三角函数)在0°~180°上每个点对应的函数值是唯一的,所以将得到的余弦值放到-1~1的区间上,所得到的便是在这个长度为2的区间上的这个点所占的长度。由此,将区间与得到的余弦值+1,再除2,再乘100%,便是图像的相似度。
具体算法
两图片相似度
由于之前没机会玩论坛,所以等级也不够,没办法回复可见附件,那就公开吧~还请各位多多好评啊~
另可能的话,给个精呗~
最后,个人过两天将根据这个源码写一个找图的源码,请期待~
图片相似度比较.rar
(2.79 KB, 下载次数: 238)
|
评分
-
查看全部评分
|