图像的相似度Hash算法
2019-10-08 08:46:22来源:博客园 阅读 ()
图像的相似度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; 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
原文链接:https://www.cnblogs.com/adsoft/p/11625946.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:人体分析Demo-百度API
下一篇:面试题(Python)
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode 2018-06-17
- 用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器 2018-06-17
- c#多态之抽象类与虚方法的异同点~ 2018-06-17
- C#学习笔记-图像处理篇(一)绘制公章 2018-06-17
- C#学习笔记7 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash