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://blog.csdn.net/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. php 比对两张图片,Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  2. 将一张图片分割成多张小图片 Python3

  3. 用PS怎样把一张图片切割成几张小图片?

    1.打开PS,点击左上角的"文件",在文件中,点击"打开",先把图片保存在电脑上,然后找到图片,点击打开. 2.打开图片后,右击左侧工具栏中的"剪裁工 ...

  4. 怎么把做好的ps保存成图片_PS怎么把一张图片切片保存成多张png图片?

    做过网页设计的朋友,想必一定用过ps进行切图,有时候会用到保存透明背景图片,那么就要用到png图片格式,下面就来教教大家怎么切出png图标! 1.首先我们会用到一张ico图标素材(如下一张作为实验案例 ...

  5. java 检测表情符号_hutool工具包:判断一个字符串中是否包含emoji表情符号(emoji-java)...

    需求: 判断一个字符串中是否包含emoji表情符号. 工具: hutool工具包,emoji-java工具包 cn.hutool hutool-all 5.3.7 com.vdurmont emoji ...

  6. SQL判断某列中是否包含中文字符、英文字符、纯数字,数据截取

    SQL判断某列中是否包含中文字符.英文字符.纯数字 一.包含中文字符 select * from 表名 where 列名 like '%[吖-座]%' [吖-座]是中文字符集第一个到最后一个的范围,虽 ...

  7. java 判断字符串是否包含字母_Java中判断某一字符串是否包含数字、字母和中文...

    importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classStrValidate {//纯数字 private s ...

  8. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字

    /*判断字符串中是否仅包含字母数字和汉字       *各种字符的unicode编码的范围:      * 汉字:[0x4e00,0x9fa5](或十进制[19968,40869])      * 数 ...

  9. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  10. 判断字符串中是否仅包含英文字母、数字和汉字

    /*** 判断字符串中是否仅包含英文字母.数字和汉字* @param str* @return*/public static boolean isLetterDigitOrChinese(String ...

最新文章

  1. 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson
  2. PHP自动加载spl_autoload_register()
  3. androidannotations gradle Android Studio
  4. bzoj4503: 两个串
  5. 精读《手写 SQL 编译器 - 性能优化之缓存》
  6. python和循环语句_Python 小白零基础入门 -- 条件语句和循环语句
  7. python中文字体奇怪_“matplotlib”中对字体设置的奇怪响应
  8. 怎么推广“外卖CPS项目”赚佣金?(饿了么美团外卖红包小程序搭建教程)
  9. getDerivedStateFromProps填坑
  10. 超低插损的新材料射频开关(PCM RF switch)的新进展
  11. 移动安全技术如何未雨绸缪?
  12. 陪玩MM千千万,谁是你的NO.1?使用Python获取陪玩照片进行颜值检测打分
  13. java.lang.IllegalArgumentException的问题解决
  14. 高通平台 lcd driver 调试小结
  15. 英语不好学计算机专业可以吗,英语不好学什么专业好,计算机专业好毕业吗
  16. 对学习软件“佳佳儿童乐园”的测评
  17. A - Cthulhu
  18. java手机哪款好_5630诺基亚?诺基亚2680s是java系统?直板按键手机哪款好?诺基亚5630刷机包RM-431官方刷机包最新版...
  19. 苹果服务器未响应,上海苹果客户服务中心:iPhone 6S死机没反应修复方法
  20. 大电流导电滑环 接触电阻对性能的影响

热门文章

  1. C++特性:封装、继承、多态
  2. 这种反人类的工作被机器人取代,我举双手双脚赞成
  3. mysql数据库相关基础知识02
  4. js中采用词法作用域
  5. 我与分布式机器学习的故事
  6. 江苏省政府投资基金集聚区落地,基金目标规模再增1500亿
  7. 交换机的VLAN技术
  8. 给 Java 说句公道话
  9. 部署万兆以太网的十个注意事项
  10. PHP 9: 表达式