Python画图之总结待整理
创新互联建站主营龙井网站建设的网络公司,主营网站建设方案,app软件定制开发,龙井h5重庆小程序开发公司搭建,龙井网站营销推广欢迎龙井等地区企业咨询
Python Data Visualizations
Seaborn 库:
Python Seaborn 教程:
matplotlib: plotting with Python
matplotlib: plotting with Python-github
python-data-visualization-course
Interactive Web Plotting for Python
Interactive Web Plotting for Python-github
CSDN-markdown编辑器语法——字体、字号与颜色
%matplotlib inline
%matplotlib notebook
Need to use either
or
Only one in each notebook! using inline will just sent png images to browser, using notebook will provide interactivity and allow updating old figures. With notebook you need to make sure to create a new figure before plotting, otherwise the last one will be updated!
还有简便的 plt.close('all') 关闭所有图,不用管 fig 号码
Some plots from these tutorials:
调整名字和间隔
设置不同名字和位置
调整坐标轴
参数loc='upper right'
表示图例将添加在图中的右上角.
调整位置和名称
最后我们得到带有图例信息的图片.
移动坐标
然后我们挪动坐标轴的位置.
然后标注出点(x0, y0)的位置信息. 用plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
画出一条垂直于x轴的虚线.
添加注释 annotate
接下来我们就对(x0, y0)这个点进行标注.
其中参数xycoords='data'
是说基于数据的值来选位置,xytext=(+30, -30)
和textcoords='offset points'
对于标注位置的描述 和 xy 偏差值,arrowprops
是对图中箭头类型的一些设置.
添加注释 text
其中-3.7, 3,
是选取text的位置, 空格需要用到转字符
,fontdict
设置文本字体.
生成图形
当图片中的内容较多,相互遮盖时,我们可以通过设置相关内容的透明度来使图片更易于观察,也即是通过本节中的bbox
参数设置来调节图像信息.
首先参考之前的例子, 我们先绘制图像基本信息:
调整坐标
然后对被遮挡的图像调节相关透明度,本例中设置 x轴 和 y轴 的刻度数字进行透明度设置
其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度. 最终结果如下:
散点图
首先,先引入matplotlib.pyplot简写作plt,再引入模块numpy用来产生一些随机数据。生成1024个呈标准正态分布的二维数据组 (平均数是0,方差为1) 作为一个数据集,并图像化这个数据集。每一个点的颜色值用T来表示:
数据集生成完毕,现在来用scatterplot这个点集,鼠标点上去,可以看到这个函数的各个parameter的描述,如下图:
输入X和Y作为location,size=75,颜色为T,color map用默认值,透明度alpha 为 50%。 x轴显示范围定位(-1.5,1.5),并用xtick()函数来隐藏x坐标轴,y轴同理:
今天的柱状图分成上下两部分,每一个柱体上都有相应的数值标注,并且取消坐标轴的显示。
生成基本图形
向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据。使用的函数是plt.bar
,参数为X和Y:
这样我们就生成了下图所示的柱状图基本框架:
现在的结果呈现:
接下来我们用函数plt.text分别在柱体上方(下方)加上数值,用%.2f保留两位小数,横向居中对齐ha='center',纵向底部(顶部)对齐va='bottom':
最终的结果就像开始一样:
画等高线
数据集即三维点 (x,y) 和对应的高度值,共有256个点。高度值使用一个 height function f(x,y) 生成。 x, y 分别是在区间 [-3,3] 中均匀分布的256个值,并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格:
接下来进行颜色填充。使用函数plt.contourf把颜色加进去,fill, 位置参数分别为:X, Y, f(X,Y)。透明度0.75,并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色。8代表等高线的个数。
接下来进行等高线绘制。使用plt.contour函数划线。位置参数为:X, Y, f(X,Y)。颜色选黑色,线条宽度选0.5。现在的结果如下图所示,只有颜色和线条,还没有数值Label:
添加高度数字
其中,8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二。
最后加入Label,inline控制是否将Label画在线里面,字体大小为10。并将坐标轴隐藏:
随机矩阵画图
这一节我们讲解怎样在matplotlib中打印出图像。这里我们打印出的是纯粹的数字,而非自然图像。 我们今天用这样 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。
colorbar
下面我们添加一个colorbar ,其中我们添加一个shrink参数,使colorbar的长度变短为原来的92%:
3D
首先在进行 3D Plot 时除了导入 matplotlib ,还要额外添加一个模块,即 Axes 3D 3D 坐标轴显示:
之后要先定义一个图像窗口,在窗口上添加3D坐标轴,显示成下图:
接下来给进 X 和 Y 值,并将 X 和 Y 编织成栅格。每一个(X, Y)点对应的高度值我们用下面这个函数来计算。
其中,rstride 和 cstride 分别代表 row 和 column 的跨度。
下面两个图分别是跨度为1 和 5 的效果:
投影
下面添加 XY 平面的等高线:
如果 zdir 选择了x,那么效果将会是对于 XZ 平面的投影,效果如下
学习目标:
OpenCV 中有 150 多种色彩空间转化的方法,这里只讨论两种:
HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]。不同的软件使用不同的规模。如果要比较 OpenCV 值和它们,你需要标准化这些范围。
HSV 和 HLV 解释
运行结果:该段程序的作用是检测蓝色目标,同理可以检测其他颜色的目标
结果中存在一定的噪音,之后的章节将会去掉它
这是物体跟踪中最简单的方法。一旦你学会了等高线的函数,你可以做很多事情,比如找到这个物体的质心,用它来跟踪这个物体,仅仅通过在相机前移动你的手来画图表,还有很多其他有趣的事情。
菜鸟教程 在线 HSV- BGR 转换
比如要找出绿色的 HSV 值,可以使用上面的程序,得到的值取一个上下界。如上面的取下界 [H-10, 100, 100],上界 [H+10, 255, 255]
或者使用其他工具如 GIMP
学习目标:
对图像进行阈值处理,算是一种最简单的图像分割方法,基于图像与背景之间的灰度差异,此项分割是基于像素级的分割
threshold(src, thresh, maxval, type[, dst]) - retval, dst
计算图像小区域的阈值。所以我们对同一幅图像的不同区域得到不同的阈值,这给我们在不同光照下的图像提供了更好的结果。
三个特殊的输入参数和一个输出参数
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) - dst
opencv-threshold-python
OpenCV 图片集
本节原文
学习目标:
OpenCV 提供两种变换函数: cv2.warpAffine 和 cv2.warpPerspective
cv2.resize() 完成缩放
文档说明
运行结果
说明 : cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 还慢,好像与官方文档说的不一致? 有待验证。
速度比较: INTER_CUBIC INTER_NEAREST INTER_LINEAR INTER_AREA INTER_LANCZOS4
改变图像的位置,创建一个 np.float32 类型的变换矩阵,
warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) - dst
运行结果:
旋转角度( )是通过一个变换矩阵变换的:
OpenCV 提供的是可调旋转中心的缩放旋转,这样你可以在任何你喜欢的位置旋转。修正后的变换矩阵为
这里
OpenCV 提供了 cv2.getRotationMatrix2D 控制
cv2.getRotationMatrix2D(center, angle, scale) → retval
运行结果
cv2.getAffineTransform(src, dst) → retval
函数关系:
\begin{bmatrix} x'_i \ y'_i \end{bmatrix}\begin{bmatrix} x'_i \ y'_i \end{bmatrix} =
其中
运行结果:图上的点便于观察,两图中的红点是相互对应的
透视变换需要一个 3x3 变换矩阵。转换之后直线仍然保持笔直,要找到这个变换矩阵,需要输入图像上的 4 个点和输出图像上的对应点。在这 4 个点中,有 3 个不应该共线。通过 cv2.getPerspectiveTransform 计算得到变换矩阵,得到的矩阵 cv2.warpPerspective 变换得到最终结果。
本节原文
平滑处理(smoothing)也称模糊处理(bluring),是一种简单且使用频率很高的图像处理方法。平滑处理的用途:常见是用来 减少图像上的噪点或失真 。在涉及到降低图像分辨率时,平滑处理是很好用的方法。
图像滤波:尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
消除图像中的噪声成分叫做图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段,在高频段,有用的信息会被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
滤波的目的:抽出对象的特征作为图像识别的特征模式;为适应图像处理的要求,消除图像数字化时混入的噪声。
滤波处理的要求:不能损坏图像的轮廓及边缘等重要信息;图像清晰视觉效果好。
平滑滤波是低频增强的空间滤波技术,目的:模糊和消除噪音。
空间域的平滑滤波一般采用简单平均法,即求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑效果越好,但是邻域过大,平滑也会使边缘信息的损失的越大,从而使输出图像变得模糊。因此需要选择合适的邻域。
滤波器:一个包含加权系数的窗口,利用滤波器平滑处理图像时,把这个窗口放在图像上,透过这个窗口来看我们得到的图像。
线性滤波器:用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。
低通滤波器、高通滤波器、带通滤波器、带阻滤波器、全通滤波器、陷波滤波器
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) - dst
均值滤波是方框滤波归一化后的特殊情况。归一化就是要把处理的量缩放到一个范围内如 (0,1),以便统一处理和直观量化。非归一化的方框滤波用于计算每个像素邻近内的积分特性,比如密集光流算法中用到的图像倒数的协方差矩阵。
运行结果:
均值滤波是典型的线性滤波算法,主要方法为邻域平均法,即用一片图像区域的各个像素的均值来代替原图像中的各个像素值。一般需要在图像上对目标像素给出一个模板(内核),该模板包括了其周围的临近像素(比如以目标像素为中心的周围8(3x3-1)个像素,构成一个滤波模板,即 去掉目标像素本身 )。再用模板中的全体像素的平均值来代替原来像素值。即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) ,其中m为该模板中包含当前像素在内的像素总个数。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
结果:
高斯滤波:线性滤波,可以消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过 加权平均 后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯滤波有用但是效率不高。
高斯模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现)。从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。 高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
一维零均值高斯函数为: 高斯分布参数 决定了高斯函数的宽度。
高斯噪声的产生
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) - dst
线性滤波容易构造,并且易于从频率响应的角度来进行分析。
许多情况,使用近邻像素的非线性滤波会得到更好的结果。比如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大值的时候,用高斯滤波器进行图像模糊时,噪声像素不会被消除,而是转化为更为柔和但仍然可见的散粒。
中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声『椒盐噪声又称脉冲噪声,它随机改变一些像素值,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。』的同时又能保留图像边缘细节,
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于 斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise) 来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程却不再是加权运算。
中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。
与均值滤波比较:
说明:中值滤波在一定条件下,可以克服线性滤波器(如均值滤波等)所带来的图像细节模糊,而且对滤除脉冲干扰即图像扫描噪声最为有效。在实际运算过程中并不需要图像的统计特性,也给计算带来不少方便。 但是对一些细节多,特别是线、尖顶等细节多的图像不宜采用中值滤波。
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合 图像的空间邻近度和像素值相似度 的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差 sigma-d ,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。 但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
运行结果
学习目标:
形态变换是基于图像形状的一些简单操作。它通常在二进制图像上执行。
膨胀与腐蚀实现的功能
侵蚀的基本思想就像土壤侵蚀一样,它会侵蚀前景物体的边界(总是试图保持前景为白色)。那它是做什么的?内核在图像中滑动(如在2D卷积中)。只有当内核下的所有像素都是 1 时,原始图像中的像素( 1 或 0 )才会被视为 1 ,否则它将被侵蚀(变为零)
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) - dst
与腐蚀的操作相反。如果内核下的至少一个像素为“1”,则像素元素为“1”。因此它增加了图像中的白色区域或前景对象的大小增加。通常,在去除噪音的情况下,侵蚀之后是扩张。因为,侵蚀会消除白噪声,但它也会缩小我们的物体。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的物体区域会增加。它也可用于连接对象的破碎部分
等高线可以简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度。等高线是形状分析、目标检测和识别的有用工具。
让我们看看如何找到二值图像的轮廓:
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。
极端点是指物体的最上面、最下面、最右边和最左边的点。
#导入模块
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()
差不多就这样吧,有问题的话再留言吧
1、Numpy常用方法使用大全(超详细)
1、Series和DataFrame简单入门
2、Pandas操作CSV文件的读写
3、Pandas处理DataFrame,Series进行作图
1、Matplotlib绘图之属性设置
2、Matplotlib绘制误差条形图、饼图、等高线图、3D柱形图
1、层次分析法(AHP)——算数平均值法、几何平均值法、特征值法(Python实现,超详细注释)
2、Python实现TOPSIS分析法(优劣解距离法)
3、Python实现线性插值和三次样条插值
4、Python实现线性函数的拟合算法
5、Python实现统计描述以及计算皮尔逊相关系数
6、Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径
下载预Matplotlib编译的安装包,注意选择Python的版本和系统的位数
使用pip包管理器安装,在命令行中输入:pip install 下载安装包的完整路径
打开Python,如果import maplotlib没有报错则安装成功