图像的相似度Hash算法
Hash算法有三种,分别为平均哈希算法(aHash)、感知哈希算法你(pHash)和差异哈哈希算法(dHash)。
针对以上三种的Hash算法详解见博客园文章
https://www.cnblogs.com/Kalafinaian/p/11260808.html
本文实现针对平均哈希算法;
1 平均哈希算法(aHash)
1.1 算法步骤
平均哈希算法是三种Hash算法中最简单的一种,它通过下面几个步骤来获得图片的Hash值,这几个步骤分别是(1) 缩放图片;(2)转灰度图; (3) 算像素均值;(4)根据相似均值计算指纹。具体算法如下所示:
表1 aHash得到图片Hash值地算法
|
缩放图片 |
输入图片大小尺寸各异,为了统一图片的输入,统一将图片尺寸缩放为8*8,一共得到了64个像素点。 |
|
转灰度图 |
输入图片有些为单通道灰度图,有些RGB三通道彩色图,有些为RGBA四通道彩色图。也为了统一下一步输入标准,将非单通道图片都转为单通道灰度图。 其中RGB三通道转单通道算法有下面几种: 1.浮点算法:Gray=R0.3+G0.59+B0.11 2.整数方法:Gray=(R30+G59+B11)/100 3.移位方法:Gray =(R76+G151+B*28)>>8; 4.平均值法:Gray=(R+G+B)/3; 本Demo采用的该方法 5.仅取绿色:Gray=G; |
| 算像素均值 |
通过上一步可得一个8x8的整数矩阵G,计算这个矩阵中所有元素的平均值,假设其值为a |
|
据像素均值计算指纹 |
初始化输入图片的ahash = "" 从左到右一行一行地遍历矩阵G每一个像素如果第i行j列元素G(i,j) >= a,则ahash += "1"如果第i行j列元素G(i,j) <a, 则ahash += "0" |
得到图片的ahash值后,比较两张图片ahash值的汉明距离,通常认为汉明距离小于10的一组图片为相似图片。
Demo 界面/



获取aHash函数如下:
function TForm1.GetHash(src: TBitmap; iType: Integer): Int64;
var
p: PByteArray;
bmp: TBitmap;
x, y: Integer;
gray, sum: Integer;
ct: array[0..7, 0..7] of Byte;
avg: Single;
ret: Int64;
begin
ret := 0;
case iType of
0: // aHash 平均哈希算法
begin
bmp := TBitmap.Create;
try
bmp.Assign(src);
bmp.Width := 8;
bmp.Height := 8;
bmp.PixelFormat := pf24bit;
sum := 0;
for y := 0 to 7 do
begin
p := bmp.ScanLine[y];
for x := 0 to 7 do
begin
//转灰度图 平均值法
gray := (p[3 * x + 2] + p[3 * x + 1] + p[3 * x]) div 3;
ct[y, x] := gray;
sum := sum + gray;
end;
end;
avg := sum/64;
for y := 0 to 7 do
for x := 0 to 7 do
ret := ret shl 1 or Ord(ct[y, x] > avg);
finally
bmp.Free;
end;
end;
1: // pHash 感知哈希算法
begin end;
2: // dHash 差异哈希算法
begin end;
end;
Result := ret;
end;
计算汉明距离函数:原理参考:https://blog.csdn.net/u013243347/article/details/52220551
function TForm1.Hamming(Hash1, Hash2: Int64): Integer;
var
A: Int64;
begin
Result := 0;
A := Hash1 xor Hash2;
while A<>0 do
begin
A := A and (A-1);
Inc(Result);
end;
end;
Demo 下载地址:https://download.csdn.net/download/huffmanlepand/11833317
图像的相似度Hash算法的更多相关文章
- 图像相似度中的Hash算法
度量两张图片的相似度有许多算法,本文讲介绍工程领域中最常用的图片相似度算法之一--Hash算法.Hash算法准确的说有三种,分别为平均哈希算法(aHash).感知哈希算法你(pHash) ...
- java文章标题及文章相似度计算hash算法实现
参看了 https://github.com/awnuxkjy/recommend-system 对方用了 余弦 函数实现相似度计算,我则用的是 hanlp+hash 算法(Hash算法总结) 再看服 ...
- PHP处理海量样本相似度聚类算法
catalogue . TF-IDF . 基于空间向量的余弦算法 . 最长公共子序列 . 最小编辑距离算法 . similar_text . local sensitive hash 局部非敏感哈希 ...
- hash算法
作者:July.wuliming.pkuoliver 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash ...
- 【整理】hash算法原理及常见函数
简介 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 散列表 ...
- hash算法与hashmap
参考博客: http://zha-zi.iteye.com/blog/1124484 http://www.cnblogs.com/dolphin0520/p/3681042.html(参考了hash ...
- [区块链] 密码学中Hash算法(基础)
在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...
- Hash算法的讲解
散列表,又叫哈希表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash ta ...
- Hash算法总结(转)
1. Hash是什么,它的作用先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人 ...
随机推荐
- Linux—cat
cat:查看文件内容 cat -A: 显示文件中一些比较特殊的符号,如行尾的$ cat -n: 显示行号包括空白行 cat -b: 显示行号不包括空白行
- css3(2)
旋转: 2D:transform: rotate()——进行旋转,括号内部写旋转角度,默认顺时针旋转.允许负值,元素将进行逆时针旋转, translate()——从当前位置进行移动,括号内为x,y值. ...
- 201871010119-帖佼佼《面向对象程序设计(java)》第十周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- Test1016
T1 kom (容斥 \((1s32M)\) 给出\(N\)个互不相同的正整数,统计共有多少对数,它们有公共的一个数字(不一定在同一位置上) 输入 第一行一个正整数 \(N (1 ≤ N ≤ 1 00 ...
- 你不知道的JavaScript(中)读书笔记(二)
第三章 原生函数 常用的原生函数(内建函数)有: String() Number() Boolean Array() Object() Function() RegExp() Date() Erroe ...
- return之为什么能够终止函数,代码演练
''' return 有终止函数的作用,下面通过执行到return x 以后, 就结束了程序的下一步执行,所以就没有往下面走,所以终端上也就只能 看到打印结果100,看不到打印呢 ''' def se ...
- 运用Java调用Kettle Job和Trans(带参数)
1.首先创建一个kettle trans 2.对表输入进行编辑 ${dateNow}为要传入的参数. 3.代码编写 首先需要把包导入 import org.pentaho.di.core.Kettle ...
- 2016/06/27 HDFS概述
参考:http://www.cnblogs.com/linuxprobe/p/5594431.html 1.初识HDFS HDFS作为一个分布式文件系统,具有高容错的特点,它可以部署在廉价的通 ...
- Python面向对象-获取对象信息type()、isinstance()、dir()
type() type()函数用于判断对象类型: >>> type(11) <class 'int'> >>> type('abc') <clas ...
- C#8.0中新特性之一:结构readonly成员
结构struct成员支持readonly,用来限制被其修饰的成员不会改变结构的内部状态.加上7.2版本添加的readonly struct和ref readonly方法返回以及之前的字段声明修饰作用, ...