说明:目前使用像素偏移量为5,可根据实际情况相应修改

  1. package com.creditease.fetch.credit.util.similarity;
  2.  
  3. import com.creditease.fetch.credit.util.ImageManager;
  4. import sun.misc.BASE64Decoder;
  5.  
  6. import javax.imageio.ImageIO;
  7. import java.awt.image.BufferedImage;
  8. import java.io.ByteArrayInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11.  
  12. /**
  13. * 比较两张图片的相似度
  14. */
  15. public class SimilarityComparer {
  16. // 改变成二进制码
  17. private static String[][] getPX(BufferedImage image) {
  18. int[] rgb = new int[3];
  19. int width = image.getWidth();
  20. int height = image.getHeight();
  21. int minx = image.getMinX();
  22. int miny = image.getMinY();
  23. String[][] list = new String[width][height];
  24. for (int i = minx; i < width; i++) {
  25. for (int j = miny; j < height; j++) {
  26. int pixel = image.getRGB(i, j);
  27. rgb[0] = (pixel & 0xff0000) >> 16;
  28. rgb[1] = (pixel & 0xff00) >> 8;
  29. rgb[2] = (pixel & 0xff);
  30. list[i][j] = rgb[0] + "," + rgb[1] + "," + rgb[2];
  31. }
  32. }
  33. return list;
  34. }
  35.  
  36. public static boolean compareImage(BufferedImage image1, BufferedImage image2) {
  37. boolean result = false;
  38. // 分析图片相似度 begin
  39. String[][] list1 = getPX(image1);
  40. String[][] list2 = getPX(image2);
  41. int xiangsi = 0;
  42. int busi = 0;
  43. int i = 0, j = 0;
  44. for (String[] strings : list1) {
  45. if ((i + 1) == list1.length) {
  46. continue;
  47. }
  48. for (int m = 0; m < strings.length; m++) {
  49. try {
  50. String[] value1 = list1[i][j].toString().split(",");
  51. String[] value2 = list2[i][j].toString().split(",");
  52. int k = 0;
  53. for (int n = 0; n < value2.length; n++) {
  54. if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 3) {
  55. xiangsi++;
  56. } else {
  57. busi++;
  58. }
  59. }
  60. } catch (RuntimeException e) {
  61. continue;
  62. }
  63. j++;
  64. }
  65. i++;
  66. }
  67. list1 = getPX(image2);
  68. list2 = getPX(image1);
  69. i = 0;
  70. j = 0;
  71. for (String[] strings : list1) {
  72. if ((i + 1) == list1.length) {
  73. continue;
  74. }
  75. for (int m = 0; m < strings.length; m++) {
  76. try {
  77. String[] value1 = list1[i][j].toString().split(",");
  78. String[] value2 = list2[i][j].toString().split(",");
  79. int k = 0;
  80. for (int n = 0; n < value2.length; n++) {
  81. if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 3) {
  82. xiangsi++;
  83. } else {
  84. busi++;
  85. }
  86. }
  87. } catch (RuntimeException e) {
  88. continue;
  89. }
  90. j++;
  91. }
  92. i++;
  93. }
  94. if (busi == 0) {
  95. result = true;
  96. }
  97. return result;
  98. }
  99.  
  100. public static void main(String[] args) throws IOException {
  101. InputStream stream = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(ImageManager.numeric.get("6")));
  102. BufferedImage n6 = ImageIO.read(stream);
  103. stream = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(ImageManager.numeric.get("9")));
  104. BufferedImage n9 = ImageIO.read(stream);
  105. System.out.println(SimilarityComparer.compareImage(n6, n9));
  106. }
  107. }

