Atitit 判断判断一张图片是否包含另一张小图片

1. keyword1

2.  模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1

3. 匹配效果2

4. 图片相似度的算法(感知哈希算法”(Perceptual hash algorithm)2

5. 性能结果2

6. 如何提升性能3

6.1. 可以采用简化的算法。二次匹配法,先大概确定区域3

6.2. 切割图片设置一个step3

7. 参考资料3

8. ------code3

1. keyword

图像匹配

图片是否另外一张图片的一部分

如果是标准图片,模板匹配就好

2.  模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)

。Come On, Boy.我们一起来看看模板匹配到底是怎么回事。

模板匹配的工作方式
    模板匹配的工作方式跟直方图的反向投影基本一样,大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。
    假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:
  (1)从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
  (2)用临时图像和模板图像进行对比,对比结果记为c;
  (3)对比结果c,就是结果图像(0,0)处的像素值;
  (4)切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到结果图像;
  (5)重复(1)~(4)步直到输入图像的右下角。
    大家可以看到,直方图反向投影对比的是直方图,而模板匹配对比的是图像的像素值;模板匹配比直方图反向投影速度要快一些,但是我个人认为直方图反向投影的鲁棒性会更好。

3. 匹配效果

效果不错,基本可以确定查找到对应的区域坐标。。对于彩色图片,可以使用色彩空间信息排除掉其他错误的匹配图片,几乎可以精确的确定一个图片了。。

4. 图片相似度的算法(感知哈希算法”(Perceptual hash algorithm)

感知哈希算法”(Perceptual hash algorithm),它的作用是对每张图片生成一个“指纹”(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。

下面是一个最简单的实现:

第一步,缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

第二步,简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

第三步,计算平均值。计算所有64个像素的灰度平均值。

第四步,比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为。

第五步,计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。

得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算“汉明距离”。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

5. 性能结果

在我机子上,语言java ,纯java实现。匹配变换dct算法size 8

每次移动step=5  。。使用了并行库。。

速度大概在120s。。懒得继续调整性能了,主要是测试思路,不过总结了思路,暂时先用着,理想的目标应该在3秒内。。

这个是参考文章的说法大概70秒。。语言是c#调用opencv接口

模板匹配和直方图反向投影的效率
    总的来说,模板匹配和直方图反向投影的效率都不高。在我的机器上,在1136*852大小的输入图像上匹配104*132的大小的模板图像(都是单通道灰度图像),大约需要700毫秒;而直方图反向投影大约需要75000毫秒(1.25分钟)。看来还需要继续学习,寻找更好的处理方法

6. 如何提升性能

主要算法消耗在匹配小图片上。。

6.1. 可以采用简化的算法。二次匹配法,先大概确定区域

。首先可以大幅度的就确定几张疑似图像坐标。。然后对疑似图像进行高精度算法匹配,就可以几乎匹配到唯一的一张。。如果图片是彩色图片,再使用颜色信息二次匹配相似度。。以及直方图等算法补充来匹配。。

6.2. 切割图片设置一个step

比如要寻找的图片大小60*60,可以设置一个20%以内的不敬step来跳跃切割,可以大幅度提升性能, 60/0.05=12.。 可以立马提升12倍的性能。。

然后大概选定了区域后,在使用精确移动step来切割图片。

7. 参考资料

如何判断一张图片是否包含另一张小图片?图像匹配?-CSDN论坛-CSDN.NET-中国最大的IT技术社区.html

模板匹配(Match Template) - Wuya - 博客园.html

算法 - JPEG的DCT压缩原理,谁能通俗易懂解释一下? - SegmentFault.html

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )

汉字名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

8. ------code

private void t() throws IOException {

String big = "c:\\t.jpeg";

String lit = "c:\\lit.jpg";

// diff==484

BufferedImage lit_img = ImageIO.read(new File(lit));

int w2 = lit_img.getWidth();

int h2 = lit_img.getHeight();

imgx imgx = new imgx();

BufferedImage img = ImageIO.read(new File(big));

int width = img.getWidth();

int h = img.getHeight();

ImagePHash imagePHash = new ImagePHash(8, 8);

ImageReader ImageReader1 = imgx.ImgReader(new File(big));

String ext = filex.getExtName(big);

imgx.save(lit_img, "c:\\0tmpPic\\" + filex.getUUidName() + "." + ext, ext);

ExecutorService es=Executors.newFixedThreadPool(3);

lab: for (int i = 0; i < width; i = i + 5) {

for (int j = 0; j < h; j = j + 5) {

// BufferedImage tmp =

// (BufferedImage) imgx.cutImage_retImg(big,

// i, j, w2, h2);

n++;

int x = i;

int y = j;

int nowCount=n;

Runnable ra = () -> {

process(lit_img, w2, h2, imgx, imagePHash, ImageReader1, nowCount,

ext, x, y);

};

es.execute(ra);

}

}

es.shutdown();

}

private int process(BufferedImage lit_img, int w2, int h2, imgx imgx,

ImagePHash imagePHash, ImageReader ImageReader1, int n, String ext,

int i, int j) {

Rectangle rect = new java.awt.Rectangle(i, j, w2, h2);

BufferedImage tmp = imgx.cutImg(rect, ImageReader1);

int dis = imagePHash.distance(tmp, lit_img);

if (dis < 5) {

log.info(" count:" + String.valueOf(n) + " dis:"

+ String.valueOf(dis) + " rect:" + String.valueOf(i) + "_"

+ String.valueOf(j));

// break lab;

}

if (dis < 10) {

String out = "c:\\0tmpPic\\" + filex.getUUidName() + "." + ext;

imgx.save(tmp, out, ext);

log.info(" count:" + String.valueOf(n) + " dis:"

+ String.valueOf(dis) + " rect:" + String.valueOf(i) + "_"

+ String.valueOf(j) + " file:" + out);

}

int cnt = n;

if (cnt % 100 == 0) {

String count = String.valueOf(cnt);

log.info(" count:" + count + " dis:" + String.valueOf(dis)

+ " rect:" + String.valueOf(i) + "_" + String.valueOf(j));

}

return n;

}

}

