java判断图片相同_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
File f=files[i];
if(f.isDirectory()&&listChild){
map.putAll(getDirMD5(f, listChild));
} else {
md5=getFileMD5(f);
if(md5!=null){
map.put(f.getPath(), md5);
}
}
}
return map;
}
public static void main(String[] args) {
File file1 = new File("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\acgweb\\uploads\\task\\1495872495006.jpg");
String s = file1.getPath();
File file2 = new File("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\acgweb\\uploads\\task\\1\\20170527\\1495872475363.jpg");
System.out.println(getFileMD5(file1).equals(getFileMD5(file2)));
System.out.println(s);
}
}
2.比较每一个的图片的像素相似度(效率较低)
package com.zerdoor.util;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
public class CompareImg {
// 改变成二进制码
public static String[][] getPX(String args) {
int[] rgb = new int[3];
File file = new File(args);
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (Exception e) {
e.printStackTrace();
}
int width = bi.getWidth();
int height = bi.getHeight();
int minx = bi.getMinX();
int miny = bi.getMinY();
String[][] list = new String[width][height];
for (int i = minx; i < width; i++) {
for (int j = miny; j < height; j++) {
int pixel = bi.getRGB(i, j);
rgb[0] = (pixel & 0xff0000) >> 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);
}
// 分析图片相似度 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\\wtpwebapps\\acgweb\\uploads\\task\\1\\20170526\\1495780364826.png";
String file2 = "F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\acgweb\\uploads\\task\\1495610591334.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\\1496212755337.jpg");
File file2 = new File("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\acgweb\\uploads\\task\\1496212755337.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判断图片相同_java 识别图片相似度及图片是否相同相关推荐
- java判断总共天数_Java判断两个日期相差天数的方法
本文实例讲述了Java判断两个日期相差天数的方法.分享给大家供大家参考.具体如下: import java.util.Calendar; public class DateDifferent{ pub ...
- java 判断 中文字符_java中判断字符串中是否有中文字符
package com.meritit.test; public class TestChart { public static void main(String[] args) throws Exc ...
- java判断数字大小写_java判断字符串是否全部由数字,大小写字母,特殊符号组成...
直接上代码,经过验证. package javaTest; import java.util.regex.Matcher; import java.util.regex.Pattern; public ...
- java判断list相等_java 判断两个list是否相等
/** * 队列比较 * @param * @param a * @param b * @return */ public static > boolean compare(List a, Li ...
- java判断long相等_java判断long类型字符是否相等的方法
java判断long类型字符是否相等的方法 发布时间:2020-04-30 14:00:27 来源:亿速云 阅读:158 作者:小新 java判断long类型字符是否相等的方法?相信有很多人都不太了解 ...
- java判断总共天数_java判断两个时间相差得天数
方法一:通过Calendar类得日期比较,在这需要考虑闰年和平年,也要考虑跨年份 /** * date2比date1多的天数 * @param date1 * @param date2 * @retu ...
- java 判断是否字母_java判断字符是否为字母的方法
java判断字符是否为字母的方法 发布时间:2020-06-29 18:01:37 来源:亿速云 阅读:239 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java判断字符是否为字母的方法,代 ...
- java 判断英文标点_Java判断中英文符号、标点的实现
本文介绍了java判断中英文符号.标点的实现,分享给大家,具体如下: 方法一.用unicodeblock和unicodescript判断 在java中,主要使用 character类处理字符有关功能, ...
- java 判断json 格式_java判断json格式的方法
java判断json格式的方法 发布时间:2020-06-25 14:54:57 来源:亿速云 阅读:92 作者:Leah 本篇文章为大家展示了java判断json格式的方法,代码简明扼要并且容易理解 ...
- java判断字符长度_java判断中文字符串长度的简单实例
话不多说,上代码: /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static i ...
最新文章
- (转)AppCan中调用系统浏览器打开网页
- 代码质量第5层-只是实现了功能
- 终于还是对“带薪拉SHI”出手了...
- 软件测试除了边界值还有什么,在软件测试中,假定 X 为整数,10≤X≤100,用边界值分析法,那么 X 在测试 中应该取( )边界值...
- NSString的几种常用方法
- 【软件体系结构】架构风格与基于网络应用软件的架构设计:Roy Tomas Fielding】
- [Python] 网络爬虫和正则表达式学习总结
- Java中队列的使用
- 将solidity智能合约打包成Java代码
- Java调用第三方平台发送手机短信
- 全网搜索 6.0 - 超级网搜 SuperSearch 最新版 - 主要更新内容
- HTML邮件模板编写规则,编写邮件HTML模板
- 染色基础知识(四)——怎么染?
- Android 获取经纬度。2018年写
- 军用计算机ip等级是什么,加固计算机的IP防护等级是什么?
- Vue 微商城项目(一)
- 【声卡宿主】ProTools 2021.7.0使用安装教程
- ICCV2021|你以为这是一个填色模型?其实我是检索模型!
- 全球与中国汽车点火线圈市场深度研究分析报告
- 光猫和路由器(联通)
热门文章
- Qt资源文件.qrc
- Lattice Mico8在LMS上中断错误问题
- 张飞硬件设计与开发 学习笔记(第一部 线性稳压电源设计) 含理解,超详细!
- VDA6.5认证辅导,VDA6.5是VDA6中的第五部分用产品质量来确认质量能力
- oracle取整函数 kettle,怎样使用Kettle生成随机样本数据
- 研华PCI板卡开发(1)快速入门(1)
- linux系统英语词汇大全,linux系统中常命令和英语词汇.docx
- 用exec()函数执行新程序
- 《软技能-代码之外的生存指南》学习笔记之理财篇
- jq实现点击容器实现2张图片切换(改变src路径)