-
2021-03-16 02:20:16
Atitit判断判断一张图片是否包含另一张小图片
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
作者::绰号:老哇的爪子(全名::AttilaxAkbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙),EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
8.------code
privatevoidt()throwsIOException {
Stringbig="c:\\t.jpeg";
Stringlit="c:\\lit.jpg";
//diff==484
BufferedImagelit_img= ImageIO.read(newFile(lit));
intw2=lit_img.getWidth();
inth2=lit_img.getHeight();
imgximgx=newimgx();
BufferedImageimg= ImageIO.read(newFile(big));
intwidth=img.getWidth();
inth=img.getHeight();
ImagePHashimagePHash=newImagePHash(8, 8);
ImageReaderImageReader1=imgx.ImgReader(newFile(big));
Stringext= filex.getExtName(big);
imgx.save(lit_img,"c:\\0tmpPic\\"+ filex.getUUidName() +"."+ext,ext);
ExecutorServicees=Executors.newFixedThreadPool(3);
lab:for(inti= 0;i
for(intj= 0;j
// BufferedImagetmp=
// (BufferedImage) imgx.cutImage_retImg(big,
// i, j, w2, h2);
n++;
intx=i;
inty=j;
intnowCount=n;
Runnablera= () -> {
process(lit_img,w2,h2,imgx,imagePHash,ImageReader1,nowCount,
ext,x,y);
};
es.execute(ra);
}
}
es.shutdown();
}
privateintprocess(BufferedImagelit_img,intw2,inth2, imgximgx,
ImagePHashimagePHash, ImageReaderImageReader1,intn, Stringext,
inti,intj) {
Rectanglerect=newjava.awt.Rectangle(i,j,w2,h2);
BufferedImagetmp=imgx.cutImg(rect,ImageReader1);
intdis=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) {
Stringout="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);
}
intcnt=n;
if(cnt% 100 == 0) {
Stringcount= String.valueOf(cnt);
log.info(" count:"+count+" dis:"+ String.valueOf(dis)
+" rect:"+ String.valueOf(i) +"_"+ String.valueOf(j));
}
returnn;
}
}
Atiend
更多相关内容 -
一张图片的不同颜色的实现
2016-09-12 20:20:28xml中的实现 < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:layout_width ...效果图xml中的实现
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.navigation.MainActivity"> <ImageView android:id="@+id/iv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="center" android:src="@mipmap/ic_launcher"/> <ImageView android:id="@+id/iv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/iv1" android:src="@mipmap/ic_launcher" android:tint="#3F51B5" /> <ImageView android:id="@+id/iv3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/iv2" android:scaleType="centerInside" android:src="@mipmap/ic_launcher" android:tint="#FF4081" /> </RelativeLayout>
效果图
-
vue 高德地图 不同区域显示不同颜色_高德地图这样用成为你的图表神器
2020-11-20 21:26:27像这样:这样,还有这样,话不多说,接下来介绍如何做出这些图表吧。电脑端进入这个网站https://lbs.amap.com(高德开放平台)打开网站之后找到这个位置,然后点击进去,出现如下界面,按指示注册:点击『自定义地图』...在日常使用中,我们对高德地图的理解可能仅限于出行查看位置和打车。但是,高德地图的功能远不止于此,只需根据教程使用,它就能成为一款十分不错的数据图表工具。
像这样:
这样,
还有这样,
话不多说,接下来介绍如何做出这些图表吧。电脑端进入这个网站https://lbs.amap.com(高德开放平台)
打开网站之后找到这个位置,然后点击进去,出现如下界面,按指示注册:
点击『自定义地图』,就会进入到具体的操作界面,可以看到已经给出了很多款基础的模板,帮助我们创建个性化地图:
选择一个模板进去,在这里可以修改地图上面显示信息的颜色和内容是否显示,在需要局部某一地区地图时,可以通过色彩强化和不显示其它区域来突出所选部分:
还可以自己上传图片取色实现颜色搭配:
最后,直接截图或者保存导出使用就行啦。
当然,还有许多其它使用小技巧等着读者去自己探索,期待读者们发挥创意,用它创造出更有创意的图表。
关注我们 为你推荐更多实用小工具
-
在Python中Matplotlib – 两种不同范围的不同颜色图
2020-12-16 16:09:44我想把两个以前分开的数字结合起来.一个是3面板图(ax1,ax2,ax3)(全部用imshow生成)...问题是这个新图形采用与3个面板中相同的颜色图,因此在新添加的面板中产生一个简单的均匀颜色.其他3个面板仍然具有正确的颜色.imp...我想把两个以前分开的数字结合起来.
一个是3面板图(ax1,ax2,ax3)(全部用imshow生成),我在侧面使用一个单色图.现在,我想添加另一个我从png文件加载的数字(ax0),使用imread和get_sample_data(来自matplotlib.cbook).
问题是这个新图形采用与3个面板中相同的颜色图,因此在新添加的面板中产生一个简单的均匀颜色.其他3个面板仍然具有正确的颜色.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
g1 = gridspec.GridSpec(4, 1, height_ratios=[4,1,1,1])
g1.update(wspace=0.05, hspace=0.2) # set the spacing between axes.
f, ((ax0), (ax1), (ax2), (ax3)) = plt.subplots(4, 1, sharex='col', sharey='row')
ax0 = subplot(g1[0])
ax1 = subplot(g1[1])
ax2 = subplot(g1[2])
ax3 = subplot(g1[3])
from matplotlib.cbook import get_sample_data
im2 = plt.imread(get_sample_data('PathToFig/Figure.png'))
ax0.imshow(im2, vmax=1)
ziAA = np.random.rand(4, 4, 4)
ziAB = np.random.rand(4, 4, 4)
ziBA = np.random.rand(4, 4, 4)
ax1.imshow(ziAA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])
ax2.imshow(ziAB,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])
im = ax3.imshow(ziBA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])
from matplotlib import ticker
tick_locator = ticker.MaxNLocator(nbins=5)
f.subplots_adjust(right=0.85)
cbar_ax = f.add_axes([1.0, 0.15, 0.01, 0.7])
cbar = f.colorbar(im, cax=cbar_ax)
cbar.locator = tick_locator
cbar.update_ticks()
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
ziAB,ziBA和ziAA是在先前的griddata插值调用中生成的.
我尝试在每个imshow调用中指定两个不同的颜色映射,我尝试更改vmax的值.但无济于事……
如果我在ax1-3之后放了ax0,那么,它是ax0谁得到正确的颜色,而不是ax1-3.
我看过其他类似的问题(Two different color colormaps in the same imshow matplotlib),谈论创建蒙面数组或我自己的色彩映射,但由于ax0的png文件来源,我真的没有看到我应该如何继续.
编辑:
玩具数据:
ziAA = np.random.rand(4, 4, 4)
ziAB = np.random.rand(4, 4, 4)
ziBA = np.random.rand(4, 4, 4)
玩具png图:
有了这个数字,均匀的颜色变成了白色.我的实际数字给出了均匀的红色这表明通过适当调整vmin,vmax和其他控制参数,可以使png图正确显示.但是,我会对任何适用于任何png图的东西感兴趣……
附:
im0 = ax0.imshow(im2, aspect='auto',extent=[-0.15,0.15,0,4])
产生以下结果:
-
怎么把Photoshop的图片整体颜色加深?
2021-06-12 01:13:00回答:ps加深工具——原理介绍ps加深工具,...绘图类工具在使用中都有笔刷的应用,不同笔刷做出来的效果也不相同,用加深工具时,选择带羽化的画笔形状,就可以了。调节画笔的“硬度”,调为100时,边缘很生硬,调为... -
两行 CSS 代码实现图片任意颜色赋色技术
2021-06-11 15:19:00两行 CSS 代码实现图片任意颜色赋色技术||很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方法可以实现,又或者不仅仅... -
颜色及图片识别原理,颜色识别传感器介绍
2019-08-13 17:29:46光及颜色 1.光:是人类眼睛可以看见的一种电磁波,也称可见光谱。在科学上的定义,光是指...不同的颜色,原因就在于物体固有的对落在它表面的光谱成分选择性透射,吸收和反射的特性, 2.颜色:是光作用于人眼后... -
用Python实现给图片变换颜色
2019-12-29 20:44:02今天小编分享一个关于对图片进行颜色转换的内容,让一个物体可以以各种不同的色彩来呈现。比如一个青色的苹果,把它转化成红色。有很多解决方案… 比如:我们可以用绘图工具来p图,今天呢小编主要来介绍下如何用... -
CSS Sprites技术实现一张图片上很多小图片,分别定位到网页的不同位置
2021-06-12 16:40:07之前,一直看到百度...今天偶然看到一个网站小图标都在一张背景图上,才理解CSSSprites技术(网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background-repeat”,“background-po... -
opencv学习笔记9:根据图片颜色分割图像
2018-09-08 22:14:12有一张图片,底色是蓝色的,感兴趣的区域是灰色的,事实上按颜色分割图片在HSV通道上分割效果要远远优于在BGR通道上分割,如何获取某种颜色的HSV值大家请参考我的上篇博客。 程序思路: 读取图片(BGR)-&... -
基于Python查找图像中很常见的颜色
2020-12-01 00:38:19如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确定水果的成熟度,我们可以通过检查水果的颜色是否落在特定范围内,来判断它们是否已经成熟。接下来我们将... -
图像颜色迁移专题介绍(一):Global Color Transfer
2021-11-18 17:49:04我决定重操旧业,把我硕士阶段曾经研究过一小段时间的图像颜色迁移重新拾起来,看一下有什么可以做的东西。本篇博客就是我最近做算法调研时候的一些思路的分享,希望给那些做类似研究的同学提供一点帮助。 -
使用Python,OpenCV实现图像之间超快速的颜色转移
2020-11-24 19:43:55与基于直方图的颜色转移方法不同,该方法需要计算每个通道的CDF,然后构造查找表(LUT),该方法严格依赖于L * a * b *颜色空间中像素强度的均值和标准差,从而使得它非常高效,能够快速处理非常大的图像。... -
python实现-颜色直方图&pHash图像检索分类-图像检索引擎
2018-10-18 16:35:56这是我们课程作业的一部分,我已经把所有的代码都上传到了我的github,基于高效检索算法可以构建图像搜索隐藏,关键在于找到合适的算法 ... (欢迎批评&...基于颜色直方图的图像检索与分类 ———... -
基于颜色特征的图像检索(一)
2019-01-12 15:46:22目的:实现“以图搜图”的功能,给定一张测试图像,在训练集中找出最接近的10张图像(实际上是检索类别相同的图像) 基本思路:对训练集中的已有图像进行特征提取,对所提取的特征建立索引;在检索时,对测试图像... -
opencv提取图像中的颜色直方图(RGB、HSV)
2018-10-31 17:15:20所谓颜色直方图,指的是一幅图像中的颜色分布,与图像中的特定的物体无关,只是用来表示人的眼睛观察到的图像中的颜色分布情况,例如说,一幅图中红色占了多少比例,绿色占了多少比例等。 我们知道,计算机色彩... -
上下调基因和代谢物--不同颜色显示在同一张KEGG通路图中
2021-08-21 10:00:02上下调基因和代谢物以不同颜色表示上下调,并显示在同一张KEGG通路图中。 在MetobaAnalyst数据库:https://www.metaboanalyst.ca/ (一)点击Click here to start进入 (二)选择Joint-Pathway Analysis模块 (三)... -
使用颜色空间进行图像分割
2018-10-03 14:49:00原文地址:https://realpython.com/python-opencv-color-spaces/ 什么是颜色空间? 使用颜色空间进行简单分割 颜色空间和使用opencv读取图像 在RGB颜色空间可视化小丑鱼 ... -
如何把多张图拼成一张长图
2021-01-17 11:59:51如何把多张图拼成一张长图相信很多小伙伴都有在使用苹果iPhone手机,在其中如何才能通过微信拼接多张截图呢?方法很简单,下面小编就来为大家介绍。具体如下:1. 首先,打开手机上的“微信”。进入首页后,点击右下... -
颜色空间内容讲解与图像分割应用
2022-04-03 10:34:54颜色空间也称彩色模型,在计算机视觉的角度来看就是组成一张图片的多组RGB所构成的一个数据集,通过对特定范围内的色域进行筛选就可以实现图像分割。那么如何进行筛选呢,这时候需要先介绍几组颜色空间的类别。 1.... -
OpenCV_加载一张图片
2016-12-16 13:24:41今天更新一个小Demo,使用opencv,从本地读取一张图片。【先代码->演示结果->分析代码】 OpenCV 版本: opencv-3.1.0 关于环境的配置略过,大家可以搜索一下其他的教程说明。代码:#include "highgui.h" int main... -
echarts饼图指示器文字颜色设置不同
2022-04-12 22:05:02需求: 绘制一份环形饼状图,并且有指示器文本标签(文字的颜色需要和各部分相同) 数据: pieData: [ { name: '犯人', value: 30 }, { name: '官差', value: 35 }, { name: '平民', value: 35 }, ], /... -
图片中的某一种颜色如何通过CorelDRAW更换
2019-09-18 07:11:10在CorelDRAW日常使用中,时而会遇到这样的工作:一个Logo、一张图片,需要改变图片中的某一种颜色,重新输出。此时一般会有两种选择:1、在CorelDRAW中重新将该标志重新用矢量工具描绘一遍,在进行颜色的更换。这样... -
基于Python查找图像中最常见的颜色
2020-11-08 17:05:00点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确... -
2行CSS 代码实现图片任意颜色赋色技术
2019-07-26 21:59:57假设我们有这样一张图片,JPG、PNG、GIF 都可以,但是有一个前提要求,就是黑色纯色,背景白色: 利用 background-blend-mode ,我们可以在图片下叠加多一层其他颜色,通过 background-blend-mode: l... -
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020-12-04 21:28:02把文档拉到最后,我们可以看到关于颜色设置的定义: 这里有两个颜色看起来不太常用,一个是cyan是青色,另外一个是magenta是品红。说明老外对颜色的喜好和审美和我们国人还是有些差距的。 除了使用单词之外,我们还... -
人眼感知到的颜色与真实物理世界的颜色有什么区别?
2020-03-02 14:04:22如何判断不同人眼中的同一颜色(频率的光)是否一样?不同的生物呢?如果他们都不是色盲。 3。如何像物理的定义一样精确定义“色盲”? 关注者 837 被浏览 95,228 关注问题写回答 邀请回答 14 条评论 ... -
在PS中如何将两张图片无缝拼接?
2020-12-20 16:35:21完成效果图:原片:具体操作步骤在PS中打开两张要拼接的照片:将照片放到同一个文件中,调整好大小位置:选出要保留的对象:创建图层蒙版:将图层混合模式改为强光:在PS中如何将两张图片无缝拼接操作演示完成。...