`
liuguihua0823
  • 浏览: 110722 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA 比较两张图片的相似度

阅读更多
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

/**
 * 比较两张图片的相似度
 * @author Guihua
 *
 */
public class BMPLoader {
	// 改变成二进制码
	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 void 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) + "%");

	}

	public static void main(String[] args){
		BMPLoader.compareImage("E:\\12.bmp", "E:\\1.bmp");
	}
}
 
分享到:
评论
4 楼 ren895837248 2016-12-29  
图片的对比肯定涉及到2纬数组,但是也不是这样遍历数组一个一个点去对比。两张1080p的图片用这个算法对比一下,过程的计算量太大了。
2维数组只是矩阵的表达方式,可以通过对矩阵的相应计算得出相似度。
3 楼 jakey766 2013-07-09  
试了下,比较两张700多k的图片就内存溢出了,能不能再优化下啊。
2 楼 jilo88 2013-06-19  
该算法的比较模式太不精准了,如果大部份背景色相同(比如白色等),但其它区域不同,则认为相似度很高,如果只有人验小部份相同,其它不同,则比较的相似率太低了。这样很比较不太科学,对于图片的比较,如人脸比较等有一定的问题,如果能够识别人脸在比较就好些。还有这个图片不同大小貌似对图片的比较结果也有影响。
1 楼 508736614 2012-08-24  
very good

相关推荐

    JAVA比较两张图片相似度的方法

    在Java编程语言中,比较两张图片的相似度通常涉及到对图像像素级别的分析。这个过程可以分为几个关键步骤,包括读取图像、提取像素信息、计算像素差异以及评估整体相似度。以下是一个基于像素值比较的简单方法: 1....

    OpenCV识别出两张图片的人脸,并比较出两张人脸的相似度,并给出相似值(包含完整的工程!!)

    OpenCV识别出两张图片的人脸,并比较出两张人脸的相似度,并给出相似值。 包含完整的工程文件,可立即运行!!! 用facedetect功能将两张图片中的人脸检测出来 将人脸部分的图片剪切出来,存到两张只有人脸的图片...

    基于java+OpenCV人脸识别+图片相似度检测+源码+开发文档说明+代码解说(毕业设计&课程设计&项目开发)

    检测任意两张图片的相似度思路 加载两张图片为bitmap进入内存 将内存中的两张图片bitmap转换为Mat矩阵(Mat类是OpenCV最基本的一个数据类型,它可以表示一个多维的多通道的数组。Mat常用来存储图像,包括单通道二维...

    Compic.zip_Compic_JAVACV

    本文将深入探讨如何利用JavaCV实现两张图片的相似度计算。 JavaCV是Java版的OpenCV,它通过JNI(Java Native Interface)与OpenCV进行交互,使得Java开发者能够利用OpenCV的强大功能。OpenCV是一个开源的计算机视觉...

    opencv-图片相似度对比代码-感知哈希算法

    在计算机视觉领域,图片相似度对比是一个常见的任务,用于识别两幅图像之间的相似性。OpenCV(开源计算机视觉库)提供了强大的工具和算法来处理这类问题。本压缩包中的资源,"opencv-图片相似度对比代码-感知哈希...

    基于java的人脸相似度比对,基于opencv和dl4j.zip

    4. 相似度计算:使用特征向量之间的距离或相似度度量来比较两张人脸的相似程度。 5. 应用程序接口(API)或用户界面(UI):如果有的话,这可能是与用户交互的部分,接收新的图像,显示结果,或者保存/记录比对结果...

    9. OpenCV进行图像相似度对比的几种办法 - zchang81的博客 - CSDN博客1

    在计算机视觉领域,图像相似度对比是至关重要的任务,OpenCV作为一个强大的库,提供了多种方法来衡量和比较图像之间的相似性。以下将详细介绍几种主要的OpenCV图像相似度对比方法: 1. 直方图方法: 直方图是表示...

    java+OpenCV 图片对比、标记差异部分(可以支持中文路径)

    图片对比的基本思路是将两张图片转换为像素数组,然后逐个像素进行比较。在OpenCV中,可以使用`imread`函数读取图片,`cvtColor`函数进行色彩空间转换(如RGB转灰度),接着通过`absdiff`函数计算两图之间的绝对差值...

    java图像识别(判断两个图是否相似)

    在Java中进行图像识别,尤其是判断两张图片是否相似,是一个涉及计算机视觉和图像处理的复杂任务。本话题将深入探讨如何使用Java实现这一功能。在实际应用中,图像相似度判断广泛应用于图像检索、内容识别、人脸识别...

    OpenCvSharp 图像拼接 OpenCV感知哈希算法进行图片相似度对比

    **图像拼接(Image Stitching)** 是将多张图片合并成一张全景图像的过程。OpenCV提供了`Stitcher`类来实现这一功能,它包含不同的模式以适应不同场景,如简单模式、尝试模式和全景模式。通过设置`Stitcher.Create()...

    face++实现人脸相似度对比

    在这个“face++实现人脸相似度对比”的主题中,我们将深入探讨如何利用Face++的API来判断两张人脸图片是否属于同一个人。 首先,我们需要了解Face++的人脸检测算法,它基于深度学习模型,能够准确地定位出图像中的...

    人脸相似度对比

    3. **特征匹配**:将两张图片提取出的特征向量进行比较。可以使用欧氏距离、余弦相似度或其他距离度量方法来衡量两个向量之间的相似性。如果相似度值越高,表明两张人脸越相似。 4. **阈值设定**:为了决定两个面孔...

    相似度查询

    例如,在文本处理中,两段文本可能有相同的语义但表达方式不同,或者在图像识别中,两张图片可能展示的是同一物体但视角、光照或色彩有所不同。 在算法比较方面,我们可以讨论几种常见的相似度计算方法: 1. **...

    OpenCv相似度比较

    "OpenCV相似度比较"是指使用OpenCV库来分析并比较两张图片之间的相似程度,以确定它们是否为同一张照片。这个过程涉及到多个图像处理和机器学习的技术,包括特征提取、描述符匹配以及相似度度量等。 1. **特征提取*...

    java指纹识别-图片识别技术

    总结来说,这个项目结合了Java编程语言,实现了指纹识别和图片识别的技术,旨在提供一个能够处理和比较指纹图像的平台。通过指纹的特征提取和匹配,以及图片的相似性搜索,为实际应用场景提供了可靠的生物识别解决...

    使用java+OpenCV进行图片对比并标记差异部分

    总结起来,使用Java和OpenCV进行图片对比及差异标记涉及到图像读取、像素级比较、阈值处理、颜色标记等多个环节。通过理解这些基本概念和技术,你可以创建自己的图像比较工具,适用于各种场景,例如监控系统中的异常...

    淘宝中根据图片搜图片 Java语言实现的,相似图像识别

    直方图比较通过度量两张图像直方图的相似性来判断它们的视觉相似度。 Java语言因其跨平台性和丰富的库支持,成为实现这种系统的理想选择。在Java中,可以使用Java Advanced Imaging (JAI) 库或者JavaFX等图形处理库...

    javascript图片相似度算法实现 js实现直方图和向量算法

    在实际应用中,如果需要比较两张图片的相似度,首先需要对每张图片进行灰度化处理,然后计算它们的直方图,最后通过`cosine`函数计算余弦相似度。这样得出的相似度值越高,两张图片的色彩分布就越接近,反之则越远。...

    Android-ImageRecognition图片识别比较两张图片的匹配度

    本项目“Android-ImageRecognition图片识别比较两张图片的匹配度”旨在实现这一功能,它可以帮助开发者在移动设备上进行高效的图像匹配操作。下面我们将深入探讨相关的知识点。 首先,我们要了解图片识别的基本原理...

    淘宝中根据图片搜图片,基于Java语言实现的,相似图像识别准确率达95%

    3. 直方图匹配:通过比较两个直方图的相似度,如使用归一化交叉相关系数或余弦相似度等方法。 4. 设置阈值:设定一个相似度阈值,超过这个阈值的图像被视为相似。 项目中提到的准确率95%是一个非常高的指标,这表明...

Global site tag (gtag.js) - Google Analytics