/// <summary>/// 感知哈希算法/// </summary>public class ImageComparer{     /// <summary>/// 获取图片的Hashcode/// </summary>/// <param name="imageName"></param>/// <returns></returns>public static string GetImageHashCode(string imageName){int width = 8;int height = 8;// 第一步//   将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,//    只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。Bitmap bmp = new Bitmap(Thumb(imageName));int[] pixels = new int[width * height];// 第二步//   将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){Color color = bmp.GetPixel(i, j);pixels[i * height + j] = RGBToGray(color.ToArgb());}}//  第三步//   计算所有64个像素的灰度平均值。int avgPixel = Average(pixels);//  第四步//   将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。int[] comps = new int[width * height];for (int i = 0; i < comps.Length; i++){if (pixels[i] >= avgPixel){comps[i] = 1;}else{comps[i] = 0;}}//  第五步//   将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。StringBuilder hashCode = new StringBuilder();for (int i = 0; i < comps.Length; i += 4){int result = comps[i] * (int)Math.Pow(2, 3) + comps[i + 1] * (int)Math.Pow(2, 2) + comps[i + 2] * (int)Math.Pow(2, 1) + comps[i + 2];hashCode.Append(BinaryToHex(result));}bmp.Dispose();return hashCode.ToString();}/// <summary>/// 计算"汉明距离"(Hamming distance)。/// 如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。/// </summary>/// <param name="sourceHashCode"></param>/// <param name="hashCode"></param>/// <returns></returns>public static int HammingDistance(String sourceHashCode, String hashCode){int difference = 0;int len = sourceHashCode.Length;for (int i = 0; i < len; i++){if (sourceHashCode[i] != hashCode[i]){difference++;}}return difference;}/// <summary>/// 缩放图片/// </summary>/// <param name="imageName"></param>/// <returns></returns>private static Image Thumb(string imageName){return Image.FromFile(imageName).GetThumbnailImage(8, 8, () => { return false; }, IntPtr.Zero);}/// <summary>/// 转为64级灰度/// </summary>/// <param name="pixels"></param>/// <returns></returns>private static int RGBToGray(int pixels){int _red = (pixels >> 16) & 0xFF;int _green = (pixels >> 8) & 0xFF;int _blue = (pixels) & 0xFF;return (int)(0.3 * _red + 0.59 * _green + 0.11 * _blue);}/// <summary>/// 计算平均值/// </summary>/// <param name="pixels"></param>/// <returns></returns>private static int Average(int[] pixels){float m = 0;for (int i = 0; i < pixels.Length; ++i){m += pixels[i];}m = m / pixels.Length;return (int)m;}private static char BinaryToHex(int binary){char ch = ' ';switch (binary){case 0:ch = '0';break;case 1:ch = '1';break;case 2:ch = '2';break;case 3:ch = '3';break;case 4:ch = '4';break;case 5:ch = '5';break;case 6:ch = '6';break;case 7:ch = '7';break;case 8:ch = '8';break;case 9:ch = '9';break;case 10:ch = 'a';break;case 11:ch = 'b';break;case 12:ch = 'c';break;case 13:ch = 'd';break;case 14:ch = 'e';break;case 15:ch = 'f';break;default:ch = ' ';break;}return ch;}}

谷歌百度以图搜图 感知哈希算法 C#简单实现相关推荐

  1. spyder cv2 打开图片_谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎

    相似图片 前情回顾: 图片颜色直方图 前期文章,我们分享了图片的3D颜色直方图,利用颜色直方图是反映图片的像素的分布状态,当然不同的图片,其颜色直方图肯定有所不同,利用不同图片的颜色直方图的对比值,便 ...

  2. 百度以图搜图API介绍

    摘要: 使用Google或Baidu的以图搜图搜索女神的头像,便可尽收网络上该女神的所有"隐私"...,以图搜图隐私问题突出,各家都没有公开公共API,但多想想还是有办法的. 作者 ...

  3. selenium+webdriver+chrome实现百度以图搜图

    1. 环境搭建 1).webdriver+chrome的版本需匹配. 2).打开chrome 输入 "chrome://version/"来查看chrome版本 访问此网站 谷歌浏 ...

  4. 以图搜图Python实现Hash算法

    以图搜图(一):Python实现dHash算法 http://yshblog.com/blog/43 以图搜图(二):Python实现pHash算法 http://yshblog.com/blog/4 ...

  5. 以图搜图 图像匹配_图像匹配,基于深度学习DenseNet实现以图搜图功能

    原标题:图像匹配,基于深度学习DenseNet实现以图搜图功能 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图像检索这一块儿,目前有谷歌的以图搜图,百度 ...

  6. 图像匹配,基于深度学习DenseNet实现以图搜图功能

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图 ...

  7. 基于深度学习实现以图搜图功能

    前记: 深度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图像检索这一块儿,目前有谷歌的以图搜图,百度的以图搜图,而百度以图搜图的关键技术叫做"感 ...

  8. “以图搜图”引擎及网站合集(转)

    转载---http://blog.csdn.net/forthcriminson/article/details/8698175 1.QBIC http://www.research.ibm.com/ ...

  9. 提供“以图搜图”完整解决方案,博云视觉让各行业都可以方便地“以图搜图”

    近年来随着移动电商的兴起,以图搜图技术也开始逐步得到应用,如百度识图.微信扫一扫.淘宝拍立淘和京东拍照购等,然而以图搜图技术门槛高,周期长,还没有大范围普及.创始团队来自北大数字视频编解码国家工程实验 ...

最新文章

  1. 3399 cpu绑核
  2. d3 svg path添加文本_10 倍高清不花!大麦端选座 SVG 渲染
  3. linux系统crontab怎么用,Linux系统crontab使用手册
  4. mysql允许两个用户远程连接_mysql允许用户远程连接
  5. DM8 jdbc调用存储过程传参list<实体类>
  6. Vitis学习记录(一)
  7. 如何写一个高效进程/线程池_关于高效企业测试的思考(1/6)
  8. 网信集团:一直在正常运营 高管被带走消息不实
  9. python是什么课程-Python课程包括哪些内容?
  10. asp.net支持多文件上传的服务器控件
  11. prml线性模型小结
  12. 计算摄影学基础知识(1)
  13. 蓝桥杯 2014真题 史丰收速算
  14. java x的平方怎么打出来_java 中的输入输出
  15. 设计一个Dog类,包含名字,年龄,颜色三个属性
  16. SSM整合(搭建一个Web脚手架)
  17. python车牌定位
  18. 浅谈数据中心综合布线运维管理方式发展史
  19. 【linux安装opencv3.4报错】ib/libopencv_videoio.so.3.4.2: undefined reference to `avcodec_get_context_defa
  20. Android DownloadManager下载管理,app更新

热门文章

  1. Linux及C基础学习总结
  2. 北斗导航 | GNSS仰角和方位角的计算和XYZ与BLH的坐标转换(附原理matlab源代码)
  3. 怎么设置Datalist ItemTemplate的背景图片
  4. 【HBase】列族属性详解
  5. 如何在安卓的后台最近任务添加一键清除按钮
  6. Leetcode 855. Exam Room 考场就座:提供两种解法
  7. java水球游戏_团队趣味游戏-《水球大战》操作说明及注意事项-水上拓展项目-七维卓越...
  8. c语言程序填空题库大一,c语言程序填空题
  9. 树莓派4b风扇安装方法_树莓派安装Raspberry Pi OS系统
  10. Java、Python 都跌出前五了,谁这么牛?