首页 java 识别图片相似度及图片是否相同

java 识别图片相似度及图片是否相同

举报
开通vip

java 识别图片相似度及图片是否相同1.比较MD5值判断图片是否相同 package com.zerdoor.util; import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.util.HashMap; import java.util.Map; public class FileDigest { /** * 获取单个文件的M...

java 识别图片相似度及图片是否相同
1.比较MD5值判断图片是否相同 package com.zerdoor.util; import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.util.HashMap; import java.util.Map; public class FileDigest { /** * 获取单个文件的MD5值! * @param file * @return */ public static String getFileMD5(File file) { if (!file.isFile()){ return null; } MessageDigest digest = null; FileInputStream in=null; byte buffer[] = new byte[1024]; int len; try { digest = MessageDigest.getInstance("MD5"); in = new FileInputStream(file); while ((len = in.read(buffer, 0, 1024)) != -1) { digest.update(buffer, 0, len); } in.close(); } catch (Exception e) { e.printStackTrace(); return null; } BigInteger bigInt = new BigInteger(1, digest.digest()); return bigInt.toString(16); } /** * 获取文件夹中文件的MD5值 * @param file * @param listChild ;true递归子目录中的文件 * @return */ public static Map getDirMD5(File file,boolean listChild) { if(!file.isDirectory()){ return null; } // Map map=new HashMap(); String md5; File files[]=file.listFiles(); for(int i=0;i> 16; rgb[1] = (pixel & 0xff00) >> 8; rgb[2] = (pixel & 0xff); list[i][j] = rgb[0] + "," + rgb[1] + "," + rgb[2]; } } return list; } public static int compareImage(String imgPath1, String imgPath2) { String[] images = { imgPath1, imgPath2 }; if (images.length == 0) { System.out.println("Usage >java BMPLoader ImageFile.bmp"); System.exit(0); } // 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 图片相似度 begin String[][] list1 = getPX(images[0]); String[][] list2 = getPX(images[1]); int xiangsi = 0; int busi = 0; int i = 0, j = 0; for (String[] strings : list1) { if ((i + 1) == list1.length) { continue; } for (int m = 0; m < strings.length; m++) { try { String[] value1 = list1[i][j].toString().split(","); String[] value2 = list2[i][j].toString().split(","); int k = 0; for (int n = 0; n < value2.length; n++) { if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 5) { xiangsi++; } else { busi++; } } } catch (RuntimeException e) { continue; } j++; } i++; } list1 = getPX(images[1]); list2 = getPX(images[0]); i = 0; j = 0; for (String[] strings : list1) { if ((i + 1) == list1.length) { continue; } for (int m = 0; m < strings.length; m++) { try { String[] value1 = list1[i][j].toString().split(","); String[] value2 = list2[i][j].toString().split(","); int k = 0; for (int n = 0; n < value2.length; n++) { if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 5) { xiangsi++; } else { busi++; } } } catch (RuntimeException e) { continue; } j++; } i++; } String baifen = ""; try { baifen = ((Double.parseDouble(xiangsi + "") / Double.parseDouble((busi + xiangsi) + "")) + ""); baifen = baifen.substring(baifen.indexOf(".") + 1, baifen.indexOf(".") + 3); } catch (Exception e) { baifen = "0"; } if (baifen.length() <= 0) { baifen = "0"; } if (busi == 0) { baifen = "100"; } System.out.println("相似像素数量:" + xiangsi + " 不相似像素数量:" + busi + " 相似率:" + Integer.parseInt(baifen) + "%"); return Integer.parseInt(baifen); } public static void main(String[] args) { String file1 = "F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtp webapps\\acgweb\\uploads\\task\\1\\20170526\\26.png"; String file2 = "F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtp webapps\\acgweb\\uploads\\task\\34.png"; int compareImage = CompareImg.compareImage(file1, file2); System.out.println(compareImage); } } 3.通过汉明距离计算相似度,取值范围 [0.0, 1.0] package com.zerdoor.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import java.awt.image.ColorConvertOp; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImgSimilarity{ // 全 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 public static void main(String[] args) throws IOException { // 获取图像 File imageFile1 = new File("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\37.jpg"); File file2 = new File("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\37.jpg"); getSimilarity(imageFile1, file2); } public static double getSimilarity(File imageFile1, File file2) throws IOException { int[] pixels1 = getImgFinger(imageFile1); int[] pixels2 = getImgFinger(file2); // 获取两个图的汉明距离(假设另一个图也已经按上面步骤得到灰度比较数组) int hammingDistance = getHammingDistance(pixels1, pixels2); // 通过汉明距离计算相似度,取值范围 [0.0, 1.0] double similarity = calSimilarity(hammingDistance)*100; System.out.println("相似度:"+similarity+"%"); return similarity; } private static int[] getImgFinger(File imageFile) throws IOException { Image image = ImageIO.read(imageFile); // 转换至灰度 image = toGrayscale(image); // 缩小成32x32的缩略图 image = scale(image); // 获取灰度像素数组 int[] pixels1 = getPixels(image); // 获取平均灰度颜色 int averageColor = getAverageOfPixelArray(pixels1); // 获取灰度像素的比较数组(即图像指纹序列) pixels1 = getPixelDeviateWeightsArray(pixels1, averageColor); return pixels1; } // 将任意Image类型图像转换为BufferedImage类型,方便后续操作 public static BufferedImage convertToBufferedFrom(Image srcImage) { BufferedImage bufferedImage = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(srcImage, null, null); g.dispose(); return bufferedImage; } // 转换至灰度图 public static BufferedImage toGrayscale(Image image) { BufferedImage sourceBuffered = convertToBufferedFrom(image); ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null); BufferedImage grayBuffered = op.filter(sourceBuffered, null); return grayBuffered; } // 缩放至32x32像素缩略图 public static Image scale(Image image) { image = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); return image; } // 获取像素数组 public static int[] getPixels(Image image) { int width = image.getWidth(null); int height = image.getHeight(null); int[] pixels = convertToBufferedFrom(image).getRGB(0, 0, width, height, null, 0, width); return pixels; } // 获取灰度图的平均像素颜色值 public static int getAverageOfPixelArray(int[] pixels) { Color color; long sumRed = 0; for (int i = 0; i < pixels.length; i++) { color = new Color(pixels[i], true); sumRed += color.getRed(); } int averageRed = (int) (sumRed / pixels.length); return averageRed; } // 获取灰度图的像素比较数组(平均值的离差) public static int[] getPixelDeviateWeightsArray(int[] pixels,final int averageColor) { Color color; int[] dest = new int[pixels.length]; for (int i = 0; i < pixels.length; i++) { color = new Color(pixels[i], true); dest[i] = color.getRed() - averageColor > 0 ? 1 : 0; } return dest; } // 获取两个缩略图的平均像素比较数组的汉明距离(距离越大差异越大) public static int getHammingDistance(int[] a, int[] b) { int sum = 0; for (int i = 0; i < a.length; i++) { sum += a[i] == b[i] ? 0 : 1; } return sum; } // 通过汉明距离计算相似度 public static double calSimilarity(int hammingDistance){ int length = 32*32; double similarity = (length - hammingDistance) / (double) length; // 使用指数曲线调整相似度结果 similarity = java.lang.Math.pow(similarity, 2); return similarity; } }
本文档为【java 识别图片相似度及图片是否相同】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_562397
暂无简介~
格式:doc
大小:41KB
软件:Word
页数:0
分类:互联网
上传时间:2019-08-23
浏览量:54