Java_比较两个图片的相似度的更多相关文章

  1. opencv java小应用:比较两个图片的相似度

    package com.company; import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.ope ...

  2. C# 图片的裁剪,两个图片合成一个图片

    图片的裁剪,两个图片合成一个图片(这是从网上摘的) /// <summary>         /// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png  新图1_ne ...

  3. C# 计算两个字符串的相似度

    我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. 现在提供一个比较两个字符串相似度的方法. 通过计算出两个字符串的相似度,就可以通过Linq在内 ...

  4. Convert between cv::Mat and QImage 两种图片类转换

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  5. C# 图片旋转360度程序

    这几天开发一个程序,需要将一个图片旋转360度然后每一个角度保存下来.刚开始本来想着是让美工弄的,但是让一个美工手动转360度,她会喷你一脸. using System; using System.C ...

  6. 做了一个js的拉动遮罩层,两个图片分别显示的效果

    想做成车修好了和没修好的对比,所以需要两个图片.需要用到的知识点, 1.定位 2.mouse 的事件(代码中体现) 3.鼠标指针的移动距离算法 4.css中,cursor的应用 好了,废话不多说 ,直 ...

  7. 一个异步任务接收两个url下载两个图片

    有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片. 程序的下载任务是这么执行的,先接受url参数,然后调用 imgUrls = infoP ...

  8. Levenshtein Distance + LCS 算法计算两个字符串的相似度

    //LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source ...

  9. 利用编辑距离(Edit Distance)计算两个字符串的相似度

    利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...

随机推荐

  1. Spark SQL相关总结

    1.spark 数据透视图: pivot(pivot_col, values=None) Pivots a column of the current [[DataFrame]] and perfor ...

  2. 第五节:Task构造函数之TaskCreationOptions枚举处理父子线程之间的关系。

    一. 整体说明 揭秘: 通过F12查看Task类的源码(详见下面的截图),发现Task类的构造函数有有一个参数为:TaskCreationOptions类型,本章节可以算作是一个扩展章节,主要就来研究 ...

  3. CSS布局 两列布局之单列定宽,单列自适应布局思路

    前言 说起自适应布局方式,单列定宽单列自适应布局是最基本的布局形式.比如斗鱼的直播间,后台管理系统都是常用的 我们将从 float, inline-block, table, absolute, fl ...

  4. Beamer 目录分栏

    导言区加入 \usepackage{multicol} 然后 \section*{目录} \frame{\begin{multicols}{} \tableofcontents[hideallsubs ...

  5. [物理学与PDEs]第1章第9节 Darwin 模型 9.2 Maxwell 方程组的一个定解问题

    设 $\Omega$ 为一有界区域, 外部为理想导体 $(\sigma=+\infty)$, 则 $\Omega$ 中电磁场满足 Maxwell 方程组 $$\beex \bea \ve\cfrac{ ...

  6. Codeforces 1060E(dfs计数)

    题目链接 题意 给一棵树,对于一个节点,与它相邻的结点可以连一条边,求所有点对间距离之和 思路 任意两点间的距离被优化为$\left \lceil \frac{s}{2} \right \rceil$ ...

  7. centos7.2 环境下 mysql-5.1.73 安装配置

    安装mysql,安装前准备 如果mysql用户不存在,那么添加mysql用户 groupadd mysql useradd -g mysql mysql mysql编译安装 tar -zxvf mys ...

  8. window开发环境常用操作

    1. 启动redis命令 redis-server redis.windows.conf 如果法正常启用,出现如下问题 windows下第一次通过以下命令启动redis (*:此处整理转载自:http ...

  9. Rich feature hierarchies for accurate object detection and semantic segmentation(理解)

    0 - 背景 该论文是2014年CVPR的经典论文,其提出的模型称为R-CNN(Regions with Convolutional Neural Network Features),曾经是物体检测领 ...

  10. windows下nginx的简单使用

    在网上是可以查得到关于nginx的一些使用,每次要用的时候都会去查一下别人的用法.既然自己用到的频率会比较高,那何不自己做个小小的笔记呢. 我使用的是windows版nginx-1.14.0,版本对命 ...