请先参考我写到java这章

原理讲解

参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹越相似, 说明两张图片就越相似. 但关键是如何根据图片计算出"指纹"呢? 下面用最简单的步骤来说明一下原理:

第一步 缩小图片尺寸

将图片缩小到8x8的尺寸, 总共64个像素. 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息.

第二步 转为灰度图片

将缩小后的图片, 转为64级灰度图片.

第三步 计算灰度平均值

计算图片中所有像素的灰度平均值

第四步 比较像素的灰度

将每个像素的灰度与平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0.

第五步 计算哈希值

将上一步的比较结果, 组合在一起, 就构成了一个64位的二进制整数, 这就是这张图片的指纹.

第六步 对比图片指纹

得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片.

代码实现 (C#版本)

下面我用C#代码根据上一节所阐述的步骤实现一下.

using System;
using System.IO;
using System.Drawing;namespace SimilarPhoto
{class SimilarPhoto{Image SourceImg;public SimilarPhoto(string filePath){SourceImg = Image.FromFile(filePath);}public SimilarPhoto(Stream stream){SourceImg = Image.FromStream(stream);}public String GetHash(){Image image = ReduceSize();Byte[] grayValues = ReduceColor(image);Byte average = CalcAverage(grayValues);String reslut = ComputeBits(grayValues, average);return reslut;}// Step 1 : Reduce size to 8*8private Image ReduceSize(int width = 8, int height = 8){Image image = SourceImg.GetThumbnailImage(width, height, () => { return false; }, IntPtr.Zero);return image;}// Step 2 : Reduce Colorprivate Byte[] ReduceColor(Image image){Bitmap bitMap = new Bitmap(image);Byte[] grayValues = new Byte[image.Width * image.Height];for(int x = 0; x<image.Width; x++)for (int y = 0; y < image.Height; y++){Color color = bitMap.GetPixel(x, y);byte grayValue = (byte)((color.R * 30 + color.G * 59 + color.B * 11) / 100);grayValues[x * image.Width + y] = grayValue;}return grayValues;}// Step 3 : Average the colorsprivate Byte CalcAverage(byte[] values){int sum = 0;for (int i = 0; i < values.Length; i++)sum += (int)values[i];return Convert.ToByte(sum / values.Length);}// Step 4 : Compute the bitsprivate String ComputeBits(byte[] values, byte averageValue){char[] result = new char[values.Length];for (int i = 0; i < values.Length; i++){if (values[i] < averageValue)result[i] = '0';elseresult[i] = '1';}return new String(result);}// Compare hashpublic static Int32 CalcSimilarDegree(string a, string b){if (a.Length != b.Length)throw new ArgumentException();int count = 0;for (int i = 0; i < a.Length; i++){if (a[i] != b[i])count++;}return count;}}
}

转:http://www.cnblogs.com/technology/archive/2012/07/12/2588022.html

找出相似的图片--C#相关推荐

  1. 知哈希算法——找出相似的图片

    知哈希算法--找出相似的图片 感知哈希算法--找出相似的图片 - Create Chen - 博客园 知哈希算法--找出相似的图片 Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片 ...

  2. 感知哈希算法——找出相似的图片

    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...

  3. 【转】感知哈希算法——找出相似的图片

    Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片, 谷歌显示因特网中与此图片相同或者相似的图片. 比如我上传一张照片试试效果: 原理讲解 参考Neal Krawetz博士的这篇文章 ...

  4. 从批量图片中找出相同的图片

    1.背景 公司在各城市小区的楼宇电梯中投放广告,供应商会定期反馈一些上刊报告和图片来证明确实有投放.一波图片大概在50万张上下,无法通过人手来检查这些图片是否有存在复制粘贴,鱼目混珠的情况. 2.实现 ...

  5. 基于phash和汉明距离找出相似图片

    总共有接近2000w的词条,其中几百万的词条有摘要图片,一天接到运营反馈有些词条的摘要图显示内容为暂无图片,下面是一个case: 所以,咱们需要找出几百万词条的摘要图片中显示为"暂无图片&q ...

  6. Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件

    题目为: 有一百个图片文件,它们的地址都是 http://down.fengge.com/img/1.png http://down.fengge.com/img/2.png - 一直到http:// ...

  7. python爬虫一:必应图片(从网页源代码中找出图片链接然后下载)

    这里讲解最简单的爬虫:从网页源代码中找出图片链接然后下载 代码: #coding=utf-8 #必应图片爬虫 import re import os import urllib.request url ...

  8. python找出仙剑二地图遮挡层图片在大地图中的坐标

    使用方法: 把脚本放在图片目录下,输入图片编号即可(请手动删除全黑图块) import os import randomimport cv2 import pygamedef get_small_im ...

  9. go 图片相似 查找两张图片不同的部分 找出两幅图片中的不同处

    golang Image similarity comparison 目前网上找了很多的 图片相似 查找两张图片不同的部分,实现图像比较和标记以显示不同 ,很多都是python写的,没有找到go语言写 ...

最新文章

  1. 友元类实例:日期类 学生类
  2. Reverse Words in a String
  3. iOS plist文件
  4. 利用模板模式重构JDBC操作
  5. Laravel-admin hasMany表单关联提交报错字段 无详细信息错误说明
  6. ABAP mesh expression, JavaScript and Scala expression
  7. 腾讯回应两块八卖《鬼谷八荒》:已下架并退款;iMac Pro 售完即停产;iCloud 识别姓氏闹乌龙 | 极客头条...
  8. java编程之美(一)
  9. 均匀半空间视电阻率MATLAB代码,均匀半空间中心回线瞬变电磁法正演研究
  10. Clickhouse数据库web可视化工具Sqlpad
  11. Java初学者的建议!
  12. html+css 模仿制作百度注册页面
  13. python 证件照换背景色(蓝底->白底,蓝底->红底)
  14. silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发)
  15. ESP32_esp-adf环境搭建
  16. python杨辉三角函数_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...
  17. CAS单点登录学习笔记二之部署CAS Server
  18. 数据说话:众安保险土豪式融资的背后
  19. sql查询语句-平均分、最高最低分、排序
  20. [OpenGL] 捏脸系统

热门文章

  1. 微信小程序幽默风和git
  2. 欧拉函数φ(x)简要介绍及c++实现
  3. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(串口发送函数)
  4. html标签栏logo怎么加,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...
  5. SystemVerilog中的Events事件
  6. Android 关于Android权重的真正理解
  7. AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)
  8. 图解Word2vec
  9. [未来成长] 分享:《麦肯锡教我的写作武器》如何写出一篇具有逻辑表现力的文案...
  10. jwt鉴权(react express jsonwebtoken)