网站首页 > 文章中心 > 其它

python模板匹配函数

作者:小编 更新时间:2023-12-24 12:36:04 浏览量:93人看过

常用的十大python图像处理工具

原文标题:10 Python image manipulation tools.

翻译 | 安其罗乔尔、JimmyHua

今天,在我们的世界里充满了数据,图像成为构成这些数据的重要组成部分.但无论是用于何种用途,这些图像都需要进行处理.图像处理就是分析和处理数字图像的过程,主要旨在提高其质量或从中提取一些信息,然后可以将其用于某种用途.

图像处理中的常见任务包括显示图像,基本操作如裁剪、翻转、旋转等,图像分割,分类和特征提取,图像恢复和图像识别.Python成为这种图像处理任务是一个恰当选择,这是因为它作为一种科学编程语言正在日益普及,并且在其生态系统中免费提供许多最先进的图像处理工具供大家使用.

python模板匹配函数-图1

让我们看一下可以用于图像处理任务中的常用 Python 库有哪些吧.

①scikit-image

scikit-image是一个开源的Python包,适用于numpy数组.它实现了用于研究,教育和工业应用的算法和实用工具.即使是那些刚接触Python生态系统的人,它也是一个相当简单直接的库.此代码是由活跃的志愿者社区编写的,具有高质量和同行评审的性质.

资源

文档里记录了丰富的例子和实际用例,阅读下面的文档:

用法

python模板匹配函数-图2

该包作为skimage导入,大多数功能都在子模块中找的到.下面列举一些skimage的例子:

图像过滤

使用match_template函数进行模板匹配

你可以通过此处查看图库找到更多示例.

Numpy是Python编程的核心库之一,并为数组提供支持.图像本质上是包含数据点像素的标准Numpy数组.所以呢,我们可以通过使用基本的NumPy操作,例如切片、掩膜和花式索引,来修改图像的像素值.可以使用skimage加载图像并使用matplotlib显示图像.

Numpy的官方文档页面提供了完整的资源和文档列表:

使用Numpy来掩膜图像.

scipy是Python的另一个类似Numpy的核心科学模块,可用于基本的图像操作和处理任务.特别是子模块scipy.ndimage,提供了在n维NumPy数组上操作的函数.该包目前包括线性和非线性滤波,二值形态学,B样条插值和对象测量等功能函数.

有关scipy.ndimage包提供的完整功能列表,请参阅下面的链接:

使用SciPy通过高斯滤波器进行模糊:

文档中有安装说明,以及涵盖库的每个模块的示例:

在 Pillow 中使用 ImageFilter 增强图像:

OpenCV( 开源计算机视觉库 )是计算机视觉应用中应用最广泛的库之一 .OpenCV-Python 是OpenCV的python版API.OpenCV-Python的优点不只有高效,这源于它的内部组成是用C/C++编写的,而且它还容易编写和部署(因为前端是用Python包装的).这使得它成为执行计算密集型计算机视觉程序的一个很好的选择.

OpenCV-Python-Guide指南可以让你使用OpenCV-Python更容易:

下面是一个例子,展示了OpenCV-Python使用金字塔方法创建一个名为"Orapple"的新水果图像融合的功能.

SimpleCV 也是一个用于构建计算机视觉应用程序的开源框架.有了它,你就可以访问几个高性能的计算机视觉库,如OpenCV,而且不需要先学习了解位深度、文件格式、颜色空间等.

它的学习曲线大大小于OpenCV,正如它们的口号所说"计算机视觉变得简单".一些支持SimpleCV的观点有:

即使是初学者也可以编写简单的机器视觉测试摄像机、视频文件、图像和视频流都是可互操作的资源

官方文档非常容易理解,而且有大量的例子和使用案例去学习:

Mahotas 是另一个计算机视觉和图像处理的Python库.它包括了传统的图像处理功能例如滤波和形态学操作以及更现代的计算机视觉功能用于特征计算,包括兴趣点检测和局部描述符.该接口是Python语言,适合于快速开发,但是算法是用C语言实现的,并根据速度进行了调优.Mahotas库速度快,代码简洁,甚至具有最小的依赖性.通过原文阅读它们的官方论文以获得更多的了解.

文档包括安装指导,例子,以及一些教程,可以更好的帮助你开始使用mahotas.

Mahotas库依赖于使用简单的代码来完成任务.关于'Finding Wally'的问题,Mahotas做的很好并且代码量很少.下面是源码:

ITK 或者 Insight Segmentation and Registration Toolkit是一个开源的跨平台系统,为开发人员提供了一套广泛的图像分析软件工具 .其中, SimpleITK是建立在ITK之上的简化层,旨在促进其在快速原型设计、教育、解释语言中的应用.SimpleITK 是一个图像分析工具包,包含大量支持一般过滤操作、图像分割和匹配的组件.SimpleITK本身是用C++写的,但是对于包括Python以内的大部分编程语言都是可用的.

