
生成一张纯色的
先设置的颜色,接着利用Image模块的new方法新生成一张,png格式的需要设置成rgba,类似的还有rgb,L(灰度图等),尺寸设定为640,480,这个可以根据自己的情况设定,颜色同样如此。
批量生成
上面生成了一张,那要生成十张呢,这种步骤一样,只是颜色改变的,利用循环就可以解决。首先创建一个颜色列表,把要生成的颜色放进去。接着循环获取不同的颜色,保存的时候利用字符串拼接的方法改变的名字。
本地生成的
封装成函数
前面的方法已经可以批量生成了,为了通用性强一点,我们可以封装成函数,把哪些可以改变的参数单独抽离出来。尺寸也同样,使用的时候,可以根据自己的需要定义颜色列表和尺寸。当然还有加一些提示用语和报错兼容性,这里就不讲了。
本地生成的
python配对样本 *** 作步骤如下:
1、导入sklearn库和需要使用的数据集。
2、从数据集中获取特征和标签数据,将其分别存储在X和y变量中。
3、使用train_test_split函数将样本数据集分割成训练集和测试集。
4、使用分割后的训练集和测试集进行模型训练和测试。
Brute-Force匹配器基础
Brute-Force匹配器很简单,它取第一个集合里一个特征的描述子并用第二个集合里所有其他的特征和他通过一些距离计算进行匹配。最近的返回。
对于BF匹配器,首先我们得用cv2BFMatcher()创建BF匹配器对象它取两个可选参数,第一个是normType。它指定要使用的距离量度。默认是cv2NORM_L2。对于SIFT,SURF很好。(还有cv2NORM_L1)。对于二进制字符串的描述子,比如ORB,BRIEF,BRISK等,应该用cv2NORM_HAMMING。使用Hamming距离度量,如果ORB使用VTA_K == 3或者4,应该用cv2NORM_HAMMING2
第二个参数是布尔变量,crossCheck模式是false,如果它是true,匹配器返回那些和(i, j)匹配的,这样集合A里的第i个描述子和集合B里的第j个描述子最匹配。两个集合里的两个特征应该互相匹配,它提供了连续的结果,
当它创建以后,两个重要的方法是BFMatchermatch()和BFMatcherknnMatch()。第一个返回最匹配的,第二个方法返回k个最匹配的,k由用户指定。当我们需要多个的时候很有用。
想我们用cv2drawKeypoints()来画关键点一样,cv2drawMatches()帮我们画匹配的结果,它把两个图像水平堆叠并且从第一个图像画线到第二个图像来显示匹配。还有一个cv2drawMatchesKnn来画k个最匹配的。如果k=2,它会给每个关键点画两根匹配线。所以我们得传一个掩图,如果我们想选择性的画的话。
让我们各看一个SURF和ORB的例子(都使用了不同的距离度量)
使用ORB描述子的Brute-Force匹配
这里我们会看到如何匹配两个的里的特征。在这个例子里,我有一个查询图像和一个训练图像,我们用特征匹配来在训练图像里找查询图像。
我们使用SIFT描述子来匹配特征,所以让我们先加载图像,找到描述子。
接着我们用距离度量cv2NORM_HAMMING创建一个BFMatcher对象,crossCheck设为真。然后我们用Matchermatch()方法来获得两个图像里最匹配的。我们按他们距离升序排列,这样最匹配的(距离最小)在最前面。然后我们画出最开始的10个匹配(为了好看,你可以增加)
下面是结果:
什么是匹配器对象?
matches = bfmatch(des1, des2)的结果是DMatch对象列表。这个DMatch对象有下面的属性:
·DMatchdistance - 描述子之间的距离。越低越好
·DMatchtrainIdx - 训练描述子里的描述子索引
·DMatchqueryIdx - 查询描述子里的描述子索引
·DMatchimgIdx - 训练图像的索引
用SIFT描述子和比率测试的Brute-Force 匹配
这次,我们使用BFMatcherknnMatch()来获得k个最匹配的。在这个例子里,我们设置k=2这样我们可以应用比率检测。
看下面的结果
基于FLANN的匹配器
FLANN是快速估计最近邻的库。它包含了一些为大数据集内搜索快速近邻和高维特征的优化算法。它在大数据集的时候比BFMatcher更快。
对于基于FLANN的匹配器,我们需要传两个字典指定要用的算法,他们相关的参数等。第一个是IndexParams。对于更多算法,要传的信息参看FLANN的文档。作为总结,对于像SIFT,SURF等的算法,你可以传下面的:
当使用ORB,你可以传下面的。注释里的值是推荐的值。但是在有些情况下不提供需要的结果。其他的值工作正常。
第二个字典是SearchParams,它指定了索引里的树应该被递归遍历的次数。更高的值带来更高的准确率。但是也花更多时间,如果你想改变值,search_params = dict(checks=100)
通过这些信息,我们可以开始了:
结果:
END
Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
Python的特点如下:
1、简单
Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
2、易学
Python极其容易上手,因为Python有极其简单的说明文档 。
3、速度快
Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。
4、免费、开源
Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
5、高层语言
用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
6、可移植性
由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux开发的android平台。
7、解释性
一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。
运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行 程序。
在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。
8、面向对象
Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
9可扩展性
如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。
10、可嵌入性
可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。
11、丰富的库
Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的 *** 作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
12、规范的代码
Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。
参考资料来源:百度百科—Python
回顾了下PCA的步骤,并用python实现。深刻的发现当年学的特征值、特征向量好强大。
PCA是一种无监督的学习方式,是一种很常用的降维方法。在数据信息损失最小的情况下,将数据的特征数量由n,通过映射到另一个空间的方式,变为k(k<n)。
这里用一个2维的数据来说明PCA,选择2维的数据是因为2维的比较容易画图。
这是数据:
画个图看看分布情况:
协方差的定义为:
假设n为数据的特征数,那么协方差矩阵M, 为一个n n的矩阵,其中Mij为第i和第j个特征的协方差,对角线是各个特征的方差。
在我们的数据中,n=2,所以协方差矩阵是2 2的,
通过numpy我们可以很方便的得到:
得到cov的结果为:
array([[ 061655556, 061544444],
[ 061544444, 071655556]])
由于我们之前已经做过normalization,因此对于我们来说,
这个矩阵就是 datadata的转置矩阵。
得到结果:
matrix([[ 5549, 5539],
[ 5539, 6449]])
我们发现,其实协方差矩阵和散度矩阵关系密切,散度矩阵 就是协方差矩阵乘以(总数据量-1)。因此他们的 特征根 和 特征向量 是一样的。这里值得注意的一点就是,散度矩阵是 SVD奇异值分解 的一步,因此PCA和SVD是有很大联系的,他们的关系这里就不详细谈了,以后有机会再写下。
用numpy计算特征根和特征向量很简单,
但是他们代表的意义非常有意思,让我们将特征向量加到我们原来的图里:
其中红线就是特征向量。有几点值得注意:
蓝色的三角形就是经过坐标变换后得到的新点,其实他就是红色原点投影到红线、蓝线形成的。
得到特征值和特征向量之后,我们可以根据 特征值 的大小,从大到小的选择K个特征值对应的特征向量。
这个用python的实现也很简单:
从eig_pairs选取前k个特征向量就行。这里,我们只有两个特征向量,选一个最大的。
主要将原来的数据乘以经过筛选的特征向量组成的特征矩阵之后,就可以得到新的数据了。
output:
数据果然变成了一维的数据。
最后我们通过画图来理解下数据经过PCA到底发生了什么。
绿色的五角星是PCA处理过后得到的一维数据,为了能跟以前的图对比,将他们的高度定位12,其实就是红色圆点投影到蓝色线之后形成的点。这就是PCA,通过选择特征根向量,形成新的坐标系,然后数据投影到这个新的坐标系,在尽可能少的丢失信息的基础上实现降维。
通过上述几步的处理,我们简单的实现了PCA第一个2维数据的处理,但是原理就是这样,我们可以很轻易的就依此实现多维的。
用sklearn的PCA与我们的pca做个比较:
得到结果:
用我们的pca试试
得到结果:
完全一致,完美~
值得一提的是,sklearn中PCA的实现,用了部分SVD的结果,果然他们因缘匪浅。
以上就是关于python处理图片数据全部的内容,包括:python处理图片数据、python如何配对样本、OpenCV-Python教程:41.特征匹配等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)