首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python下opencv使用笔记

阅读本文大约需要5分钟

写在之前:

这个系列还是很久以前学习opencv的时候写的,算是非常基础东西,包括常见的图像处理方法,滤波算法,等等,了解常见的操作,方便后续的进一步处理,这里搬运过来,方便视觉领域的初学者可以参考。

上次分享了一个关于python下opencv的所有相关资料,详细可参考下载:

1. 图像简单读取、显示与储存

(一)关于python

首先关于python想说的是,单纯的官网下载的python并不大,是一个最初的python,进行一些简单的操作时可以的,但是当你进行复杂一点的时候,就需要许多第三方的安装包,比如numpy等等,这些库安装进去说起来也不是很复杂,网上有很多教程,但是当许多的包安装的时候,有的库包并没有你的电脑的版本,等等还有许多因素导致你的库包安装不进去,想想还是挺麻烦的,我自己曾经就是安装各种包快要崩溃了。最后索性找到了一个集成的软件,就是把常用的包都加进去了的python,软件是Ipython,是一个集成的科学计算软件,里面集成了许多包,并且是一个神似matlab的软件,有调试,测试,观看变量数值等等许多相同的地方,所以如果你是想研究这样面而又苦恼安装包的话,就下载个这个安装起来吧。

(二)从头开始--读取图像

关于python下使用opencv读取图像。首先需要导入opencv包,上面说的那个Ipython并没有opencv包,所以想使用的请先正确导入opencv包再说,至于怎么导入,先下载个opencv包,里面有关于python的opencv包,把这个想办法导进去进行了(很简单,百度下,略过吧)。

关于Ipython的运行界面,里面集成了一个类似matlab的界面:spyder

在读取图像之前,你得把你的做实验的图像事先放到工作目录下才行。读取函数是cv2.imread(),关于函数说明:

可选参数决定读入图像的模式:

0:读入的为灰度图像(即使图像为彩色的);

1:读入的图像为彩色的(默认);

注意的是:即使图像在工作空间不存在,这个函数也不会报错,只不过读入的结果为none。

好了,读入一个图像就是这样的:

当你的import cv2运行后没有错误了,那么就导入成功了。

(三)储存图像

储存图像函数:`cv2.imwrite(‘保存的图像名’,图像,‘参数’)`

正常的图像储存使用就是cv2.imwrite(‘保存的图像名’,图像),后面一个参数默认,保存的图像名还得带类型,比如jpg,bmp等等,OpenCV目前支持读取bmp、jpg、png、tiff等常用格式,第三个参数较复杂,还得分是jpg、bmp等等图像的类型不同而不同,其实就是决定了图像储存大小,清晰度的,默认的就很好,想细究的可以看下面,这个里面有部分介绍:

http://blog.csdn.net/sunny2038/article/details/9057415

那么在得到一副图像想储存,比如就直接:

(四)图像显示

Opencv自带显示图像函数,但是较为复杂而且个人感觉不稳定,这里在介绍一种显示方法,就是使用库包matplotlib(这个库包Ipython自带)来显示图像。

首先是opencv自带函数显示,一般要显示一个图像,在图像有了之后,然后直接下面函数一起组合使用:

函数cv2.imshow的第一个参数是名字,第二个是要显示的图。然而为了让

图像在显示屏上停留才有了下面两句话一起使用。由于系统(32位与64位)的不一样,有的时候会出现显示不出来,个人感觉opencv本身c语言写的,存在着系统上的差异,而且这种显示方法无法保存图像、调整图像大小等等,这里介绍另一种常用且强大的显示图像方法,使用matplotlib库包中的pyplot子包来显示,这种显示方法不但稳定,还可以调整大小、保存显示的图像等等。那么一般它的使用方法如下:

下面是显示的上述图,可以看到会在一个新的界面显示出来:

2.简单几何图像绘制

简单几何图像一般包括点、直线、矩阵、圆、椭圆、多边形等等。首先认识一下opencv对像素点的定义。图像的一个像素点有1或者3个值,对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值,他们表现出不同的颜色。那么有了点才能组成各种多边形。

(一)首先绘制直线

函数为:cv2.line(img,Point pt1,Point pt2,color, thickness=1, line_type=8, shift=0)

有值的代表有默认值,不用给也行。可以看到这个函数主要接受参数为两个点的坐标,线的颜色(彩色图像的话颜色就是一个1*3的数组)如下:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512),np.uint8)#生成一个空灰度图像cv2.line(img,(0,0),(511,511),255,5)plt.imshow(img,'gray')

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像cv2.line(img,(0,0),(511,511),(155,155,155),5)plt.imshow(img,'brg')

(二)绘制矩形

函数:cv2.rectangle(img,(380,0),(511,111),(255,0,0),3)

需要确定的就是矩形的两个点(左上角与右下角),颜色,线的类型(不设置就默认)。比如:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像cv2.rectangle(img,(20,20),(411,411),(55,255,155),5)plt.imshow(img,'brg')

(三)绘制圆形

绘制圆形也很简单,只需要确定圆心与半径,函数:

比如:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像cv2.circle(img,(200,200),50,(55,255,155),1)#修改最后一个参数plt.imshow(img,'brg')

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像cv2.circle(img,(200,200),50,(55,255,155),8)#修改最后一个参数plt.imshow(img,'brg')

(四)绘制椭圆

