快速学完OpenCV+python计算机视觉图像处理(二)_第1页
快速学完OpenCV+python计算机视觉图像处理(二)_第2页
快速学完OpenCV+python计算机视觉图像处理(二)_第3页
快速学完OpenCV+python计算机视觉图像处理(二)_第4页
快速学完OpenCV+python计算机视觉图像处理(二)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

快速学完OpenCV+python计算机视觉图像处理(⼆)2计算机视觉⼊门之OpenCV⼊门、TensorFlow⼊门2-1本章介绍本章主要内容:OpenCV初识OpenCV⽂件结构Demo1图⽚读取:图⽚封装格式、压缩编码Demo2图⽚写⼊:图⽚质量Demo3像素操作:矩阵颜⾊空间课程⼩结OpenCV是⼀个开源的计算机视觉库,应⽤领域很⼴泛,在地图、导航、⼿机、嵌⼊式等等应⽤很常见。2-2下Mac⼀站式开发环境anaconda搭建Mac版本的详细搭建流程我⾃⼰试了,其实⼤同⼩异,⼤家可以根据下⾯我给的链接按照操作⼀步⼀步搭建,很简单的。1.下载并安装anaconda2.下载并安装tensorflow和OpenCV3.下载并安装notebook点击,附上Mac详细安装教程2-3Windows下⼀站式开发环境anaconda搭建这个视频⾥⾯讲的是tf1.x版本的,虽然现在⼯业界很多都还是使⽤的1.x版本,但是2.x确实⽐1.x强⼤很多,也在慢慢转换成2.x,⼤家也可以学习2.x版本的TensorFlow。1.下载并安装anaconda2.下载并安装tensorflow和OpenCV3.下载并安装notebook点击,附W上indows详细安装教程2-4测试案例HelloWorld#1import2string3printimporttensorflowastfhello=tf.constant('hellotf!')sess=tf.Session()print(sess.run(hello))#常量sessprint这⾥必须使⽤tf1.x版本,如果你的是tf2.x版本建议降级之后再使⽤importcv2print('helloopencv')2-5案例1:图⽚的读取和展⽰importcv2img=cv2.imread('image0.jpg',1)cv2.imshow('image',img)cv2.waitKey(0)2-6Opencv模块组织结构这⾥介绍了各个模块中的功能。其中,⽐较重要的模块有core、imgcodecs、imgproc、ml、photo这⼏个模块。2-7案例2:图⽚写⼊图⽚⽂件分为⽂件头和⽂件数据,不同的⽂件格式(jpg、png等),⽂件头和⽂件数据都是不⼀样的,⽂件数据也是⽂件进⾏压缩编码后的⽂件数据,⽽⼤部分的⽂件头描述的就是数据部分的的解码信息和以及附加信息,解码器可以根据附加信息将⽂件数据还原成图像最原始的数据。代码如下:importcv2#1⽂件的读取2封装格式解析3数据解码4数据加载img=cv2.imread('image0.jpg',1)cv2.imshow('image',img)#jpgpng1⽂件头2⽂件数据cv2.waitKey(0)#1.14M130kimportcv2img=cv2.imread('image0.jpg',1)cv2.imwrite('image1.jpg',img)#1name2data2-8案例3:不同图⽚质量保存不同图⽚质量也就是不同压缩⽐的图⽚。1.JPEGJPEG是有损压缩,压缩⽐为0-100,为0时,压缩⽐越⾼,越模糊;为100时,压缩⽐越低,越清晰(见下图)importcv2img=cv2.imread('image_jpg.jpg',1)#1M100k10k0-100有损压缩cv2.imwrite('imageTest0.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,0])cv2.imwrite('imageTest100.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,100])imageTest0=cv2.imread('imageTest0.jpg',1)imageTest100=cv2.imread('imageTest100.jpg',1)cv2.imshow('img',img)cv2.imshow('imageTest0',imageTest0)cv2.imshow('imageTest100',imageTest100)cv2.waitKey(0)2.PNGPNG是⽆损压缩,压缩⽐为0-9;为0时,压缩⽐越低,越清晰;为9时,压缩⽐越⾼,越模糊importcv2image_png=cv2.imread('image_png.png',1)#1M100k10k0-100有损压缩cv2.imwrite('imageTest0.png',image_png,[cv2.IMWRITE_PNG_COMPRESSION,0])cv2.imwrite('imageTest9.png',image_png,[cv2.IMWRITE_PNG_COMPRESSION,9])imageTest0=cv2.imread('imageTest0.png',1)imageTest9=cv2.imread('imageTest9.png',1)cv2.imshow('image_png',image_png)cv2.imshow('imageTest0',imageTest0)cv2.imshow('imageTest9',imageTest9)cv2.waitKey(0)直观上,PNG图⽚看不出来有啥⼤变化,但是看直接看图⽚⼤⼩,我们可以清晰的看到为0时图⽚⼤⼩和原图⼀样,为9时⼩了很多。2-9像素操作基础我们看到的每⼀张图⽚或者视频⾥⾯的每⼀帧,其实都是由像素点组成的,那么什么是像素点呢?百度吧!,上⾯都有,这⾥就不说了。下图中,表⽰⼀个像素点由RGB三种颜⾊组成,RGB每⼀个基⾊都有8位,也就是0~255,⽽计算机只能识别⼆进制,所以下⾯那串数字就是对应计算机中读取到的这个像素点的数值。下图中,第6点是png图⽚有个α系数,表⽰透明系数。还有,我们的彩⾊图像的通道由B、G、R这个顺序组成的。2-10案例4:像素读取写⼊不要偷懒,⼿动敲⼀边。这⾥有个⼩技巧,当我们输⼊某⼀个函数,不知道这个函数括号⾥⾯的变量是什么意思的时候,我们输⼊⼀个左括号或者第⼀个变量之后输⼊⼀个逗号,都会提⽰你下⼀个变量写什么,如果真的不知道什么意思,可以按住ctrl+点击⿏标左键进⼊函数内部查看也有可能是ctrl+alt+⿏标左键,就⽐如我的电脑按住ctrl+左键就只是显⽰⼀堆|这个竖线。根据个⼈情况⽽议。接下来就是像素读取写⼊代码:importcv2img=cv2.imread('1.jpg',1)#读取图⽚,其中0表⽰读⼊彩⾊图⽚,-1表⽰灰度图⽚,1表⽰保留读取图⽚原有的颜⾊通道#上⾯⼀句也可以⽤以下⽅式表⽰img_color=cv2.imread('1.jpg',cv2.IMREAD_COLOR)#可以⽤0表⽰cv2.IMREAD_COLORimg_gray=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)#可以⽤-1表⽰cv2.IMREAD_GRAYSCALEimg_unchanged=cv2.imread('1.jpg',cv2.IMREAD_UNCHANGED)#可以⽤1表⽰cv2.IMREAD_UNCHANGED(b,g,r)=img[50,50]#img[50,50]表⽰img50,50在这个位置的像素点,因为是三通道,分别对应着、BG、R,千万不能弄错print(b,g,r)#输出结果为251252250#50,150-->150,150,即画⼀条竖线foriinrange(1,150):img[50+i,150]=(0,0,255)#(0,0,255)表⽰红⾊#150,50-->150,150,即画⼀条横线foriinrange(1,150):img_color[150,50+i]=(0,255,0)#(0,255,0)表⽰绿⾊#50,50-->150,150,即将左上到右下组成的的矩形进⾏内部填充foriinrange(1,150):forjinrange(1,150):img_gray[50+i,50+j]=255#255⽩⾊#50,150-->150,50,即将左下到右上组成的的矩形进⾏内部填充foriinrange(1,150):forjinrange(1,150):img_unchanged[50+i,150-j]=(255,0,0)#(255,0,0)表⽰蓝⾊cv2.imshow("img",img)cv2.imshow("img_color",img_color)cv2.imshow("img_gray",img_gray)cv2.imshow("img_unchanged",img_unchanged)cv2.waitKey(0)2-11tensorflow常量变量定义importtensorflowastfdata1=tf.constant(2,dtype=32)data2=tf.Variable(10,name='var')print(data1)print(data2)sess=tf.Session()print(sess.run(data1))sess.run(tf.global_variables_initializer())print(sess.run(data2))2-12tensorflow运算原理下⾯内容只适⽤于tf1.x版本,tf2.x抛弃了张量,所以想要运⾏必须下载1.x版本。importtensorflowastfdata1=tf.constant(2,dtype=32)data2=tf.Variable(10,name='var')print(data1)print(data2)sess=tf.Session()print(sess.run(data1))'''sess.run(tf.global_variables_initializer())print(sess.run(data2))sess.close()#关闭会话,如果不⽤close,也可以⽤with进⾏关闭#本质tf=tensor+计算图#tensor数据#op#graphs数据操作#session'''init=tf.global_variables_initializer()sess=tf.Session()withsess:sess.run(init)print(sess.run(data2))2-13常量变量四则运算importtensorflowastfdata1=tf.constant(6)data2=tf.constant(2)dataAdd=tf.add(data1,data2)dataSub=tf.subtract(data1,data2)dataMul=tf.multiply(data1,data2)dataDiv=tf.divide(data1,data2)withtf.Session()assess:print("data1+data2={}".format(sess.run(dataAdd)))print("data1-data2={}".format(sess.run(dataSub)))print("data1*data2={}".format(sess.run(dataMul)))print("data1/data2={}".format(sess.run(dataDiv)))print('end!')运⾏结果为:data1+data2=8data1-data2=4data1*data2=12data1/data2=3.0end!上⾯都是常亮的加减乘除,下⾯修改⼀个值为变量进⾏加减乘除看看效果:importtensorflowastfdata1=tf.constant(6)#data2=tf.constant(2)将data2=tf.Variable(2)#data2改为变量dataAdd=tf.add(data1,data2)dataCopy=tf.assign(data2,dataAdd)#dataAdd的值复制给data2将data26+2=8为,这时dataSub=tf.subtract(data1,data2)dataMul=tf.multiply(data1,data2)dataDiv=tf.divide(data1,data2)init=tf.global_variables_initializer()#存在变量,需要进⾏初始化withtf.Session()assess:sess.run(init)print("data1+data2={}".format(sess.run(dataAdd)))print("data1-data2={}".format(sess.run(dataSub)))print("data1*data2={}".format(sess.run(dataMul)))print("data1/data2={}".format(sess.run(dataDiv)))print("sess.run(dataCopy)=",sess.run(dataCopy))#值为8print("dataCopy.eval()=",dataCopy.eval())#8+6=14->dataCopyprint("tf.get_default_session()=",tf.get_default_session().run(dataCopy))#14+6=20->dataCopy,eval功能⼀样和上⾯print('end!')运⾏结果为:data1+data2=8data1-data2=4data1*data2=12data1/data2=3.0sess.run(dataCopy)=8dataCopy.eval()=14tf.get_default_session()=20end!2-14矩阵基础1placeholder,中⽂意思是占位符,在tensorflow中类似于函数参数,运⾏时必须传⼊值。importtensorflowastfdata1=tf.placeholder(tf.float32)#这⾥通过placeholder先填坑data2=tf.placeholder(tf.float32)dataAdd=tf.add(data1,data2)withtf.Session()assess:#通过feed_dict()函数向占位符喂⼊数据,⽤字典的⽅式填坑print(sess.run(dataAdd,feed_dict={data1:8,data2:6}))print('end')运⾏结果:14.0end以下是矩阵基础知识:importtensorflowastf#外⾯的中括号表⽰这是⼀个矩阵,⾥⾯的中括号表⽰这是⼏⾏⼏列data1=tf.constant([[8,8]])data2=tf.constant([[2],[2]])data3=tf.Variable(6,name='var')print('data1:',data1)#直接输出不会打印矩阵,输出的第⼀个表⽰常量还是变量,第⼆个表⽰形状,第三个表⽰类型print('data2:{}'.format(data2))#format⽤法和上⾯⼀样data3=tf.constant([[3,3]])data4=tf.constant([[1,3],[2,4],[7,8]])print('data3.shape:',data3.shape)print('data4.shape:',data4.shape)withtf.Session()assess:print(sess.run(data4))#打印整体print(sess.run(data4[1]))#打印某⼀⾏print(sess.run(data4[:,0]))#表:⽰打印所有⾏,0表⽰打印第⼀列print(sess.run(data4[0,1]))#0,1表⽰打印第1⾏第⼆列的数print('end!')运⾏结果:data1:Tensor("Const:0",shape=(1,2),dtype=int32)data2:Tensor("Const_1:0",shape=(2,1),dtype=int32)data3.shape:(1,2)data4.shape:(3,2)[[13][24][78]][24][127]3end!2-15矩阵基础2矩阵的⼴播在⾥⾯有介绍。importtensorflowastfdata1=tf.constant([[6,6]])data2=tf.constant([[2],[3]])data3=tf.constant([[2,2]])data4=tf.constant([[1,2],[4,5],[8,9]])#相同维度的矩阵加法matAdd=tf.add(data1,data3)#这⾥data1data4的维度不同,⽤了⼴播的特性,将低维扩展成⾼维data1,变成data4相同维度,且每⼀⾏相同和matAdd2=tf.add(data1,data4)#矩阵乘法,要满⾜矩阵相乘格式,即第⼀个矩阵列要和第⼆个矩阵⾏相同matMul=tf.matmul(data1,data2)#这⾥乘法是将矩阵中对应元素各⾃相乘,不同维度⽤⼴播特性,并且数据类型必须相同,否则报错matMul2=tf.multiply(data1,data4)withtf.Session()assess:print(sess.run(matAdd))print(sess.run(matAdd2))print(sess.run(matMul))print(sess.run(matMul2))运⾏结果如下:[[88]][[78][1011][1415]][[30]][[612][2430][4854]]2-16矩阵基础3⼀定要⾃⼰⼿敲,多动⼿,多思考,⾃⼰写⼀遍写多遍,代码如下:importtensorflowastf#这⾥定义了⼀个2⾏3列全0的矩阵,很⿇烦data1=tf.constant([[0,0,0],[0,0,0]])#这⾥直接⽤zeros函数给定⼀个2⾏3列全0的矩阵,默认float32型,很简单data2=tf.zeros([2,3])#这⾥直接⽤ones函数给定⼀个3⾏2列全1的矩阵,格式转为int32型data3=tf.ones([3,2],dtype=32)#这⾥直接⽤fill函数填充⼀个全为8866的⾏列的矩阵data4=tf.fill([6,6],88)#这⾥定义了⼀个3⾏1列的矩阵data5=tf.constant([[6],[8],[6]])#这⾥直接⽤zeros_like给定了⼀个格式像data5全为0的矩阵data6=tf.zeros_like(data5)#这⾥直接⽤ones_like给定了⼀个格式像data5全为1的矩阵data7=tf.ones_like(data5)#这⾥调⽤了linspace函数,将0.0-3.0等分为5等份,开始为0.0,结束为3.0data8=tf.linspace(0.,3.,5)#这⾥调⽤random_uniform函数,随机⽣成-2~2之间的6⾏6列的数组,最⼩值为-2,最⼤值为2data9=tf.random_uniform([6,6],-2,2)withtf.Session()assess:print('===========data1===========')print(sess.run(data1))print('===========data2===========')print(sess.run(data2))print('===========data3===========')print(sess.run(data3))print('===========data4===========')print(sess.run(data4))print('===========data5===========')print(sess.run(data5))print('===========data6===========')print(sess.run(data6))print('===========data7===========')print(sess.run(data7))print('===========data8===========')print(sess.run(data8))print('===========data9===========')print(sess.run(data9))运⾏结果如下:===========data1===========[[000][000]]===========data2===========[[0.0.0.][0.0.0.]]===========data3===========[[11][11][11]]===========data4===========[[888888888888][888888888888][888888888888][888888888888][888888888888][888888888888]]===========data5===========[[6][8][6]]===========data6===========[[0][0][0]]===========data7===========[[1][1][1]]===========data8===========[0.0.751.52.253.]===========data9===========[[0.111971861.41248081.0134263-1.9970236-0.47386456-0.9146967][1.03463130.63341760.422109131.95678230.5573721-0.5008154][-1.36026050.28631544-1.11301761.01303430.254903321.5334082][-1.5158668-1.18222621.2910948-0.194971561.22649531.0197816][1.9740758-0.839287760.094179151.73914670.5077319-0.6977172][-0.21380329-1.28175590.6250396-0.394576071.6598969-0.43963957]]2-17numpy模块使⽤更多numpy相关的功能请查看代码如下:#使⽤numpy模块进⾏增(Create)\(Delete)\(Update)\(Read)==CURD删改查importnumpyasnp⽤#array创建⼀个⼀维数组data1=np.array([1,2,3,4,5,6])#array创建⼀个⼆维数组⽤data2=np.array([[1,2,3],[4,5,6]])print(data1)print('===========beforeupdate===========')print(data2)#shape表⽰维度print('data1.shape:{0}\ndata2.shape:{1}'.format(data1.shape,data2.shape))#numpyoneszeros这些都和TensorFlow⼀样的和print(np.ones([3,3]))print(np.zeros(([2,2])))#修改data2中第2⾏第2列的数据为88data2[1,1]=88print('===========afterupdate===========')print(data2)#读取data2第2⾏第2列的数据print(data2[1,1])#定义⼀个2⾏3列全为1的矩阵data3=np.ones([2,3])#矩阵与数字基本运算print('data3=\n',data3)print('data3+3=\n',data3+3)#data3直接与3相加print('data3-3=\n',data3-3)#data3直接与3相减print('data3*3=\n',data3*3)#data3直接与3相乘print('data3/3=\n',data3/3)#data3直接与3相除#两个矩阵的+和*,当然不同,不同维度就会产⽣⼴播特性data4=np.array([[1,2,1],[4,5,4]])print('data3+data4=\n',data3+data4)#由于data3为全为1print('data3*data4=\n',data3*data4)运⾏结果如下:[123456]===========beforeupdate===========[[123][456]]data1.shape:(6,)data2.shape:(2,3)[[1.1.1.][1.1.1.][1.1.1.]][[0.0.][0.0.]]===========afterupdate===========[[123][4886]]88data3=[[1.1.1.][1.1.1.]]data3+3=[[4.4.4.][4.4.4.]]data3-3=[[-2.-2.-2.][-2.-2.-2.]]data3*3=[[3.3.3.][3.3.3.]]data3/3=[[0.333333330.333333330.33333333][0.333333330.333333330.33333333]]data3+data4=[[2.3.2.][5.6.5.]]data3*data4=[[1.2.1.][4.5.4.]]2-18matplotlib模块的使⽤更多numpy相关的功能请查看代码如下:importnumpyasnpimportmatplotlib.pyplotasplt#x=np.array([1,2,3,4,5,6,7,8,9])#y=np.array([5,2,3,7,4,8,10,13,15])#⽣成1~10(不包括10),步长为1的9组数x=np.arange(1,10,1)#随机⽣成3~20之间,⼤⼩为9的数组y=np.random.randint(3,20,size=9)#plot是折线图,x为x轴坐标,y为y轴左边,'r'为颜⾊,lw=5表⽰线宽plt.plot(x,y,'r',lw=5)#plt.show()#show就会将折线图和柱状图分为两个窗⼝显⽰如果这⾥加上x=np.arange(1,10,1)y=np.random.randint(3,20,size=9)#bar表⽰,柱状图和png图⽚⼀样,这⾥的alpha也表⽰透明度,0(完全透明)~1(不透明)plt.bar(x,y,alpha=0.5,color='g')plt.show()运⾏结果如下:2-19⼩综合:⼈⼯神经⽹络逼近股票价格1股票相信⼤家都应该玩过吧,开盘价<收盘价就是红⾊K线图,我们⼼情就像吃了蜜⼀样甜。开盘价>收盘价就是绿⾊K线图,我们的⼼情就⾏吃了苦⽠⼀样,整个⼈都不好受。下⾯就是具体的K线图。代码如下所⽰:importnumpyasnpimporttensorflowastfimportmatplotlib.pyplotasplt#先⽤linspace⽣成⼀组1~15的个数为15个的等差数列data=np.linspace(1,15,15,dtype=32)data2=np.arange(1,16)#输出结果上⾯⼀样,np.arange(1,16)输出不包括16startPrice=np.array([2438.71,2500.88,2534.95,2512.52,2594.04,2743.26,2697.47,2695.24,2678.23,2722.13,2674.93,2744.13,2717.46,2832.73,2877.40])endPrice=np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.17,2715.07,2823.58,2864.90,2919.08])#⾃动⽣成随机的开始结束价格#startPrice=np.random.uniform(2500,2600,15)#endPrice=np.random.uniform(2550,2700,15)print("data2:",data2)print('startPrice:',startPrice)print('endPrice:',endPrice)#figure作⽤为连续画⼏个图,如果只⽤画⼀个图,可以不需要,这⾥只有⼀个图,所以可以不⽤要#plt.figure(num='stock')foriinrange(0,15):#柱状图dataSet=np.zeros([2])#⽣成两组值为0的数组,分别⽤来存放开始结束价格的横坐标dataSet[0]=idataSet[1]=ipriceSet=np.zeros([2])#⽣成两组值为0的数组,分别⽤来存放开始结束价格的价格值priceSet[0]=startPrice[i]priceSet[1]=endPrice[i]#画线进⾏判断,如果开始价格结>束价格,说明是价格下降了,对应绿⾊线KifstartPrice[i]>endPrice[i]:plt.plot(dataSet,priceSet,color='g',lw=6)else:#如果开始价格<结束价格,说明是价格上涨了,对应红⾊线Kplt.plot(dataSet,priceSet,color='r',lw=6)plt.show()运⾏结果如下:2-20⼩综合:⼈⼯神经⽹络逼近股票价格2这⼀节的内容是将⽣成的股票价格K线图⽤传统的神经⽹络来模拟,下⾯是具体的过程:从上图可以看出,输⼊层对应着天数,可以⾃⼰定义,这⾥是⼀个15⾏1列的矩阵。隐藏层设的是⼀个1x10的矩阵,输出层是15x1的矩阵,是⼀个Javascript库,⽤于完全在您的浏览器中训练深度学习模型(神经⽹络),⼤家可以试试看看。这⾥是⼀个训练数据的循环体,将每⼀次的输出值和输⼊值做差,若果差异⼤于2%,就会进⾏梯度下降,然后循环,⼀直到它们的差异⼩于2%才会结束循环。2-21~2-22⼩综合:⼈⼯神经⽹络逼近股票价格3-4代码如下:#导⼊必要模块importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotasplt#date=np.arange(1,16)date=np.linspace(1,15,15)#print(date)startPrice=np.array([2438.71,2500.88,2534.95,2512.52,2594.04,2743.26,2697.47,2695.24,2678.23,2722.13,2674.93,2744.13,2717.46,2832.73,2877.40])endPrice=np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.17,2715.07,2823.58,2864.90,2919.08])#print(startPrice)#print(endPrice)plt.f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论