源码名称:图片相似图识别
主要功能:支持识别,经过角度旋转,经过干扰,经过扭曲,完全不相同但近似的图。
论坛的很多图片相似度识别源码,大体都只能对比图片高度一致的图片才有效,对于经过了旋转角度,颜色干扰,或者根本就不是一张图,但是是一种类型的图。都起不了作用,所以自己研究搞了这个源码
功能原理:
思路源自三原色也就是RGB。
众所周知 RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。
三原色,每个原色可以生成256种颜色。三通道加一起刚好就是256*3种颜色。每张图片相同的图片。所使用的颜色数量基本上近似一致。而不相同的图片,颜色使用量可以说是差距很大。
由此想到,记录红、绿、蓝三个通道的各自256中颜色的量。进行两张图片对比。设置一个容差值 假设为-100 和 + 100
为什么设置容差值呢,因为相同的一种图片 肉眼看着一致,很多时候,颜色值还是有点差距的。但是这个差距一定是在一个范围内。因为如果范围太大的话。肉眼都能看出来颜色不一样了。所以更别说软件了。
设置容差值之后 累计 256*3 个颜色的颜色用量。进行对比。再受容差值的影响。最终计算的结果。进行一个百分比计算。就可以得出图片的相似度。
经过实际测试,一般情况下 百分之55以上的相似度,基本上可以判定位同一种类图。因为如果不是一个种类的。相似度基本上是30以下 因为颜色的用量是天壤之别。
实现代码:
.版本 2
.支持库 eImgConverter
.支持库 spec
.支持库 BmpOperate
.程序集 程序集1
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 局_计次, 整数型
.局部变量 局_相似度, 整数型
转换到BMP (取运行目录 () + “\img\1.jpg”, 取运行目录 () + “\1.bmp”) ' 原始图
.计次循环首 (40, 局_计次)
转换到BMP (取运行目录 () + “\img\” + 到文本 (局_计次) + “.jpg”, 取运行目录 () + “\2.bmp”) ' 对比图
局_相似度 = 相似图对比 (读入文件 (取运行目录 () + “\1.bmp”), 读入文件 (取运行目录 () + “\2.bmp”))
调试输出 (“对比相似度:” + 到文本 (局_相似度) + “%”)
.计次循环尾 ()
返回 (0) ' 可以根据您的需要返回任意数值
.子程序 相似图对比, 整数型
.参数 原图数据, 字节集
.参数 对比图数据, 字节集
.局部变量 原图, 位图
.局部变量 对比图, 位图
.局部变量 局_计次, 整数型
.局部变量 局_计次2, 整数型
.局部变量 RGB, 字节集
.局部变量 红, 整数型, , "257"
.局部变量 绿, 整数型, , "257"
.局部变量 蓝, 整数型, , "257"
.局部变量 红2, 整数型, , "257"
.局部变量 绿2, 整数型, , "257"
.局部变量 蓝2, 整数型, , "257"
.局部变量 红色相似度, 整数型
.局部变量 绿色相似度, 整数型
.局部变量 蓝色相似度, 整数型
.局部变量 局_相似度总和, 整数型
.局部变量 局_相似度, 双精度小数型
原图.载入数据 (原图数据)
.计次循环首 (原图.取宽度 (), 局_计次)
.计次循环首 (原图.取高度 (), 局_计次2)
RGB = 到字节集 (原图.取某点颜色 (局_计次 - 1, 局_计次2 - 1))
红 [到整数 (RGB [1]) + 1] = 红 [到整数 (RGB [1]) + 1] + 1
绿 [到整数 (RGB [2]) + 1] = 绿 [到整数 (RGB [2]) + 1] + 1
蓝 [到整数 (RGB [3]) + 1] = 蓝 [到整数 (RGB [3]) + 1] + 1
.计次循环尾 ()
.计次循环尾 ()
局_计次 = 0
局_计次2 = 0
对比图.载入数据 (对比图数据)
.计次循环首 (对比图.取宽度 (), 局_计次)
.计次循环首 (对比图.取高度 (), 局_计次2)
RGB = 到字节集 (对比图.取某点颜色 (局_计次 - 1, 局_计次2 - 1))
红2 [到整数 (RGB [1]) + 1] = 红2 [到整数 (RGB [1]) + 1] + 1
绿2 [到整数 (RGB [2]) + 1] = 绿2 [到整数 (RGB [2]) + 1] + 1
蓝2 [到整数 (RGB [3]) + 1] = 蓝2 [到整数 (RGB [3]) + 1] + 1
.计次循环尾 ()
.计次循环尾 ()
局_计次 = 0
.计次循环首 (256, 局_计次)
.如果真 (红 [局_计次] - 红2 [局_计次] ≥ -100 且 红 [局_计次] - 红2 [局_计次] ≤ 100)
红色相似度 = 红色相似度 + 1
.如果真结束
.如果真 (绿 [局_计次] - 绿2 [局_计次] ≥ -100 且 绿 [局_计次] - 绿2 [局_计次] ≤ 100)
绿色相似度 = 绿色相似度 + 1
.如果真结束
.如果真 (蓝 [局_计次] - 蓝2 [局_计次] ≥ -100 且 蓝 [局_计次] - 蓝2 [局_计次] ≤ 100)
蓝色相似度 = 蓝色相似度 + 1
.如果真结束
.计次循环尾 ()
局_相似度总和 = 红色相似度 + 绿色相似度 + 蓝色相似度
局_相似度 = 局_相似度总和 ÷ (256 × 3) × 100
局_相似度 = 四舍五入 (局_相似度, 0)
返回 (局_相似度)
用旋转过的图片来做图片相似度对比
图像识别相似图片算法