java利用直方图实现图片对比
需求
实现两张图对比,找出其中不同的部分。
分析
首先将大图切片,分成许多小图片。然后进行逐个对比,并设定相似度阈值,判断是否是相同。最后整理,根据生成数组标记不同部分。如果切片足够小,便越能精确找出不同点。
本例使用1024x1024图片,切片大小为32x32。
实现
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File; import javax.imageio.ImageIO; public class PicTest {
public final static int THRESHOLD = 90;//阈值百分比
public static void main(String[] args) throws Exception {
//用于记录不同点
int[][] comparyArray = new int[32][32];
//两张图片
BufferedImage img1 = ImageIO.read(new File("G:\\1.jpg"));
BufferedImage img2 = ImageIO.read(new File("G:\\2.jpg"));
//两张图片的切片
BufferedImage img1Sub;
BufferedImage img2Sub;
float percent;
//双循环用来取图片的切片坐标
for(int i = 0;i<32;i++){
for(int j = 0;j<32;j++){
//取相同点的坐标
img1Sub = img1.getSubimage(j*32, i*32, 32, 32);
img2Sub = img2.getSubimage(j*32, i*32, 32, 32);
//比较获得相似度
percent = compare(getData(img1Sub), getData(img2Sub));
if(percent>THRESHOLD){//比阈值大,则记录1表示相同
comparyArray[i][j] = 1;
System.out.print(1+" ");
}else{//比阈值小,则记录0表示不同
comparyArray[i][j] = 0;
System.out.print(0+" ");
}
}
System.out.println();
} } //直方图作对比返回相似度
public static float compare(int[] s, int[] t) {
float result = 0F;
for (int i = 0; i < 256; i++) {
int abs = Math.abs(s[i] - t[i]);
int max = Math.max(s[i], t[i]);
result += (1 - ((float) abs / (max == 0 ? 1 : max)));
}
return (result / 256) * 100;
}
//根据图片获取直方图数据
public static int[] getData(BufferedImage img) throws Exception {
BufferedImage slt = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
slt.getGraphics().drawImage(img, 0, 0, 100, 100, null);
// ImageIO.write(slt,"jpeg",new File("slt.jpg"));
int[] data = new int[256];
for (int x = 0; x < slt.getWidth(); x++) {
for (int y = 0; y < slt.getHeight(); y++) {
int rgb = slt.getRGB(x, y);
Color myColor = new Color(rgb);
int r = myColor.getRed();
int g = myColor.getGreen();
int b = myColor.getBlue();
data[(r + g + b) / 3]++;
}
}
// data 就是所谓图形学当中的直方图的概念
return data;
}
}
效果
两张图片分别为

运行程序后,输出1和0的数组,与第二张图相比较得到

可以看出不同的地方显示为0.据此,便可以根据数组显示画框突出了。
java利用直方图实现图片对比的更多相关文章
- java利用透明的图片轮廓抠图
需要处理的图片: 1.png(空白区域为透明) 2.png 处理后的结果图片:result.png 代码如下: import java.awt.Graphics2D; import java.awt. ...
- Java利用poi生成word(包含插入图片,动态表格,行合并)
转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...
- Java+jquery实现裁剪图片上传到服务器
大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...
- TwentyTwenty – 使用 jQuery 实现图片对比功能
这是一款非常棒的图片对比工具,能够方便的应用到你的网站中.其基本思路是把两张图片层叠在一起,当你拖动滑竿的时候,利用 CSS clip 裁剪图片,进行形成视觉对比效果. 您可能感兴趣的相关文章 Met ...
- java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板
java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailS ...
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
根据前一篇文章<移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇>所述,因为Appium和MonkeyRunner有一个共同点--代码控制流程都是在客户端实现的. ...
- java利用线程池处理集合
java利用线程池处理集合 2018年07月23日 17:21:19 衍夏成歌 阅读数:866 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/s ...
- selenium+java利用AutoIT实现文件上传
转自https://www.cnblogs.com/yunman/p/7112882.html?utm_source=itdadao&utm_medium=referral 1.AutoIT介 ...
- 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
[原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...
随机推荐
- [Swift]字符串根据索引获取指定字符,依据ASCII实现字符和整数的相互转换
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...
- [转]IOS UIView 之属性篇
[转载自:IOS UIView 之属性篇 From CSDN] UIView 继承于UIResponder 所遵守的协议有 NSCoding .UIAppearance. UI ...
- CH2601 电路维修(双端队列bfs)建图恶心
CH2601 电路维修 双端队列bfs,其实就是因为只有0和1所以可以直接2维护队列单调性(和优先队列一个道理) 建图的过程需要仔细斟酌(想一想id为什么这么写) 还有,空间要开够(很玄学),我一开始 ...
- thinkphp3.2----实现伪静态和路由配置
URL模式: 0.普通 http://localhost/qixin/ThinkCMF(test)_backup/index.php?g=user&m=login&a=index ...
- ionic 学习 一
ionic 依赖angular.在学之前,我对angular进行了一下入门. 最近在看ionic,想做一些笔记,所以,写下这个随笔,有什么不对的请多多指教,刚开始学,后面还会学Apache Cordo ...
- 读《3M 利率分析新框架》
目录 读<3M 利率分析新框架> 前言 传统的利率研究框架 3M 利率研究新框架 Macro Monetary Macro Prudence 总结 参考文献 <3M 利率分析新框架& ...
- 进阶篇:4.2)DFA设计指南:优化装配工序
本章目的:针对每一个装配工序,运用DFA进行优化. 1.前言 工序的优化在产品的精简之后. 这个是作者的实际做完DFA后得出的结论.原因倒是很简单,一个精密的产品,哪怕只是优化了一个零件,对整体的装配 ...
- CDQZ Day7
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...
- 3. Javascript学习笔记——变量、内存、作用域
3. 变量.内存.作用域 3.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值[Undefined.Null.Boolean.Number 和 Strin ...
- GTP
GPRS隧道协议(GPRS Turning Protocol) GTP是一个高层协议,位于TCP/IP或UDP/IP等协议上,提供主机间端到端通信, 通过隧道标志(TEI)在路径协议上复用 GTP ...