python3d图像处理_Python可视化与图像处理
python绘图库有很多,底层的就是matplotlib,另外还有基于matplotlib的更⽅便,代码可读性更强的库,⽐如seaborn、plotnine等。各个库之间的对⽐:
matplotlib
在python下⼀般使⽤matplotlib包下的pyplot,所以通常import matplotlib.pyplot as plt⽅便使⽤它的绘图函数。下⾯仅记录
matplotlib3.2.0之后的版本。
通⽤函数
plt.show()
显⽰绘图窗⼝。
plt.figure()
创建绘图新窗⼝并传给fig:
fig = plt.figure()
fig能使⽤下⾯绘图、创建⼦图等函数。不创建新窗⼝直接plt.function()也能绘图,默认⼀个窗⼝。
fig.add_subplot()
给窗⼝添加⼦图像,参数有三个,分别是⼦图像的⾏、列、索引。两种使⽤⽅式:
ax =fig.add_subplot(numbRow, numbCol, plotNum)
ax= fig.add_subplot(111)
前⼀种是⼀般的⽤逗号隔开,明确三个参数。后⼀种是三个整数参数直接合成⼀个整数传⼊,这要求这个整数只能是3位的,这样才能唯⼀确定⽤户传⼊的参数。(⽐如223,就是把图像划分成2*2的格⼦,添加⼀个⼦图像在第三个格⼦⾥)
plt.imsave()
⽤于保存图像,因为源代码中没有提⽰,很容易因为传参顺序⽽出错。⽤法如下:
plt.imsave(name,img)#先传名字再传img数组
图例
为图像添加图例,在画图函数中添加label属性就⾏。如:
ax.plot(X,Y,label = '图例')
然后使⽤legend()函数显⽰所有的图例,它可以设置图例的位置等参数:
显⽰中⽂(不然可能乱码):
图像标题
ax.set_title('aaa',fontsize=12,color='r')
坐标轴设置
ax.set_xlim([-2, 2])#设置x坐标轴范围
ax.set_ylim([-2, 2])#设置y坐标轴范围
ax.set_xlabel('xxxxxxxxxxx')#设置x坐标轴名称
ax.set_ylabel('yyyyyyyyyyy')#设置y坐标轴名称
ticks= np.arange(-2, 2, 0.3)
ax.set_xticks(ticks)#设置x轴刻度
ax.set_yticks(ticks)#设置y轴刻度
ax.axis('scaled')#设置坐标轴宽⾼等⽐于x、y范围
ax.axis('image')#类似于scaled,暂时没发现区别
ax.axis('off')#关闭坐标轴
ax.axis('equal')#图像宽⾼⽐例不变,坐标轴范围变
ax.axis('tight')#坐标轴紧紧贴合图像,不设置默认就是这个
ax.axis('square')#设置坐标轴宽⾼⽐为1:1,坐标轴跨度取较⼤的那个
动态图像
python 定义数组
plt.cla()
ax.clear()
这两个函数⽤于将⼦图清空,配合暂停函数
plt.pause(0.1)
即可实现动态图像。
⼆维图像
contourf()和contour()
画等⾼线图。这两个函数差⼀个字母,但⽤法⼀样,区别如下:
使⽤⽅法:
X是⽣成⽹格的X坐标数组(⼆维数组array,或者matrix),Y是和X相同类型的Y坐标,Z是对应⽹格的每个格点的函数值数组(也是⼆维数组array,或者matrix),⽹格的⽣成是使⽤numpy库中的meshgrid()函数。levels是图像中等⾼线的数量,我这⾥设置为10。alpha是图像的透明度,介于0~1,我这⾥设置为0.5半透明。可以设置透明度有个好处就是可以把很多图画在同⼀个画布上,⽅便⽐较。cmap是图像的颜⾊类型,有很多预设的颜⾊类型,我这⾥⽤⼀个叫‘jet’的颜⾊类型,当然也可以⾃⼰定义,具体设置⽹上再吧。后三项有预设值,可以省略。
效果图:
看起来不是很圆润,这是因为我的⽹格规模就是7*7的,它画图就按照你的⽹格数量来画,所以有棱有⾓的。有⼀点奇怪的就是,⽹格是有限的,它是怎么画出这么多的等⾼线的?我猜它应该是线性插值插进去的。反正也就⼀个图⽤来看的,不⽤特别准确。但是如果要准确怎么办?那就把⽹格设置地密⼀些!别让等⾼线的密度⽐⽹格的密度⼤太多就好了。
另外,可以⽤clabel()这个函数⽤来标注等⾼线图的数值:
plt.clabel(C, inline=False, fontsize=12)
C代表刚刚画的等⾼线图(在⽤contour()等函数画完以后传给C,C = contour(...)),inline是否画在线内,fontsize数字的⼤⼩。
plot()
ax.plot(x, y, ls="-", lw=2, label="plot figure", color='black',alpha=)
⽤来画⼆维⾯上的点、线。当然也可以在三维的空间⾥⾯画,就画在三维坐标系的xOy⾯上。重要参数介绍:
x: 要画的线的各个点在x轴上的坐标(⼀维数组)
y: 要画的线的各个点在y轴上的坐标(⼀维数组或⼆维数组,第⼀维规模要和x轴的数组⼀致,第⼆维规模的⼤⼩就是画线的数量)
ls:折线图的线条风格,这⾥是⼀个减号
lw:折线图的线条宽度
label:标记图内容的标签⽂本
color:颜⾊
alpha:透明度
还有很多的参数可以调节,这⾥不⼀⼀列举,请看链接。另外,很多其它画线的函数也都⽀持⼀些个性化的参数,⽐如color、alpha、width等等,参数汇总看链接。
hist()
ax.hist(data,bins=50,range=[-5,5],density=True,cumulative=True,rwidth=0.9,orientation = 'vertical')
画频次直⽅图,重要参数介绍:
x:待统计的⼀维数据
bins:柱⼦的数量
range:数据统计的范围
density:是否转换为频率密度图(密度图,乘以范围宽度才是这个范围内数据的频率占⽐)
cumulative:是否累加,若为真,柱⼦统计的是⼩于等于这个值的所有数据。
rwidth:柱⼦的宽度。
orientation:柱⼦是垂直还是⽔平放置。
以下统计⼀个正态分布的累计柱状图:
hist2d()与hexbin()
ax.hist2d(x,y,bins=30,cmap='Blues')
⼆维频次直⽅图。参数与上述⼀维频次直⽅图类似。以下显⽰⼆维正态分布抽样频次统计图(旁边的⾊度条是lorbar(),⼦图如何加还没研究...):
ax.hexbin(x,y,gridsize=30,cmap='Blues')
就是⽅格变成六边形格,gridsize表⽰格⼦⼤⼩:
三维图像
建⽴三维坐标系
fig = plt.figure() #添加绘图窗⼝
ax = fig.add_subplot(221,projection = '3d') #窗⼝内添加3d⼦图
ax = fig.add_subplot(projection = '3d') #如果只画⼀张图,可以⽤这个
plot_surface()
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap='jet')
画三维的曲⾯图,并且带有梯度颜⾊。
X、Y、Z就是每个⽹格点在对应坐标轴的值,cmap是涂⾊类型。rstride 是在⾏上每⼏个⽹格点计算⼀次梯度来图上对应梯度的颜⾊。cstride 就是列上的。它们越⼤,画梯度颜⾊的“补丁”也越⼤,对应地,“补丁”的数量也越少。如下图,⼀个是1,⼀个是2,“补丁”就⼀个是20,⼀个是10。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。