大量的Jupyter Notebooks 表明了SimpleITK在教育和研究领域已经被使用.Notebook展示了用Python和R编程语言使用SimpleITK来进行交互式图像分析.

有一个专门用于PgMagick的Github库 ,其中包含安装和需求说明.还有关于这个的一个详细的用户指导:

使用pgmagick可以进行的图像处理活动很少,比如:

图像缩放

边缘提取

①.0. Pycairo

Pycairo的GitHub库是一个很好的资源,有关于安装和使用的详细说明.还有一个入门指南,其中有一个关于Pycairo的简短教程.

库:指南:用法

使用Pycairo绘制线条、基本形状和径向梯度:

总结

有一些有用且免费的Python图像处理库可以使用,有的是众所周知的,有的可能对你来说是新的,试着多去了解它们.

模板匹配概述

模板匹配是通过一张模板图片去另一张图中找到与模板相似部分的一种算法.一个模板是一张小图片,这个图片有一定的尺寸,有角度(一般是不旋转的矩形, 角度为0).

模板匹配算法一般是通过滑窗的方式在待匹配的图像上滑动,通过比较模板与子图的相似度,找到相似度最大的子图.这种算法最核心部分在于如何设计一个相似性函数.

最容易想到的一个相似性函数便是欧式距离:

可以看出,只有第二项是有意义的,因为第一项和第三项的值在选定模板后是固定的.对于欧式距离相似函数,值越大表示越不相似,也就是说,第二项的值越小则越不相似.

将第二项进行归一化:

那么当R(i, j)为1时,表示模板与子图完全相等.

const CvArr* template,//搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型

若图像是WXH而templ是wXh,则result一定是(W-w+1)X(H-h+1)

int method//CV_TM_SQDIFF、CV_TM_SQDIFF_NORMED、CV_TM_CCORR、

python模板匹配函数-图3

CV_TM_CCORR_NORMED、CV_TM_CCOEFF、CV_TM_CCOEFF_NORMED

);

函数来进行模板匹配.其中的method参数具体如下:

在通过matchTemplate函数进行模板匹配后,可以得到一个映射图,这张图中最大值的地方便是匹配度最大的子图的左上角坐标,可以使用cv::minMaxLoc函数获得子图位置和相应分数,再进行后续操作.

使用传统的模板匹配速度较快,但是无法应对旋转和缩放问题.要解决旋转不变的 问题,必须要得到旋转不变的特征量,例如特征点.

使用SIFT或SURF计算得到模板和待匹配图像的特征点,然后使用RANSAC或者FLANN进行特征点匹配, 最后进行仿射变换便可得到匹配的位置.

python opencv实现(surf):

author = 'Microcosm'

运行的具体信息如下:

运行环境:

匹配效果:

验证码识别之模板匹配方法

在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:

- 图像灰度化

- 图像去噪(如图像二值化)

- 切割图片

- 提取特征

- 训练

但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符 .

本文要介绍的算法 不需要进行图片切割,也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板.

这篇文章将分为两个部分:

第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;

第二部分是一个具体实例.

模板匹配是在图像中寻找目标的方法之一,目的就是在一幅图像中寻找和模板图像最相似的区域.

模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配.

假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:

从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;

切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到相似度矩阵;

重复上述步骤,直到输入图像的右下角.

最终得到一个相似度矩阵,找到矩阵中的最大或最小值,最大值(最小值)对应的临时图像即为与模板最相似的图像.

在步骤b中,求模板与图像的相似度有多种方法,如平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、归一化互相关算法(NCC),本文使用的是归一化互相关算法.

什么是归一化互相关?

此时此刻呢让我们看一个具体的应用.

模板匹配识别验证码的具体步骤为:

① 找出图片中所有可能出现的字符,制作成模板集合

要识别的图片如下,以识别图片中的加字为例:

遍历模板图像集合,与图像匹配,如果dist大于阈值h,则认为此模板在图像中存在,否则不存在,继续匹配下一个模板,直到遍历完所有模板.

但这是比较好的情况,因为在匹配时遍历了所有的模板,而一张图片中出现的模板数量是有限的,比如数字'四'在图片中是没有的,这时就要根据某种规则去掉这些在图片中没有出现的模板:程序中使用dist变量来过滤匹配结果,如果dist变量大于某个值则认为此模板在图像中不存在.

最后的result_list中可能仍然存在一些图片中不存在的模板或者匹配不精确的模板,比如数字'一'在模板中不存在,但仍然可以匹配到,因为数字'二'中可以匹配到'一',需要进一步优化,优化方法有很多,比如当匹配到的两个模板距离过近时,选择较大的那个模板,其余方法留给读者自行考虑吧.

后续将会推出如何使用深度学习识别验证码,敬请期待~

参考文献:

J. P. Lewis, "Fast Normalized Cross-Correlation", Industrial Light and Magic.

以上就是土嘎嘎小编为大家整理的python模板匹配函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章