椭圆比较复杂,涉及到长轴短轴,椭圆圆心,旋转角度等等,看看opencv参考手册上的介绍吧:

图像化如下:

一个例子如下:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = np.zeros((512,512,3),np.uint8)#生成一个空彩色图像cv2.ellipse(img,(256,256),(150,100),0,0,180,250,-1)#注意最后一个参数-1,表示对图像进行填充,默认是不填充的,如果去掉,只有椭圆轮廓了plt.imshow(img,'brg')

3. 图像的几何变换

关于几何变换

二维与三维图像的几何变换在计算机图形学上有重要的应用,包括现在的许多图像界面的切换、二维与三维游戏画面控制等等都涉及到图像几何变换,就比如说在三维游戏中,控制角色三维移动的时候,画面是要跟着移动的,那么怎么移动,怎么让上一时刻的画面移动到这一时刻,这都是根据了你的移动量,然后找到三维坐标之间的对应关系,用这一时刻的坐标替换到上一时刻的坐标像素值实现图像的切换。

图像的几何变换主要包括:

平移、扩大与缩小、旋转、仿射、透视等等。图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到对应关系。

(一)图像平移

下面介绍的图像操作假设你已经知道了为什么需要用矩阵构造才能实现了(上面那个博客有介绍为什么)。那么关于偏移很简单,图像的平移,沿着x方向tx距离,y方向ty距离,那么需要构造移动矩阵:

通过numpy来产生这个矩阵,并将其赋值给仿射函数cv2.warpAffine().仿射函数cv2.warpAffine()接受三个参数,需要变换的原始图像,移动矩阵M以及变换的图像大小(这个大小如果不和原始图像大小相同,那么函数会自动通过插值来调整像素间的关系)。

一个例子如下:

import cv2import numpy as npimport matplotlib.pyplotas pltimg =cv2.imread('flower.jpg')H =np.float32([[1,0,100],[0,1,50]])rows,cols = img.shape[:2]res =cv2.warpAffine(img,H,(rows,cols)) #需要图像、变换矩阵、变换后的大小plt.subplot(121)plt.imshow(img)plt.subplot(122)plt.imshow(res)

(二)图像的扩大与缩小

图像的扩大与缩小有专门的一个函数,cv2.resize(),那么关于伸缩需要确定的就是缩放比例,可以是x与y方向相同倍数,也可以单独设置x与y的缩放比例。另外一个就是在缩放以后图像必然就会变化,这就又涉及到一个插值问题。那么这个函数中,缩放有几种不同的插值(interpolation)方法,在缩小时推荐cv2.INTER_ARER,扩大是推荐cv2.INTER_CUBIC和cv2.INTER_LINEAR。默认都是cv2.INTER_LINEAR,比如:

import cv2import matplotlib.pyplotas pltimg =cv2.imread('flower.jpg')# 插值:interpolation# None本应该是放图像大小的位置的,后面设置了缩放比例,#所有就不要了res1 =cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)#直接规定缩放大小,这个时候就不需要缩放因子height,width =img.shape[:2]res2 =cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)plt.subplot(131)plt.imshow(img)plt.subplot(132)plt.imshow(res1)plt.subplot(133)plt.imshow(res2)

通过坐标轴可以看到图像扩大了一倍,并且两种方法相同。

(三)图像的旋转

图像的旋转矩阵一般为:

但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式:

为了构造这个矩阵,opencv提供了一个函数:

cv2.getRotationMatrix2D()

这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例,比如下例:

import cv2import matplotlib.pyplotas pltimg = cv2.imread('flower.jpg')rows,cols = img.shape[:2]#第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例M =cv2.getRotationMatrix2D((cols/2,rows/2),45,1)#第三个参数:变换后的图像大小res =cv2.warpAffine(img,M,(rows,cols))plt.subplot(121)plt.imshow(img)plt.subplot(122)plt.imshow(res)

(四)图像的仿射

图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是

M=cv2.getAffineTransform(pos1,pos2)

其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()。形象化的图如下(引用参考的)

一个例子比如:

import cv2import numpy as npimport matplotlib.pyplotas pltimg =cv2.imread('flower.jpg')rows,cols = img.shape[:2]pts1 =np.float32([[50,50],[200,50],[50,200]])pts2 =np.float32([[10,100],[200,50],[100,250]])M =cv2.getAffineTransform(pts1,pts2)#第三个参数:变换后的图像大小res = cv2.warpAffine(img,M,(rows,cols))plt.subplot(121)plt.imshow(img)plt.subplot(122)plt.imshow(res)

(五)图像的透射

透视需要的是一个3*3的矩阵,同理opencv在构造这个矩阵的时候还是采用一种点对应的关系来通过函数自己寻找的,因为我们自己很难计算出来。这个函数是

其中pts需要变换前后的4个点对应位置。得到M后在通过函数cv2.warpPerspective(img,M,(200,200))进行。形象化的图如下(引用参考的)

一个例子如下:

import cv2import numpy as npimport matplotlib.pyplotas pltimg =cv2.imread('flower.jpg')rows,cols = img.shape[:2]pts1 =np.float32([[56,65],[238,52],[28,237],[239,240]])pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])M =cv2.getPerspectiveTransform(pts1,pts2)res =cv2.warpPerspective(img,M,(200,200))plt.subplot(121)plt.imshow(img)plt.subplot(122)plt.imshow(res)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180515G1PDB100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券