python 模糊匹配如何进行多图查找匹配?

python+opencv实现简单的图片搜索功能 - CSDN博客
python+opencv实现简单的图片搜索功能
一、图片搜索中的概念解释:
图片搜索引擎有三种不同的模式
1.Search by Meta-Data:元数据搜索模式,这种和传统的文字搜索类似,给索引数据添加文字注释,上传待查询的图片的时候,需要附加图片的文字描述,实际在后台搜索对应的文字描述,典型的有
2.Search by Example:基于内容的搜索,即Content-Based Image Retrieval (CBIR) systems,也即后文介绍,通过计算图片内容相似度实现搜索,典型的如
3.前两种的混合
二、分四个步骤实施CBIR图片搜索引擎
1.定义图片算子:即定义从图片中提特征的函数,原文中使用了色彩直方图作为图片的特征
2.简历索引数据库:用第一步中定义的提特征函数,遍历图片数据库,提取每张图片的函数,数据保存格式为 image_name ,image_vector
3.定义相似度函数:即计算从两张图片中提取的特征向量间的距离,原文中用的卡方距离
4.调用前三步写好的函数,实现一个查询入口
本文已收录于以下专栏:
相关文章推荐
本文将介绍用Python和OpenCV创建一个简单的图片搜索引擎, CBIR系统的构建主要包括:
1)定义图像描述符(图像特征提取)
这一阶段,需要决定描述图像的哪...
大概五年前吧,我那时还在为一家约会网站做开发工作。他们是早期创业公司,但他们也开始拥有了一些稳定用户量。不像其他约会网站,这家公司向来以洁身自好为主要市场形象。它不是一个供你鬼混的网站——是让你能找到...
关键词:Pytesser image_to_string
Python简单的图片识别,pytesseract .image_file_to_string('1.tif') WindowsError: [Error 2] 解决办法...
目录(?)[-]
Python 3 色情图片识别
一实验简介
11 知识点12 效果展示
二实验步骤
21 安装包22 程序原理23 实现脚本24 测试效果
三实验总结四完整代码
1.概念这里说的是OpenCV中实现的Meanshift算法的大体概念。
在OpenCV中meanshift算法的原理,大体上是这样的:
首先,预先定义一个窗口(可以通过openCv中的ROI在图...
OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务。OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优...
越来越觉得python是一强大的工具,处理样本确实不错。最近因项目需要涉及到图片处理,所以开始用python调用opencv,再次觉得python真乃神器也!
import re...
基于内容的图像检索是计算机视觉中的一个重要问题。它的目标是给定一个查询图像,寻找呈现内容相似的一组图像。其关键点在于如何采用直方图来衡量两个图像的相似性。
通过比较直方图检索相似图片:
原图ima...
这里介绍了图像特征检测算法-SIFT的Python实现,并且介绍了如何在一组图像中利用SIFT算法连接相互匹配的图像。...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2009年10月 PHP大版内专家分月排行榜第二2009年9月 PHP大版内专家分月排行榜第二2009年7月 PHP大版内专家分月排行榜第二2008年1月 PHP大版内专家分月排行榜第二2007年8月 PHP大版内专家分月排行榜第二2007年5月 PHP大版内专家分月排行榜第二2007年3月 PHP大版内专家分月排行榜第二
2009年11月 PHP大版内专家分月排行榜第三2007年7月 PHP大版内专家分月排行榜第三2007年4月 PHP大版内专家分月排行榜第三2007年1月 PHP大版内专家分月排行榜第三
2013年10月 其他开发语言大版内专家分月排行榜第二2012年2月 其他开发语言大版内专家分月排行榜第二
2013年11月 其他开发语言大版内专家分月排行榜第三2012年4月 其他开发语言大版内专家分月排行榜第三2011年6月 其他开发语言大版内专家分月排行榜第三
2013年10月 其他开发语言大版内专家分月排行榜第二2012年2月 其他开发语言大版内专家分月排行榜第二
2013年11月 其他开发语言大版内专家分月排行榜第三2012年4月 其他开发语言大版内专家分月排行榜第三2011年6月 其他开发语言大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。求助 python 如何实现对两张同尺寸图片进行对比,找出像素差异? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
求助 python 如何实现对两张同尺寸图片进行对比,找出像素差异?
13:53:33 +08:00 · 5472 次点击
比如这两张图片
尺寸一样, 能否找出 差异的像素数量,就是 'diff' 所占用的像素数?
尝试PIL 和 OPENCV,但是都没法实现对像素的控制,不想做伸手党,但是研究了很久没有进展,上来请教下大家。
20 回复 &| &直到
21:24:17 +08:00
& & 13:55:20 +08:00
还记得字模识别的验证码的么?行不行
& & 13:57:02 +08:00
转成bmp,像素求差集行吗
& & 13:58:54 +08:00 via Android
图片说到底是矩阵,转化成矩阵然后对比不同矩阵元素是不是好点
& & 14:02:48 +08:00
为什么OPENCV不行?imread进来就是Mat矩阵,每个元素就是一个像素。直接两个Mat相减就OK了
& & 14:07:57 +08:00
& & 14:13:10 +08:00
为什么我在网页(chrome)上看的感觉下面的图比较亮,下到本地看是一样的?
& & 14:21:07 +08:00
多谢各位指点,我从矩阵这块在研究看看。再次感谢
& & 14:21:57 +08:00
是不是tn屏幕,光显不均匀
& & 14:24:00 +08:00
@ 原来如此,确实是tn屏。
& & 15:07:30 +08:00
PIL 怎么会不可以呢,我试了下分分钟搞定:
from PIL import Image
im1, im2 = Image.open(&1.jpg&), Image.open(&2.jpg&)
width, height = im1.size
diff = [(x, y) for x in xrange(width) for y in xrange(height) if im1.getpixel((x, y)) != im2.getpixel((x, y))]
print len(diff)
& & 15:34:30 +08:00
把有差异的点 draw 出来可以发现,像素不同的不单单是 'diff' 所占用的像素,周围像素也有不同。应该是因为 JPEG 是有损压缩图片格式,周围像素信息被丢失了。
& & 16:06:44 +08:00
@ 非常感谢,新手上路 :)
尝试用opencv2
###
import numpy as np
import cv2
global n
n = 0
img1 = cv2.imread('testimg.jpg', 0)
img2 = cv2.imread('testimg_diff.jpg', 0)
height, width = img1.shape
for line in range(height):
for pixel in range(width):
if img1[line][pixel] != img2[line][pixel]:
n = n + 1
print n
###
奇怪得出的值和你的不太一样,继续研究研究
& & 16:12:31 +08:00
import numpy as np
import cv2
img1 = cv2.imread('testimg.jpg', 0)
img2 = cv2.imread('testimg_diff.jpg', 0)
height, width = img1.shape
for line in range(height):
for pixel in range(width):
if img1[line][pixel] != img2[line][pixel]:
& & 16:16:41 +08:00
&显示 Gist 代码&
& & 16:23:56 +08:00
读入到矩阵,然后矩阵相减。
& & 16:31:29 +08:00
@ 发现问题了,我载入的时候直接灰阶了,所以值少了好多,再次感谢
& & 08:23:21 +08:00
直接遍历最简单,上面已经有人说了。另外,可以用opencv的absdiff函数,直接得到差值图像,这样可以看到两幅图像的差异。计算差异像素个数,可以将差值图像转成灰度后,用countNonZero计算非零像素个数。
& &129 天前
@ 因为 opencv 查到了这里。我也有一个 opencv 的 “疑难杂症” 愿意付费请教。微信 ID: luhe1987 ;
& &128 天前 via iPhone
@ 不好意思,我对 opencv 不太熟悉,PIL 也很久没用了,恐不能胜任。
& &127 天前
@ 没问题,多谢回复。
& · & 2373 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 56ms · UTC 01:14 · PVG 09:14 · LAX 17:14 · JFK 20:14? Do have faith in what you're doing.python实现识别相似图片小结
投稿:hebedich
字体:[ ] 类型:转载 时间:
本文给大家分享的是使用Python实现图片相似度识别的总结,代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的。
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系。
当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向。
如有错误,请多包涵和多多指教。
参考的文章和图片来源会在底部一一列出。
以及本篇文章所用的代码都会在底下给出github地址。
安装相关库
python用作图像处理的相关库主要有openCV(C++编写,提供了python语言的接口),PIL,但由于PIL很早就停了,所以不支持python3.x,所以建议使用基于PIL的pillow,本文也是在python3.4和pillow的环境下进行实验。
至于opencv,在做人脸识别的时候会用到,但本文不会涉及到,在本专栏的后续中会谈及openCV的人脸识别和基于此的python图片爬虫,有兴趣的朋友可以关注本专栏。
要识别两张相似图像,我们从感性上来谈是怎么样的一个过程?首先我们会区分这两张相片的类型,例如是风景照,还是人物照。风景照中,是沙漠还是海洋,人物照中,两个人是不是都是国字脸,还是瓜子脸(还是倒瓜子脸……哈哈……)。
那么从机器的角度来说也是这样的,先识别图像的特征,然后再相比。
很显然,在没有经过训练的计算机(即建立模型),那么计算机很难区分什么是海洋,什么是沙漠。但是计算机很容易识别到图像的像素值。
因此,在图像识别中,颜色特征是最为常用的。(其余常用的特征还有纹理特征、形状特征和空间关系特征等)
其中又分为
直方图计算法
这里先用直方图进行简单讲述。
先借用一下恋花蝶的图片,
从肉眼来看,这两张图片大概也有八成是相似的了。
在python中可以依靠Image对象的histogram()方法获取其直方图数据,但这个方法返回的结果是一个列表,如果想得到下图可视化数据,需要另外使用 matplotlib,这里因为主要介绍算法思路,matplotlib的使用这里不做介绍。
是的,我们可以明显的发现,两张图片的直方图是近似重合的。所以利用直方图判断两张图片的是否相似的方法就是,计算其直方图的重合程度即可。
计算方法如下:
其中gi和si是分别指两条曲线的第i个点。
最后计算得出的结果就是就是其相似程度。
不过,这种方法有一个明显的弱点,就是他是按照颜色的全局分布来看的,无法描述颜色的局部分布和色彩所处的位置。
也就是假如一张图片以蓝色为主,内容是一片蓝天,而另外一张图片也是蓝色为主,但是内容却是妹子穿了蓝色裙子,那么这个算法也很可能认为这两张图片的相似的。
缓解这个弱点有一个方法就是利用Image的crop方法把图片等分,然后再分别计算其相似度,最后综合考虑。
图像指纹与汉明距离
在介绍下面其他判别相似度的方法前,先补充一些概念。第一个就是图像指纹
图像指纹和人的指纹一样,是身份的象征,而图像指纹简单点来讲,就是将图像按照一定的哈希算法,经过运算后得出的一组二进制数字。
说到这里,就可以顺带引出汉明距离的概念了。
假如一组二进制数据为101,另外一组为111,那么显然把第一组的第二位数据0改成1就可以变成第二组数据111,所以两组数据的汉明距离就为1
简单点说,汉明距离就是一组二进制数据变成另一组数据所需的步骤数,显然,这个数值可以衡量两张图片的差异,汉明距离越小,则代表相似度越高。汉明距离为0,即代表两张图片完全一样。
如何计算得到汉明距离,情况下面三种哈希算法
平均哈希法(aHash)
此算法是基于比较灰度图每个像素与平均值来实现的
1.缩放图片,可利用Image对象的resize(size)改变,一般大小为8*8,64个像素值。
2.转化为灰度图
转灰度图的算法。
1.浮点算法:Gray=Rx0.3+Gx0.59+Bx0.11
2.整数方法:Gray=(Rx30+Gx59+Bx11)/100
3.移位方法:Gray =(Rx76+Gx151+Bx28)&&8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
在python中,可用Image的对象的方法convert('L')直接转换为灰度图
3.计算平均值:计算进行灰度处理后图片的所有像素点的平均值。
4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
5.得到信息指纹:组合64个bit位,顺序随意保持一致性。
最后比对两张图片的指纹,获得汉明距离即可。
感知哈希算法(pHash)
平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
一般步骤:
缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
计算DCT:DCT把图片分离成分率的集合
缩小DCT:DCT是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率
计算平均值:计算缩小DCT后的所有像素点的平均值。
进一步减小DCT:大于平均值记录为1,反之记录为0.
得到信息指纹:组合64个信息位,顺序随意保持一致性。
最后比对两张图片的指纹,获得汉明距离即可。
这里给出别人的DCT的介绍和计算方法(离散余弦变换的方法)
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。
缩小图片:收缩到9*8的大小,一遍它有72的像素点
转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.
最后比对两张图片的指纹,获得汉明距离即可。
这几种算法是识别相似图像的基础,显然,有时两图中的人相似比整体的颜色相似更重要,所以我们有时需要进行人脸识别,
然后在脸部区进行局部哈希,或者进行其他的预处理再进行哈希,这里涉及其他知识本文不作介绍。
下一次将讲述利用opencv和以训练好的模型来进行人脸识别。
本文算法的实现在下面,点一下下面的连接就好
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具详细介绍Python中利用Scipy包的SIFT方法进行图片识别的实例- Python教程-PHP中文网QQ群微信公众号还没有收藏详细介绍Python中利用Scipy包的SIFT方法进行图片识别的实例scipyscipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,,特殊函数等等。scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了。作为非专业程序员,科学家总是喜欢重新发明造轮子,导致了充满漏洞的,未经优化的,很难分享和维护的代码。相反,Scipy程序经过优化和测试,因此应该尽可能使用。scipy由一些特定功能的子模块组成,它们全依赖numpy,但是每个之间基本独立。举个Debian系的Linux中安装的例子(虽然我在windows上用--):复制代码 代码如下:sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose导入Numpy和这些scipy模块的标准方式是:import numpy as np
from scipy import stats # 其它子模块相同主scipy命名空间大多包含真正的numpy函数(尝试 scipy.cos 就是 np.cos)。这些仅仅是由于历史原因,通常没有理由在你的代码中使用import scipy。使用图像匹配SIFT算法进行LOGO检测先上效果图:其中是logo标识,代码如下.#coding=utf-8
import cv2
import scipy as sp
img1 = cv2.imread('x1.jpg',0) # queryImage
img2 = cv2.imread('x2.jpg',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
# or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
print 'matches...',len(matches)
# Apply ratio test
for m,n in matches:
if m.distance & 0.75*n.distance:
good.append(m)
print 'good',len(good)
# #####################################
# visualization
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]
view = sp.zeros((max(h1, h2), w1 + w2, 3), sp.uint8)
view[:h1, :w1, 0] = img1
view[:h2, w1:, 0] = img2
view[:, :, 1] = view[:, :, 0]
view[:, :, 2] = view[:, :, 0]
for m in good:
# draw the keypoints
# print m.queryIdx, m.trainIdx, m.distance
color = tuple([sp.random.randint(0, 255) for _ in xrange(3)])
#print 'kp1,kp2',kp1,kp2
cv2.line(view, (int(kp1[m.queryIdx].pt[0]), int(kp1[m.queryIdx].pt[1])) , (int(kp2[m.trainIdx].pt[0] + w1), int(kp2[m.trainIdx].pt[1])), color)
cv2.imshow(&view&, view)
cv2.waitKey()更多详细介绍Python中利用Scipy包的SIFT方法进行图片识别的实例相关文章请关注PHP中文网!共3篇549点赞收藏分享:.&猜你喜欢PHP中文网:独家原创,永久免费的在线,php技术学习阵地!
All Rights Reserved | 皖B2-QQ群:关注微信公众号

我要回帖

更多关于 python 字符串匹配 的文章

 

随机推荐