1、机器学习与大数据技术作者:牟少敏教授第九章p 矩阵计算p 网络爬虫p 数据库p OpenCV图像编程 Python数据处理与机器学习数据处理与机器学习p 数据可视化p 基于Python机器学习算法p 基于Python大数据处理技术p Tensorflow编程创新与贡献研究意义选题背景第九章 本章主要介绍了如何用python进行数据处理和实现机器学习中常用算法的实现。学习目标创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算 矩阵在图像处理和机器学习中应用非常广泛。numpy是Python中关于矩阵运算的库,能够完成矩阵加减乘除、矩阵转置、逆矩阵、行列式、矩阵的幂、伴随矩阵等功能。创新与贡
2、献研究意义选题背景第九章9.1 矩阵计算矩阵计算9.1.1基础知识1 numpy基础 numpy包含数组和矩阵两种基本的数据类型,有许多创建数组的函数,只有创建数组才能对其进行相关的操作。通过给array函数传递对象来创建数组,首先需要使用import语句导入numpy库。若使用的是import numpy命令,则在创建数组时用a=numpy.array(1,2,3,4)的形式;若导使用的是import numpy as np命令,则在创建数组时用a=np.array(1,2,3,4)。创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算例9-1 使用numpy创建矩阵,然后打印出来,源码
3、如下。import numpyimport numpy as np test1=np.array(1,2,3,3,4,5)print(test1.shape)print(test1.ndim)#打印数组维数。print(test1.min()#打印最小值print(test1.sum()#打印矩阵所有元素的和print(test10)#矩阵的取值,这里取第一行print(test10,2)#打印第一行的第3个元素 使用array函数创建数组时,参数必须是由方括号括起来的列表,而不能是多个数值。可使用双重序列来表示二维数组,三重序列表示三维数组,以此类推创新与贡献研究意义选题背景第九章9.1 矩
4、阵计算矩阵计算调用shape方法,可获取矩阵的大小,例如:(4,):shape有一个元素即为一维数组,数组中有4个元素;(3,4):shape有两个元素即为二维数组,数组为3行4列。例9-7 使用sum(axis=1)方法对矩阵进行行求和,源码如下。test1=np.array(5,10,15,20,25,30,35,40,45)test1.sum(axis=1)输出结果:array(30,75,120)例9-8 使用sum(axis=0)方法对矩阵进行列求和,源码如下。test1=np.array(5,10,15,20,25,30,35,40,45)test1.sum(axis=0)#输出a
5、rray(60,75,90)(2)矩阵行列计算(1)求矩阵大小创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算(3)最值计算(4)矩阵转置 T表示矩阵的转置矩阵,也适用于高维向量。例9-12 求矩阵test转置矩阵,源码如下。test.shape=(6,2)print(test)输出结果:4.8.8.0.6.9.9.2.4.0.0.0.test.T#计算转置输出结果:array(4.,8.,6.,9.,4.,0.,8.,0.,9.,2.,0.,0.)创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算(5)矩阵乘法例9-14 对矩阵a和b进行乘法计算,源码如下。import num
6、py as npa=np.array(1,2,3,4)b=np.array(5,6,7,8)print(a*b)#对应位置元素相乘print(a.dot(b)#矩阵乘法print(np.dot(a,b)#矩阵乘法#输出 5 12 21 32 19 22 43 50 19 22 43 50 创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算(6)创建矩阵例9-17创建1矩阵,源码如下。np.ones(3,3)#创建3*3的全1矩阵。输出结果:array(1.,1.,1.,1.,1.,1.,1.,1.,1.)例9-16 创建全0矩阵,源码如下。np.zeros(3,3)#创建3行3列的0矩阵
7、array(0.,0.,0.,0.,0.,0.,0.,0.,0.)np.zeros(3,3),dtype=np.str)#在创建时指定数据类型输出结果:array(,dtype=np.eye(2,dtype=int)输出结果:array(1,0,0,1)a1=1,2,3np.diag(a1)输出结果:array(2,0,0,0,4,0,0,0,6)(7)对角矩阵创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算伴随矩阵的求法:把矩阵的各个元素都换成它相应的代数余子式,将所得到的矩阵转置便得到A的伴随矩阵。例9-21 求矩阵a的逆矩阵,源码如下。a=np.linalg.inv(a)#矩阵a
8、的逆矩阵b=np.linalg.det(a)#方阵的行列式a*b#伴随矩阵为逆矩阵与方阵行列式的乘积np.linalg.norm(a,ord=None)#计算矩阵a的范数(8)伴随矩阵创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算(9)数组的特征信息 例9-23将矩阵a进行分隔,同列表和数组的分隔一致,源码如下。a=np.mat(np.ones(3,3)matrix(1.,1.,1.,1.,1.,1.,1.,1.,1.)b=a1:,1:/分割出第二行以后的行和第二列以后的列的所有元素matrix(1.,1.,1.,1.)(10)矩阵的分隔和合并(11)索引 numpy中的数组索引形式
9、和Python是一致的。创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算2矩阵函数(1)扩展矩阵函数tile()tile函数功能是重复某个数组,例如tile(A,n)是将数组A重复n次,构成一个新的数组,函数语法格式如下:tile(A,reps)A是array,list,tuple,dict,matrix以及基本数据类型int,string,float以及bool类型。reps的类型可以是tuple,list,dict,array,int,bool,但不可以是float,string,matrix类型。tile(a,x):x是控制a的重复次数,结果是一个一维数组。tile(a,(x,y
10、):结果是一个二维矩阵,行数为x,列数是一维数组a的长度和y的乘积。tile(a,(x,y,z):结果是一个三维矩阵,矩阵的行数为x,矩阵的列数为y,而z表示矩阵每个单元格里a重复的次数,三维矩阵可以看成一个二创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算维矩阵,每个矩阵的单元格里存者一个一维矩阵a。(2)range()和arange()函数range函数返回一个列表对象。arange()函数与range()函数类似,但是返回一个array对象,并且arange可以使用float型数据。函数包含三个参数,前两个参数是等差数列的数据范围,第一个参数是等差数列第一个元素,第二个参数是等差
11、数列最后一个元素,第三个参数是等差数列的公差,例9-27 range()和arange()函数应用实例,源码如下。import numpy as npnp.arange(1,10,0.5)运行结果:array(1.,1.5,2.,2.5,3.,3.5,4.,4.5,5.,5.5,6.,6.5,7.,7.5,8.,8.5,9.,9.5)创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算9.1.2应用举例 numpy.linalg模块包含各种线性代数的函数,可以实现逆矩阵、求特征值、解线性方程组以及行列式等计算。l 计算逆矩阵l 求解线性方程组创新与贡献研究意义选题背景第九章9.1 矩阵计算
12、矩阵计算1计算逆矩阵 例9-28一个创建矩阵A,使用inv函数计算其逆矩阵,源码如下。A=np.mat(0 1 2;12 3;4 3 3)print(A)输出结果:matrix(0,1,2,1,2,3,4,3,3)matrix(0,1,2,1,2,3,4,3,3)inv=np.linalg.inv(A)print(inv)输出结果:inv=np.linalg.inv(A)print(inv)输出结果:matrix(3.,-3.,1.,-9.,8.,-2.,5.,-4.,1.)检查原矩阵和求得的逆矩阵相乘的结果是否为单位矩阵:print(A*inv)输出结果:1.0.0.0.1.0.0.0.1.
13、需要注意的是矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算numpy.linalg中的函数solve可以求解形如Ax=b的线性方程组,其中A为矩阵,b为一维或二维的数组,x是未知变量。例9-29 使用solve函数求解线性方程组实例,源码如下。import numpy as np#创建矩阵和数组B=np.mat(1-2 1;0 2-8;-4 5 9)b=np.array(0,8,-9)#调用solve函数求解线性方程x=np.linalg.solve(B,b)print(x)array(29.,16.,3.)#使用dot函数
14、检查求得的解是否正确print(np.dot(B,x)0.8.-9.2 求解线性方程组创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算特征值即方程Ax=ax的根,其中A是一个二维矩阵,x是一个一维向量。在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组。例9-30 使用eigvals函数求特征值和特征向量,源码如下。import numpy as np#创建一个矩阵C=np.mat(3-2;1 0)#调用eigvals函数求解特征值c0=np.linalg.eigvals(C)print(c0)array(
15、2.,1.)使用eig函数可以求解特征值和特征向量,该函数将返回一个元组,按列存放特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量。3 特征值和特征向量创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算 奇异值分解是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。例9-32 使用svd函数进行奇异值分解,源码见二维码。#结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma。使用diag函数可以生
16、成完整的奇异值矩阵,将分解出的3个矩阵相乘。print(U*np.diag(Sigma)*V)4.11.14.8.7.-2.4 奇异值分解创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算 使用numpy.linalg模块中的pinv函数进行求解广义逆矩阵,inv函数只接受方阵作为输入矩阵。例9-33 使用pinv函数求解广义逆矩阵,源码如下。import numpy as np#创建一个矩阵E=np.mat(4 11 14;8 7-2)pseudoinv=np.linalg.pinv(E)#使用pinv函数计算广义逆矩阵print(pseudoinv)matrix(-0.0055555
17、6,0.07222222,0.02222222,0.04444444,0.05555556,-0.05555556)#将原矩阵和得到的广义逆矩阵相乘print(E*pseudoinv)1.00000000e+00 -7.77156117e-16 -1.11022302e-16 1.00000000e+005 广义逆矩阵创新与贡献研究意义选题背景第九章9.1 矩阵计算矩阵计算numpy.linalg模块中的det函数可以计算矩阵的行列式。例9-34 使用det函数对行列式进行计算,源码如下。import numpy as np#计算矩阵的行列式F=np.mat(1 4;1 6)matrix(1,
18、4,1,6)#使用det函数计算行列式print(np.linalg.det(F)2.06 行列式计算创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫9.2.1基础知识 网络爬虫是按照一定的规则,自动地抓取互联网信息的程序或者脚本。网络爬虫的定义为:利用标准的http 协议,根据超级链接和Web 文档检索的方法遍历万维网信息空间的软件程序。网络爬虫被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,供搜索引擎做进一步处理,使得用户能更快的检索到他们需要的信息。大数据背景下,各行各业都需要数据支持,在浩瀚的数据中获取感兴趣的数据成为了研究热点。在数据搜索方面,
19、现在的搜索引擎虽然比刚开始有了很大的进步,但对于一些特殊数据搜索或复杂搜索,还不能很好的完成,所得到数据不能满足需求。网络安全,产品调研等研究都需要数据支持,而网络上没有现成的数据,需要自己手动去搜索、分析,格式化为满足需求的数据。利用网络爬虫技术能自动完成数据获取,汇总的工作,大大提升了工作效率。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫(1)Python语言简洁,简单易学;(2)Python使用方便,不需要笨重的 IDE,只需要一个文本编辑器,就可以进行大部分中小型应用的开发。(3)Python有功能强大的爬虫框架 Scrapy。Scrapy 是一个为了爬 取网站数据,提取结
20、构性数据而编写的应用框架,可以应用在包括数据挖掘、信息处理或存储历史数据等一系列的程序中。(4)Python有强大的网络支持库以及 html 解析器。使用网络支持库requests,可以方便地下载网页;使用网页解析库 Beautiful Soup,可以方便地解析网页各个标签,再结合正则表达式抓取网页中的内容。(5)Python十分擅长处理文字字符串。包含了常用的文本处理函数,支持正则表达式,可以方便地处理文本内容。使用Python语言编写网络爬虫有很多优点。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫 从功能上来讲,网络爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或者多个初
21、始 URL 开始,下载网页内容,然后通过搜索或是内容匹配手段获取网页中感兴趣的内容,同时不断从当前页面提取新的 URL。程序根据网页抓取策略,按一定的顺序放入待抓取 URL 队列中,整个过程循环执行,直到满足系统相应的停止条件。然后对这些被抓取的数据进行清洗、整理、建立索引,存入数据库或文件中。最后根据查询需要,从数据库或文件中提取相应的数据,以可视化的方式展示出来。在网络爬虫系统中,待抓取 URL 队列是很重要的一部分,待抓取 URL 队列中的 URL以什么样的顺序排列也是十分重要的问题,这涉及到优先抓取哪个页面,再抓取哪个页面。而决定这些URL排列顺序的方法称为做抓取策略,可以分为深度优先
22、、广度优先和最佳优先三种。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫(1)广度优先搜索策略。这种策略的主要思想是,由根节点开始,首先遍历当前层次的搜索,然后才进行下一层的搜索,依次类推逐层的搜索。这种策略多用在主题爬虫上,因为越是与初始 URL 距离近的网页,其具有的主题相关性越大。在宽度优先搜索中,先搜索完一个Web页面中所有的超级链接,然后再继续搜索下一层,直到底层为止。例如一个HTML 文件中有3个超级链接,选择其中之一,处理相应的HTML文件,然后不再选择第二个HTML文件中的任何超级链接,而是返回,选择第二个超级链接,处理相应的HTML文件,再返回,选择第三个超级链接,
23、并处理相应的HTML文件。一旦一层上的所有超级链接都被选择过,就开始在刚才处理过的HIML文件中搜索其余的超级链接。这保证了对浅层的首先处理。当遇到一个无穷尽的深层分支时,不会导致陷进深层文档中无法出来。宽度优先搜索策略能在两个HTML文件之间找到最短路径。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫(2)深度优先搜索策略。这种策略的主要思想是,从根节点出发找出叶子节点,然后以此类推。在一个网页中选择一个超链接,被链接的网页将执行深度优先搜索,形成单独的一条搜索链,当没有其他超链接时,搜索结束。深度优先搜索是在开发爬虫早期使用较多的方法,它的目的是要达到被搜索结构的叶结点。在一个H
24、TML文件中,当一个超级链接被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超级链接结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超级链接走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超级链接。当不再有其他超级链接可选择时,说明搜索已经结束。这种方法优点是能遍历一个Web站点或深层嵌套的文档集合。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫(3)最佳优先搜索策略。这种策略的主要思想是,聚焦爬虫的爬行策略只跳出某个特定主题的页面,根据“最好优先原则”进行访问,快速地获得更多的与主题相关的页面。主要通过内容与W
25、eb的链接结构指导进一步的页面抓取。聚焦爬虫会给它所下载的页面一个评价分,根据得分排序插入到一个队列中。最好的下一个搜索对弹出队列中的第一个页面进行分析后执行,这种策略保证爬虫能优先跟踪那些最有可能链接到目标页面的页面。决定网络爬虫搜索策略的关键是如何评价链接价值,不同的价值评价方法计算出的链接的价值不同,表现出的链接的“重要程度”也不同,从而决定了不同的搜索策略。由于链接包含于页面之中,而通常具有较高价值的页面包含的链接也具有较高价值,因而对链接价值的评价有时也转换为对页面价值的评价。这种策略通常运用在专业搜索引擎中,因为这种搜索引擎只关心某一特定主题的页面。创新与贡献研究意义选题背景第九章
26、9.2 网络爬虫网络爬虫1 urlib 在Python3中,可以使用urlib组件抓取网页,urllib是一个URL处理包,它集合了一些处理URL的模块,常用模块如下:urllib.request模块是用来打开和读取URLs。urllib.error模块包含一些有urllib.request产生的错误,可以使用try进行异常处理。urllib.parse模块包含了一些解析URLs的方法。urllib.robotparser模块用来解析robots.txt文本文件,它提供了一个单独的RobotFileParser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。创新与贡献
27、研究意义选题背景第九章9.2 网络爬虫网络爬虫 urllib使用使用request.urlopen()打开和读取URLs信息,返回的对象response是一个文本对象,可以用read()方法进行读取,再通过print()方法将读到的信息打印出来。这样成功获取了信息,但是显示的是二进制乱码,可以通过decode()命令将网页的信息进行解码,并正确显示出来。例9-35 使用urllib.request.urlopen()接口函数打开一个网站,读取并打印信息。from urllib import request if _name_=_main_:response=request.urlopen(ht
28、tp:/)html=response.read()print(html)例9-36 通过decode()命令对网页的信息进行解码,源码如下。from urllib import request if _name_=_main_:response=request.urlopen(http:/ 网络爬虫网络爬虫 url不仅可以是一个字符串,也可以是一个Request对象,这就需要先定义一个Request对象,然后将这个Request对象作为urlopen的参数使用,urlopen()返回的对象,可以使用read()进行读取,同样也可以使用geturl()方法、info()方法、getcode()方
29、法。geturl()返回的是一个url的字符串,info()返回的是一些meta标记的元信息,包括一些服务器的信息,getcode()返回的是HTTP的状态码。data参数分为GET和POST两种,用于向服务器发送数据。根据HTTP规范,GET用于信息获取,POST用于向服务器提交数据。从客户端向服务器提交数据使用POST,从服务器获得数据到客户端使用GET。如果没有设置urlopen()函数的data参数,默认采用GET方式,也就是从服务器获取信息,如果设置data参数为POST,也就是向服务器传递数据。创新与贡献研究意义选题背景第九章9.2 网络爬虫网络爬虫2 Scrapy Scrapy是
30、为了爬取网站数据并且提取结构性数据而编写的应用框架,可以应用于数据挖掘,信息处理或存储历史数据等一些程序中。使用scrapy框架可以更方便的对爬取的数据进行管理。直接使用pip install scrapy命令安装Scrapy所依赖的环境。找存放Scrapy文件的地方执行命令scrapy startproject get_pachong,然后生成一个包含了Scrapy必要文件的文件夹,在这个文件夹中新建一个pachong.py文件,用来编写爬虫的代码,例2-4是pachong.py的代码。在get_pachong文件里面打开cmd输入执行文件的命令scrapy crawl pachong,就可
31、以得到运行的结果。创新与贡献研究意义选题背景第九章9.3 数据库 数据库技术的发展为各行各业都带来了很大方便,金融行业、聊天系统、各类网站、办公自动化系统、各种管理信息系统等都少不了数据库技术的支持。本小节主要绍Sqlite、MySQL两种数据库的Python接口,并通过几个示例来演示数据的增、删、改、查等操作。创新与贡献研究意义选题背景第九章9.3 数据库9.3.1 Sqlite数据库 Sqlite是内嵌在Python中的轻量级、基于磁盘文件的数据库管理系统,不需要服务进程,支持使用SQL语句来访问数据库。支持原子的、一致的、独立的和持久的事务,不支持外键限制。通过数据库级的独占性和共享锁定
32、来实现独立事务,当多个线程同时访问同一个数据库并试图写入数据时,每一时刻只有一个线程可以写入数据。Sqlite支持140TB的数据库,每个数据库完全存储在单个磁盘文件中,以B+数据结构的形式存储。访问和操作SQLite数据时,需要首先导入sqlite3模块,然后创建一个与数据库关联的Connection对象:import sqlite3 conn=sqlite3.connect(example.db)创新与贡献研究意义选题背景第九章9.3 数据库 成功创建Connection对象以后,再创建一个Cursor对象,并且调用Cursor对象的execute()方法执行SQL语句,创建数据表以及查询
33、、插入、修改或删除数据库中的数据例9-39 使用Cursor对象进行简单数据库操作,源码如下。c=conn.cursor()c.execute(CREATE TABLE stocks(date text,trans text,symbol text,qty real,price real)c.execute(INSERT INTO stocks VALUES(2006-01-05,BUY,RHAT,100,35.14)mit()conn.close()创新与贡献研究意义选题背景第九章9.3 数据库 如果需要查询表中内容,重新创建Connection对象和Cursor对象之后,可以使用下面的代码
34、来查询:for row in c.execute(SELECT*FROM stocks ORDER BY price):print(row)创新与贡献研究意义选题背景第九章9.3 数据库1 Connection对象 Connection是sqlite3模块中最基本的类,Connection对象使用方法如下:connect(database,timeout,isolation_level,detect_types,factory):连接数据库文件。sqlite3.Connection.execute():执行SQL语句;sqlite3.Connection.cursor():返回游标对象;sql
35、ite3.Cmit():提交事务;sqlite3.Connection.rollback():回滚事务;sqlite3.Connection.close():关闭连接。创新与贡献研究意义选题背景第九章9.3 数据库2 Cursor对象 Cursor也是sqlite3模块中重要的类,Cursor对象使用方法如下:close():关闭游标;(sqlite3.Connection 与上文一致)execute():执行SQL语句;executemany():重复执行多次SQL语句;executescript():一次执行多条SQL语句;fetchall():从结果集中返回所有行记录;fetchmany
36、():从结果集中返回多行记录;fetchone():从结果集中返回一行记录,3 Row对象例9-42 row对象方法应用实例,源码见二维码。创新与贡献研究意义选题背景第九章9.3 数据库9.3.2 MySQL数据库 Python标准数据库接口为Python DB-API,它提供了数据库应用的编程接口。1 安装MySQLdbMySQLdb是用于Python链接Mysql数据库的接口,它实现了Python数据库API规范V2.0,它是基于MySQL C API建立的。安装MySQLdb,访http:/ 数据库连接3 创建数据库表创新与贡献研究意义选题背景第九章9.3 数据库4 数据库增删改查(1)
37、数据增加(2)数据删除 删除操作用于删除数据表中的数据。(3)数据修改(4)数据删除 删除操作用于删除数据表中的数据。5 数据库执行事务 Python DB API 2.0的事务提供了两个方法commit和rollback。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程OpenCV(Open Source Computer Vision Library)诞生于Intel研究中心,是一个开放源码的计算机视觉库,采用C和C+语言编写,可以运行在Linux、Windows和Mac等操作系统上。OpenCV提供了Python、Ruby、MATLAB以及其他语言的接口,其包含的函数有500
38、多个,覆盖了计算机视觉的许多应用领域。下面介绍基于Python的OpenCV图像编程。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程9.4.1图像基础操作1 图像读入与显示 使用cv2.imread()函数可以读入图像,图像路径需要在此程序的工作空间中,或者向函数提供图像完整的路径。图像的读入方式有两种参数:cv2.IMREAD_COLOR,以彩色模式读入图像,为默认读取方法;cv2.IMREAD_GRAYSCALE,以灰度模式读入图像。例9-50使用cv2.imread()方法读入图像,源码如下。import numpy as npimport cv2img=cv2.imrea
39、d(messi5.jpg,0)创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程 使用函数cv2.imshow()显示图像时,窗口可以根据图像的尺寸自动调整大小,同时可以创建多个窗口。例9-51使用cv2.imshow方法显示图像,源码如下。cv2.imshow(image,img)cv2.waitKey(0)cv2.destroyAllWindows()创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程2 修改像素值例9-52读入一副图像,然后对其像素值进行修改,源码如下。import cv2import numpy as npimg=cv2.imread(/home/d
40、uan/workspace/opencv/images/roi.jpg)px=img100,100print(px)blue=img100,100,0print(blue)根据像素的行和列的坐标获取其像素值,RGB图像的返回值为B,G,R的值,灰度图像的返回值是相应的灰度值。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程3 获取图像属性 图像的属性包括行、列、通道、图像数据类型和像素数目等,OpenCV自带许多获取图像属性的函数。img.shape方法可以获取图像的形状,返回值是一个包含行数、列数和通道数的元组。例9-53 读入一副图像,然后获取图像的形状属性,源码如下。impo
41、rt cv2import numpy as npimg=cv2.imread(/home/duan/workspace/opencv/images/roi.jpg)print(img.shape)创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程img.size方法返回值是图像的像素数目。例9-54读入一副图像,然后获取图像的像素数目,源码如下。import cv2import numpy as npimg=cv2.imread(/home/duan/workspace/opencv/images/roi.jpg)print(img.size)创新与贡献研究意义选题背景第九章9.4
42、OpenCV图像编程9.4.2图像几何变换1 缩放图像缩放是指改变原始图像的尺寸,在OpenCV中可以使用cv2.resize()方法实现图像的缩放。2 平移 图像平移将对象向某个方向移动一定距离,如果沿(x,y)方向移动,移动的距离是(tx,ty),可以使用下面移动矩阵:yxttM10013 旋转旋转是把一个图像旋转一定角度,可以使用如下面形式的旋转矩阵。yxttM1001创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程OpenCV允许在任意坐标进行旋转,此时旋转矩阵的形式为。xcenterxcenterycenterxcenterM)1(1)1(OpenCV提供cv2.getR
43、otationMatrix2D函数构建图像旋转矩阵。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程9.4.3图像滤波 OpenCV可以对图像进行低通滤波,高通滤波等操作,低通滤波帮助去除图像噪音,高通滤波用于寻找图像的边缘。1 均值滤波 均值滤波需要使用一个归一化卷积框,将卷积框覆盖区域所有像素的平均值代替中心元素的值。在OpenCV中可以使用cv2.blur()函数和cv2.boxFilter()函数完成均值滤波操作。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程2 高斯滤波 高斯滤波可以有效的从图像中去除高斯噪音。Python中使用cv2.GaussianBlu
44、r()函数完成图像高斯滤波操作,需要指定高斯核宽和高以及高斯函数沿X,Y 方向的标准差。3 中值滤波 中值滤波使用卷积框中所有像素的中值替代中心像素的值,经常用来去除椒盐噪声,Python中使用cv2.medianBlur()函数完成图像中值滤波操作。创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程9.4.4数学形态学 形态学转换是对图像形状进行操作,两个基本的形态学操作是腐蚀和膨胀。腐蚀就像土壤侵蚀一样,会把前景物体的边界腐蚀掉。卷积核沿着图像滑动,如果与卷积核对应的原图像中所有像素值都为1,那么中心元素就保持原来的像素值,否则变为0。因此腐蚀操作会使前景物体会变小,整幅图像的白
45、色区域减少。腐蚀经常用于去除白噪声,或者用来断开两个相连的物体。例9-61 使用一个5x5的卷积核进行图像腐蚀,源码如下。import cv2import numpy as npimg=cv2.imread(j.png,0)kernel=np.ones(5,5),np.uint8)erosion=cv2.erode(img,kernel,iterations=1)创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程 膨胀与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1,膨胀操作会增加图像中的白色区域。膨胀通常用来连接两个分开的物体。一般对图像进行去噪时先
46、进行腐蚀再用膨胀,因为腐蚀在去掉白噪声的同时,也会使前景对象变小。例9-62使用一个5x5的卷积核进行图像膨胀,源码如下。import cv2import numpy as npimg=cv2.imread(j.png,0)kernel=np.ones(5,5),np.uint8)dilation=cv2.dilate(img,kernel,iterations=1)创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程1 区域面积检测例9-63 计算一张二值化图像中黑色部分面积所占比例,源码如下。import cv2import numpy as np9.4.5应用举例img=cv2.
47、imread(xp2.jpg)b=0w=0for i in range(img.shape0):for j in range(img.shape1):if imgi,j,0=0:w=w+1 创新与贡献研究意义选题背景第九章9.4 OpenCV图像编程all=img.shape0*img.shape1print(w/all)cv2.imshow(,img)cv2.waitKey(0)例9-65使用K值聚类的方法进行颜色量化,源码见二维码。运行结果如图9-2所示。图9-2 图像量化结果创新与贡献研究意义选题背景第九章9.5 数据可视化9.5.1 matplotlib可视化 matplotlib模块
48、依赖于numpy模块和tkinter模块,可以绘制多种形式的图形,包括线图、直方图、饼状图、散点图、误差线图等等。例9-67 使用matplotlib绘制散点图,源码如下。a=np.arange(0,2.0*np.pi,0.1)b=np.cos(a)pl.scatter(a,b)pl.show()例如:创新与贡献研究意义选题背景第九章9.5 数据可视化9.5.2 plotly可视化 Plotly是一种使用JavaScript开发的制图工具,提供了与Python交互的API。Plotly能够绘制具有用户交互功能的精美图表。例9-71使用Plotly绘制折线图,源码见二维码。运行结果如图9-3所示
49、。图9-3 Plotly绘制折线图结果创新与贡献研究意义选题背景第九章9.5 数据可视化例9-72 使用Plotly绘制散点图,源码见二维码。运行结果如图9-4。图9-4使用Plotly绘制散点图结果创新与贡献研究意义选题背景第九章9.5 数据可视化例9-73 使用Plotly绘制柱状图,源码见二维码。运行结果如图9-5所示。图9-5使用Plotly绘制柱状图结果创新与贡献研究意义选题背景第九章9.5 数据可视化例9-74 使用Plotly绘制饼状图,源码见二维码。运行结果如图9-6所示。图9-6 用Plotly绘制饼状图结果创新与贡献研究意义选题背景第九章9.5 数据可视化例9-75 使用P
50、lotly绘制三维图,源码见二维码。运行结果如图9-7所示。图9-7使用Plotly绘制三维图结果创新与贡献研究意义选题背景第九章9.6 基于Python机器学习算法9.6.1线性回归 测试数据集为一组二维平面上的随机点集,保存在txt格式之中,其中第二列为横坐标值,第三列为纵坐标值,如图9-8所示。编程实现使用线性回归的方法对其进行拟合。图9-8 线性回归测试数据创新与贡献研究意义选题背景第九章9.6 基于Python机器学习算法导入相关包:import numpy as npfrom pylab import*训练w和b的值,返回(w,b)的向量:def train_wb(X,y):if