Java图片相似对比实例

package com.icss.main;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;

import sun.misc.BASE64Decoder;

/**

  • 比较两张图片的相似度,这里准确匹配方案

  • 原因是:两张图片必须大小一样,分辨率必须一样,像素大小一样,这就决定了如果存在模糊程度,分辨率问题,就不能匹配,

  • 百度那边做了这样的设定,设置不同模糊程度,再继续对比,完成更人性化的操作
    */
    public class SimilarityComparer {
    // 改变成二进制码, //这里表示的像素,每一像素取点,返回颜色的值
    private static String[][] getPX(BufferedImage image) {
    int[] rgb = new int[3];
    int width = image.getWidth();
    //这里表示的像素,每一像素取点,返回颜色的值

     int height = image.getHeight();int minx = image.getMinX();int miny = image.getMinY();String[][] list = new String[width][height];for (int i = minx; i < width; i++) {for (int j = miny; j < height; j++) {//这里当流读取对象的时候,把一个点的三原色封装成一个整数,这里进行反向取值,光色分解成三原色,rgb,就是红绿蓝,三原色可以组成任何颜色int pixel = image.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 boolean compareImage(BufferedImage image1, BufferedImage image2) {
    boolean result = false;
    // 分析图片相似度 begin
    String[][] list1 = getPX(image1);
    String[][] list2 = getPX(image2);
    //这里double预防溢出,内存,记录比较次数
    double count=0;
    int xiangsi = 0;
    int busi = 0;
    int length=list1.length;
    int lengthin = list1[1].length;

     for (int i = 0; i < length; i++) {//这里没有看明白要来干嘛,好像永远不成立if ((i + 1) == list1.length) {continue;}for (int j = 0; j < lengthin; j++) {             try {String[] value1 = list1[i][j].toString().split(",");String[] value2 = list2[i][j].toString().split(",");for (int n = 0; n < value2.length; n++) { count++;//相似度设置,根据实际需求设定图片相似程度,这里设置为5相似度极高像素的±偏差允许范围if (Math.abs(Integer.parseInt(value1[n]) - Integer.parseInt(value2[n])) < 5) {xiangsi++;} else {busi++;}}} catch (RuntimeException e) {continue;}}}//这里采用正反比较两次list1 = getPX(image2);list2 = getPX(image1);for (int i = 0; i < length; i++) {//这里没有看明白要来干嘛,好像永远不成立if ((i + 1) == list1.length) {continue;}for (int j = 0; j < lengthin; j++) {            try {String[] value1 = list1[i][j].toString().split(",");String[] value2 = list2[i][j].toString().split(",");for (int n = 0; n < value2.length; n++) {count++;//相似度设置,根据实际需求设定图片相似程度,这里设置为5相似度极高,像素的±偏差允许范围if (Math.abs(Integer.parseInt(value1[n]) - Integer.parseInt(value2[n])) < 5) {xiangsi++;} else {busi++;}}} catch (RuntimeException e) {continue;}}}double redio=busi/count;double radio=xiangsi/count;
    System.out.println("不相似的次数"+busi+"=========不相似率"+redio*100+"%");
    System.out.println("相似的次数"+xiangsi+"=========相似率"+radio*100+"%");if (radio*100>=80) {result = true;}return result;
    

    }

    public static void main(String[] args) throws IOException, AWTException {

     BufferedImage img01 = ImageIO.read(new File("E:/img01.jpg"));//用64位读取图片,获取数据//byte[] decodeBuffer2 = base64Decoder.decodeBuffer(new FileInputStream("E:/img02.jpg"));//装配到字节数组流中//InputStream stream2 = new ByteArrayInputStream(decodeBuffer2);/*** 对比图片的时候,必须保证图片像素相同,否则无法匹配,20K以内,大概2miao* 当图片太大的时候,比较时间越长,5M图片比较,需要一分多钟*/BufferedImage img02 = ImageIO.read(new File("E:/img02.jpg"));long time = new Date().getTime();System.out.println("开始匹配");System.out.println(SimilarityComparer.compareImage(img01, img02));System.out.println("匹配耗时"+(new Date().getTime()-time));/*** java截屏工具,并输出*//*Robot rb = null; // java.awt.image包中的类,可以用来抓取屏幕,即截屏。rb = new Robot();//这里截屏工具Toolkit tk = Toolkit.getDefaultToolkit(); // 获取缺省工具包Dimension di = tk.getScreenSize(); // 屏幕尺寸规格System.out.println(di.width);System.out.println(di.height);Rectangle rec = new Rectangle(0, 0, di.width, di.height);BufferedImage bi = rb.createScreenCapture(rec);//输出截屏OutputStream os = new FileOutputStream("E:/test.jpg");ImageIO.write(bi, "jpg", os);*/
    

    }
    }

Java图片相似度,图像识别相关推荐

  1. java 图片相似度_GitHub - java51talk/image-similarity: 计算图片之间的相似度

    ImageSimilarity 计算图片相似度的应用很广泛,如google.baidu.360等搜索引擎以图搜图的功能就是其典型应用.下面介绍介绍两种算法: 感知哈希算法(Perceptual has ...

  2. python 图像识别_python图像识别之图片相似度计算

    作者 | a1131825850疯子 来源 | Python爬虫scrapy 原文 | python图像识别---------图片相似度计算 1.背景 要识别两张图片是否相似,首先我们可能会区分这两张 ...

  3. java判断图片相同_java 识别图片相似度及图片是否相同

    1.比较MD5值 判断图片是否相同 package com.zerdoor.util; import java.io.File; import java.io.FileInputStream; imp ...

  4. java 图片相似搜索_JAVA比较两张图片相似度的方法

    本文实例讲述了JAVA比较两张图片相似度的方法.分享给大家供大家参考.具体如下: 摘要: importjava.awt.image.BufferedImage; importjava.io.File; ...

  5. 基于JAVA的图片相似度比对

    前言 一.工程简介 基于Java的图片相似度对比,有前台页面,后台算法 二.适用场景 图像处理实习 三.所用软件 此次工程,所用软件图片所示: 四.工程介绍

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

    1.比较MD5值 判断图片是否相同 package com.zerdoor.util; import java.io.File; import java.io.FileInputStream; imp ...

  7. Python图像识别,图片相似度计算!

    1.背景 要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等......对应的风景照是蓝天还是大海......做一系列的分类. 从机器学习的的角度来说,首先要提取图片的特征,将这 ...

  8. Java 图片上传后为什么会自动旋转90度?

    问题: 用户反馈上传后的图片方向不对,起初怀疑是本身图片方向有问题,但是用windows图片查看器打开图片方向是"正常"显示的? 分析: windows默认的图片查看器已经帮我们自 ...

  9. python图像识别之图片相似度计算

    作者 | a1131825850疯子  来源 | Python爬虫scrapy 1.背景 要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等-对应的风景照是蓝天还是大海-做一系列 ...

最新文章

  1. etw系统provider事件较多_【Flutter 实战】文件系统目录
  2. SAP RETAIL 根据Allocation Rule去创建分配表
  3. 面试问题之操作系统:死锁的四个必要条件和解决办法
  4. javascript 运算+
  5. java常用类--------File类基本用法
  6. 【解决方案】VS2017读取文件中文乱码,其他软件打开却没事
  7. layui 单选框、复选框、下拉菜单 不显示问题 记录
  8. 比特币支付接口php,比特币支付php类
  9. mysql group by having 子句
  10. 天天都在用的 Nginx,可你知道如何用一个反向代理实现多个不同类型的后端网站访问吗?...
  11. 流计算技术实战 - CEP
  12. 实现在web应用程序里有事件的页面添加到sharepoint里
  13. Oracle怎么查看离散任务,Oracle ERP操作手册
  14. java scjp 试题_JAVA认证历年真题:SCJP考试真题和解析[1]
  15. NZT、AWZ这种一键新机软件原理详解!
  16. win10键盘全变成快捷键_电脑键盘灵敏度设置方法
  17. 树莓派人脸表情识别中期报告
  18. Tackling Climate Change with Machine Learning
  19. 什么是JDBC,什么是JdbcTemplate
  20. 技术分享:Proxy-Pool代理池搭建IP代理

热门文章

  1. 微擎+微赞(微官网)100套精华模板完美完整版
  2. 星星之火-31:WCDMA码分多址复用与解复用的数学计算案例
  3. 数据仓库主题设计及元数据设计
  4. 关于散列表的大小设定
  5. [shell脚本] realtek平台 Mifi初始化时候,初始化wifi的黑白名单的sh脚本
  6. 如何优雅的使用DbContext
  7. 什么是正向代理,开放的代理软件使用
  8. C++primer学习:关于upper_bound和lower_bound的探究.
  9. 『译』RGB-D Salient Object Detection, A Review『译』
  10. 如何用【Python】制作一个二维码生成器