Atiend

Atitit 判断判断一张图片是否包含另一张小图片的更多相关文章

  1. Atitit.java图片图像处理attilax总结  BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  2. cocos2dx中如何从一张图片中切割一部分显示成小图片

    1.通常我们拿到的资源中,通常都是许多张小图片压缩到一张图片里了,我们如何在使用的时候把它切割出来呢? 2.例如我们要把上面这张图片按组分隔开来 CCSprite* newGameNormal = C ...

  3. 判断是否含有中文,包含返回true,不包含返回false

    /** * 功能:判断是否含有中文,包含返回true,不包含返回false */ function isChina(s) { var patrn = /[\u4E00-\u9FA5]|[\uFE30- ...

  4. js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值

    js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值本文介绍jquery/js获取当前页面url地址的方法,在jquery与js中获取当前页面url方法是一样的,因为jque ...

  5. 判断是否是IE(包含IE11)

    判断是否是IE(包含IE11) if(!!window["ActiveXObject"] || "ActiveXObject" in window) { ale ...

  6. SQL判断某列中是否包含中文字符或者英文字符

    SQL判断某列中是否包含中文字符或者英文字符   [sql]  select * from 表名 where 某列 like '%[吖-座]%'     select * from 表名 where ...

  7. js判断一个dom中是否包含另一个dom的方法

    首先,比较原始(蠢)的方法 function isChildOf(child, parent) { if(child && parent) { let parentNode = chi ...

  8. Atitit. 如何判断软件工程师 能力模型 程序员能力模型  项目经理能力模型

    Atitit. 如何判断软件工程师 能力模型 程序员能力模型  项目经理能力模型 这里能力模型的标准化是对工具的使用为基本 工具(ide,语言,类库,框架,软件) 第一步 ::可使用api 类库 框架 ...

  9. Java 正则判断一个字符串中是否包含中文

    使用正则判断一个字符串中是否包含中文或者中文字符 代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...

随机推荐

  1. 让C++程序打印自身源码

    本人原创文章,欢迎阅读,禁止转载. 这绝对是惊艳到让你眼前一亮(为了简洁,故意没考虑资源问题和编译警告). #include <iostream> #include <fstream ...

  2. [fortify] open redirect漏洞

    简介: 些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http://ne ...

  3. 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

    ------- android培训.java培训.期待与您交流! ---------- 首先来看一段代码: Integer x = new Integer(4); Integer y = 4; 在JD ...

  4. [LeetCode]413 Arithmetic Slices

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  5. python基础整理笔记(六)

    一. 关于hashlib模块的一些注意点 hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD ...

  6. video标签的属性和方法总结

    最近想做一个弹幕插件,查了很多video标签的属性和方法 error属性 在正常读取时候,使用媒体数据的过程中,video元素或audio元素的error属性为null,但是任何时候只要出现错误,er ...

  7. [Leetcode]String to Integer (atoi) 简易实现方法

    刚看到题就想用数组做,发现大多数解也是用数组做的,突然看到一个清新脱俗的解法: int atoi(const char *str) { ; int n; string s(str); istrings ...

  8. C++回调函数的应用<转自:http://blog.csdn.net/wubin1124/article/details/4386269>

    一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...

  9. java中String的一些方法

    1.public String(char[] c,begin,length). 从字符数组c的下标begin处开始,将长度为length的字符数组转换为字符串. begin与length可以省略,即将 ...

  10. yii2更改面包屑的首页链接

    <?= Breadcrumbs::widget([ 'homeLink' => ['label' => 'Home', 'url' => Yii::$app->getHo ...