开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5767|回复: 7
收起左侧

[易语言纯源码] 基于灰度值的空间向量图像相似度算法源码!

[复制链接]
发表于 2016-6-30 15:52:59 | 显示全部楼层 |阅读模式   北京市北京市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 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)

评分

参与人数 2好评 +2 精币 +6 收起 理由
a1007117751 + 1 + 1 支持开源~!感谢分享
冰点 + 1 + 5 奉上小小红包希望笑纳

查看全部评分


结帖率:100% (2/2)

签到天数: 2 天

发表于 2022-1-24 20:38:35 | 显示全部楼层   浙江省宁波市
哒哒哒哒哒哒多多多多
回复 支持 反对

使用道具 举报

结帖率:36% (5/14)
发表于 2019-5-8 15:02:06 | 显示全部楼层   重庆市重庆市
比较的速度和正确率是关键
回复 支持 反对

使用道具 举报

发表于 2018-11-15 20:41:17 | 显示全部楼层   江苏省无锡市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2016-7-13 22:37:58 | 显示全部楼层   山东省潍坊市
顶一下..........................
回复 支持 反对

使用道具 举报

结帖率:68% (15/22)
发表于 2016-7-2 05:46:41 高大上手机用户 | 显示全部楼层   广东省广州市
看不懂精易BTSK2VN2
回复 支持 反对

使用道具 举报

结帖率:80% (8/10)
发表于 2016-7-1 08:32:38 高大上手机用户 | 显示全部楼层   四川省成都市
验证码算法是个快速白头的捷径,好期待啊。
回复 支持 反对

使用道具 举报

结帖率:92% (122/133)
发表于 2016-7-1 02:28:15 | 显示全部楼层   河南省开封市
加权都出来了,你确定自己刚高考完毕?不过思路确实很棒,现在的高中生都这么叼了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表