重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#导入模块
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站设计、外贸网站建设、宜春网络推广、微信小程序、宜春网络营销、宜春企业策划、宜春品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供宜春建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
import numpy as np
import matplotlib.pyplot as plt
#建立步长为0.01,即每隔0.01取一个点
step = 0.01
x = np.arange(-10,10,step)
y = np.arange(-10,10,step)
#也可以用x = np.linspace(-10,10,100)表示从-10到10,分100份
#将原始数据变成网格数据形式
X,Y = np.meshgrid(x,y)
#写入函数,z是大写
Z = X**2+Y**2
#填充颜色,f即filled
plt.contourf(X,Y,Z)
#画等高线
contour = plt.contour(X,Y,Z)
#平行于坐标系的参考线
plt.axhline(y=2.5,c='red',ls='--',lw=3)
plt.axvline(x=2,c='green',ls='--',lw=3)
#等高线上标明z(即高度)的值,默认是保留3个小数,可以如下保留四位
plt.clabel(contour,fontsize=10,colors=('k','r'),fmt='%.2f')
plt.show()
差不多就这样吧,有问题的话再留言吧
等高线可以简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度。等高线是形状分析、目标检测和识别的有用工具。
让我们看看如何找到二值图像的轮廓:
cv2.findcontours() 函数中有三个参数,
第一个是源图像
第二个是轮廓检索模式
第三个是轮廓近似方法
它输出图像、轮廓和层次。轮廓是图像中所有轮廓的python列表。每个轮廓都是对象边界点(x,y)坐标的numpy数组。
使用 cv2.drawContours, 它也可以用来绘制任何给出边界点的形状。它的第一个参数是源图像,第二个参数是应该作为等高线列表,第三个参数是等高线索引(在绘制个体轮廓时使用)。要绘制所有轮廓,传递-1)、颜色、厚度等。
要绘制图像中的所有轮廓:
要绘制第4个轮廓:
但大多数情况下,下面的方法更适合:
这是 cv2.findContours 函数中的第三个参数的说明。
如果传递 cv2.CHAIN_APPROX_NONE,则存储所有边界点。但实际上我们需要所有的要点吗?例如,你发现了一条直线的轮廓。你需要这条线上所有的点来代表这条线吗?不,我们只需要这条线的两个端点。这就是 cv2.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。
你可以提取有用的数据,如面积、质心等。质心可以通过下面的方式来获取
它将一个轮廓形状近似为另一个形状,根据我们指定的精度,顶点数量较少。
为了理解这一点,假设您试图在图像中找到一个正方形,但是由于图像中的一些问题,您没有得到一个完美的正方形,而是一个“坏形状”(如下面第一幅图像所示)。现在可以使用此函数来近似形状。在这里,第二个参数称为epsilon,它是从轮廓到近似轮廓的最大距离。这是一个精度参数。为了得到正确的输出,需要明智地选择epsilon。
下图,在第二幅图像中,绿线显示了epsilon=10%弧长的近似曲线。第三张图片显示的epsilon=弧长的1%相同。第三个参数指定曲线是否关闭。
凸面船体看起来类似于轮廓近似,但事实并非如此(在某些情况下两者都可能提供相同的结果)。在这里,cv2.converxHull()函数检查曲线是否存在凸性缺陷,并对其进行修正。一般来说,凸曲线是指总是凸出的曲线,或者至少是平的曲线。如果它在内部膨胀,就称为凸性缺陷。例如,检查下面的手图像。红线表示手的凸面外壳。双面箭头标记显示了凸性缺陷,即船体与轮廓的局部最大偏差。
points 是我们经过的轮廓。
hull 是输出,通常我们避免它。
clockwise :方向标志。如果为真,则输出凸壳为顺时针方向。否则,它是逆时针方向的。
returnPoints :默认为真。然后返回船体点的坐标。如果为false,则返回与外壳点对应的轮廓点索引。
因此,如上图所示,要得到一个凸面外壳,以下就足够了:
有一个函数可以检查曲线是否是凸的,cv2.isContourConvex()。它只是返回正确还是错误。
直的矩形,不考虑物体的旋转。所以边界矩形的面积不会是最小的。它由函数 cv2.boundingrect() 找到。
设(x,y)为矩形的左上角坐标,(w,h)为矩形的宽度和高度。
在这里,边界矩形是用最小面积绘制的,因此它也考虑了旋转。使用的函数是 cv2.minareect() 。但是要画这个矩形,我们需要四个角。它是通过函数 cv2.boxpoints() 获得的。
在这里,我们将学习提取一些经常使用的对象属性,如坚固性、等效直径、遮罩图像、平均强度等。
范围是轮廓区域与边界矩形区域的比率。
坚固性是指轮廓面积与其凸面外壳面积之比。
等效直径是面积与轮廓面积相同的圆的直径。
方向是指向对象的角度。下面的方法也给出了长轴和短轴的长度。
在某些情况下,我们可能需要包含该对象的所有点。可以这样做:
这里,有两种方法,一种是使用numpy函数,另一种是使用opencv函数(最后一行注释)。结果也相同,但有轻微的差异。numpy以(行、列)格式给出坐标,而opencv以(x、y)格式给出坐标。所以基本上答案会互换。注意,row=x,column=y。
极端点是指物体的最上面、最下面、最右边和最左边的点。
以画 z=x^2+y^2 的等高线为例,简单介绍用 matplotlib 画等高线的方法.
首先看下 z=x^2+y^2 的三维图像:
import numpy as npfrom matplotlib import cmimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
delta = 0.2x = np.arange(-3, 3, delta)
y = np.arange(-3, 3, delta)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2x=X.flatten()
y=Y.flatten()
z=Z.flatten()
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.01)
plt.show()
下面画出这个图形的等高线:
plt.contour(X, Y, Z) #注意这里是大写X ,Y,Z
如果只想画出 z=1,z=2,z=3 这 3 条等高线:
plt.contour(X, Y, Z,[1,2,3])
matplotlib是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。本文将以例子的形式分析matplot中支持的,分析中常用的几种图。其中包括填充图、散点图(scatter plots)、. 条形图(bar plots)、等高线图(contour plots)、 点阵图和3D图,下面来一起看看详细的介绍:
一、填充图
参考代码
简要分析
这里主要是用到了fill_between函数。这个函数很好理解,就是传入x轴的数组和需要填充的两个y轴数组;然后传入填充的范围,用where=来确定填充的区域;最后可以加上填充颜色啦,透明度之类修饰的参数。
相关推荐:《Python教程》
效果图
二、散点图(scatter plots)
参考代码
简要分析
1.首先介绍一下numpy 的normal函数,很明显,这是生成正态分布的函数。这个函数接受三个参数,分别表示正态分布的平均值,标准差,还有就是生成数组的长度。很好记。
2.然后是arctan2函数,这个函数接受两个参数,分别表示y数组和x数组,然后返回对应的arctan(y/x)的值,结果是弧度制。
3.接下来用到了绘制散点图的scatter方法,首先当然是传入x和y数组,接着s参数表示scale,即散点的大小;c参数表示color,我给他传的是根据角度划分的一个数组,对应的就是每一个点的颜色(虽然不知道是怎么对应的,不过好像是一个根据数组内其他元素进行的相对的转换,这里不重要了,反正相同的颜色赋一样的值就好了);最后是alpha参数,表示点的透明度。scatter函数的高级用法可以参见官方文档scatter函数或者help文档,最后设置下坐标范围就好了。
效果图
三、等高线图(contour plots)
参考代码
简要分析
1.首先要明确等高线图是一个三维立体图,所以我们要建立一个二元函数f,值由两个参数控制,(注意,这两个参数都应该是矩阵)。
2.然后我们需要用numpy的meshgrid函数生成一个三维网格,即,x轴由第一个参数指定,y轴由第二个参数指定。并返回两个增维后的矩阵,今后就用这两个矩阵来生成图像。
3.接着就用到coutourf函数了,所谓contourf,大概就是contour fill的意思吧,只填充,不描边;这个函数主要是接受三个参数,分别是之前生成的x、y矩阵和函数值;接着是一个整数,大概就是表示等高线的密度了,有默认值;然后就是透明度和配色问题了,cmap的配色方案这里不多研究。
4.随后就是contour函数了,很明显,这个函数是用来描线的。用法可以类似的推出来,不解释了,需要注意的是他返回一个对象,这个对象一般要保留下来个供后续的加工细化。
5.最后就是用clabel函数来在等高线图上表示高度了,传入之前的那个contour对象;然后是inline属性,这个表示是否清除数字下面的那条线,为了美观当然是清除了,而且默认的也是1;再就是指定线的宽度了。
效果图