Fast-SCNN

Python024

Fast-SCNN,第1张

https://blog.csdn.net/calvinpaean/article/details/88534052

https://arxiv.org/pdf/1902.04502.pdf

https://github.com/Tramac/Fast-SCNN-pytorch

https://github.com/xiaoyufenfei/Efficient-Segmentation-Networks

摘要 :本文介绍一种适用于低内存嵌入式设备、计算高效、可用于高分辨率图像(1024×2048px)的实时语义分割模型FastSCNN。在现有的快速分割的双分支方法的基础上,我们引入“学习下采样”模块,该模块同时计算多个分辨率分支的低层级特征。然后将高分辨率的空间细节与低分辨率提取的深层特征结合起来,在Cityspaces数据集上获得68.0%mIoU的精度,123.5FPS的速度。我们还证明大规模预训练没必要。我们用ImageNet预训练和Cityspaces的粗标记数据对我们的度量进行了实验验证。最后,我们不修改网络结构,在下采样的输入上获得了速度更快、精度有可比性的结果。

1.引言

实时语义分割的研究最近获得了显著的普及[21,34,17,25,36,20]。

我们发现,文献中语义分割通常由具有编码器-解码器框架的深卷积神经网络来处理[29,2],而许多计算高效的方法使用双分支或多分支架构[21,34,17]。通常情况下:

•更大的感受野对于学习对象类之间的复杂关联(即全局上下文)很重要,

•图像中的空间细节是保持物体边界所必需的,以及

•需要具体的设计来平衡速度和准确性(而不是重定位的分类DCNNs)。

具体地说,在两个分支网络中,较深的分支在低分辨率下用于捕获全局上下文,而较浅的分支在全输入分辨率下用于学习空间细节。然后将二者合并,得到最终的语义分割结果。重要的是,较深的分支带来的计算成本的提升需要靠缩小输入尺寸来克服。而要获得全分辨率图只需要较少的层数。因而,在现代GPU上,实时性是可以实现的。与编码-解码不同的是,双分支中不同分辨率的初始卷积是不共享的。这里值得注意的是,引导上采样网络(GUN)[17]和图像级联网络(ICNet)[36]只在前几层之间共享权重。

我们提出FastSCNN,将双分支技术[21,34,17,36]与编码-解码[29,2]结合起来。FastSCNN的结构如图1。因为深度卷积网络的浅层主要提取低级特征[35,19],我们共享了双分支中初始层的计算。我们称这种技术为“学习下采样”,其效果与编码-解码中的跳连相似。我们只使用了一次跳连来保证计算效率。“学习下采样”模块层数比较浅,以保证特征共享的有效性。最后,我们还使用了深度可分离卷积[30,10]和逆残差模块[28]。

在Cityspaces数据集[6]上,FastSCNN在NvidiaTitanXp(Pascal)上处理全分辨率图像(1024×2048px),速度是123.5FPS,精度是68.0%mIoU。比现有最先进技术快两倍。(BiSeNet,71.4%mIoU,[34])。

虽然我们的参数量达到1.11M,但大多数离线分割方法(如DeepLab[4]和PSPNet[37])以及一些实时算法(如GUN[17]和ICNet[36])的参数量多得多。FastSCNN的模型容量特别低,原因是:(1)要在低内存的嵌入式设备上运行,(2)期待有更好的泛化能力。先前的很多工作都建议在ImageNet数据集[27]上预训练以提高精度和泛化能力。我们研究了预训练对低容量的FastSCNN的影响,结论是,使用预训练或者弱标签数据没有明显的提升效果,在Cityscapes数据集上只提升了0.5%mIoU,这一点和那些大容量的模型刚好相反。总结下我们的贡献:

(1) 提出了FastSCNN,在高分辨率图像(1024×2048px)上,精度有竞争力(68.0%),速度特别强(123.5fps)。

(2) 使用离线方法中常用的跳连,提出了一个浅层的“学习下采样”模块,以快速高效地多分支低层级特征提取。

(3)将FastSCNN设计为小容量,并且实验证明,对于小容量网络,多跑一些epoch,和使用预训练或额外的弱标签数据是等效的。

此外,对于下采样的输入,我们不对网络做任何修改就达到了最先进水平。

2.相关工作

我们对比分析语义分割方法,尤其是低功耗低内存的实时语义分割方法[2,20,21,36,34,17,25,18]。

2.1.语义分割的基础

最先进的语义分割结合了两个独立的模块:编码器和解码器。编码器用卷积和池化来提取特征。解码器从低分辨率特征中恢复空间细节,并预测分割结果[29,2]。通常,编码器用一个移除全连接层的分类网络,例如VGG或ResNet。

FCN[29]是大多数分割模型的基础,采样VGG为编码器,双线性上采样结合较低层的跳接来恢复空间细节。U-Net[26]使用密集的跳连进一步利用空间细节。

之后,受全局的图像上下文先验启发[13,16],PSPNet[37]使用金字塔池化模块,DeepLab[4]使用atrous空间金字塔池化(ASPP)对全局上下文进行编码和利用。

其他竞争性的基本分割结构使用条件随机场(CRF)[38,3]或递归神经网络[32,38]。然而它们不实时。

与目标检测[23,24,15]类似,速度是一个重要因素[21,34,17,25,36,20]。SegNet在FCN的基础上引入了联合编解码模型,成为最早的高效分割模型之一。继SegNet之后,ENet[20]还设计了一个具有很少几层的编码器-解码器,以降低计算成本。

最近出现了双分支和多分支方法。ICNet[36]、ContextNet[21]、BiSeNet[34]和GUN[17]通过在深度分支中减少输入的分辨率来学习全局上下文,而在浅层分支的全分辨率特征中学习边缘的细节信息。

然而,最先进的实时语义分割仍然具有局限性,并且通常需要高端GPU。受双分支方法的启发,FastSCNN使用了一个浅层的网络路径来编码细节信息,上下文信息在低分辨特征中被有效地学习,如图2所示。

2.2 DCNN中的高效设计

深度可分离卷积:  MobileNet[10]提出深度可分离卷积,减少了浮点运算和卷积参数,降低了计算量和内存需求。

高效的重新设计:  Chollet[5]使用高效的深度可分离卷积设计了Xception 网络。MobileNet-V2提出了inverted bottleneck residual block[28]来构建一个高效率的深度网络,用于分类任务。ContextNet[21]使用 inverted bottleneck residual block设计了一个双分支网络,用于实时语义分割。

网络量化:  浮点计算相较于整型和二进制操作要昂贵的多,模型运行时间可以进一步通过量化技巧来缩短。

网络压缩:  剪枝可以用于减小预训练网络的大小,使运行速度更快,参数更少,内存占用更少。

FastSCNN很依赖于深度可分离卷积和residual bottleneck blocks[28]。此外,我们还引入双分支结构,与“学习下采样”模块结合起来,允许在多级分辨率上共享特征,如图2所示。注意,尽管多个分支的初始层提取了相似的特征[35,19],但常用的双分支方法并没有使用这一点。网络量化和网络压缩可以正交应用,这个留给我们以后的工作。

2.3 辅助任务的预训练

普遍认为辅助任务的预训练可以提高精度。早期的目标检测[7]和语义分割[4,37]的研究在ImageNet上进行了预训练[27]。其他实时高效的语义分割方法也在ImageNet上进行了预训练[36,34,17]。然而,尚不清楚低容量网络是否有必要预训练。我们实验证明预训练对小网络没有明显的提升效果。数据增广和训练更多的epoch也能取得类似的效果。

3 我们提出的FastSCNN

FastSCNN灵感来自于双分支结构[21,34,17]和具有跳连的编码器网络[29,26]。因为注意到网络的前几层通常提取低级特征,我们将跳连重新解释为一个“学习下采样”模块,这样我们就能够融合两个框架的关键思想,并可以构建一个快速的语义分割模型。图1和表1是FastSCNN的结构。接下来将介绍我们的设计动机和各模块的详细设置。

3.1 动机

当前最先进的实时语义分割方法是基于双分支结构,每个分支作用在不同级别的分辨率上[21,34,17],从输入图像的低分辨特征中学习全局信息,并使用浅层网络的全分辨率来细化分割结果的精度。由于输入分辨率和网络深度是决定运行时间的主要因素,双分支结构使得模型可以是实时的。

众所周知,网络的前几层提取低级特征,例如边和角[35,19]。因此,我们不采用将两个分支完全独立的方法,而是引入学习下采样模块,让两个分支共享浅层的网络模块。

3.2 网络结构

我们的FastSCNN使用“学习下采样模块”,一个粗糙的全局特征提取模块、一个特征融合模块和一个标准的分类器。所有模块都是用深度可分离卷积来构建,深度可分离卷积已经是许多高效网络的关键[5,10,21]。

3.2.1学习下采样

为了保证低层特征共享的有效和高效,学习下采样模块只采用了三层结构。第一层是标准卷积层(Conv2D),另外两层是深度可分离卷积(DSConv)。这里要说明的是,虽然DSConv可以提升计算效率,但由于输入图像只有3个通道,深度可分离卷积放在第一层的话带来的效率的提升是微不足道的,因此第一层用标准卷积。

学习下采样的3层中的每一层的卷积滑动步长都是2,然后是批量归一化和ReLU。标准卷积和深度可分离中的深度层的卷积核尺寸都是3×3。和[5,28,21]一样,我们省略了深度可分离卷积中深度卷积和点卷积的非线性运算。

3.2.2全局特征提取器

全局特征提取模块是为了获取图像分割的全局上下文。与通常的双分支方法在原始图像上获取低分辨率特征不同,我们是取“学习下采样”模块的输出作为全局特征提取器的输入,其分辨率是原始图像的1/8。详细结构如表1所示。我们使用MobileNet-v2[28]中提出的高效的bottleneck residual block,如表2所示。

特别地,当输入输出大小相同时,我们对bottleneck residual block采用残差连接。我们的bottleneck block使用了一个高效的深度可分离卷积,这样参数量更小,浮点计算更少。此外,在末尾添加金字塔池模块(PPM)[37],以聚合基于不同区域的上下文信息。

3.2.3特征融合模块

与ICNet[36]和ContextNet[21]类似,我们更喜欢简单的特征相加,以确保效率。或者,使用更复杂的特征融合模块,例如[34],这样精度更高而计算量也更大。特征融合模块的细节如表3所示。

3.2.4分类器

分类器中使用了两个深度可分离卷积和一个点卷积。我们发现在特征融合模块后增加几层可以提高精度。分类器模块的详细信息如表1所示。

在训练过程中使用Softmax,因为使用了梯度下降。在推理过程中,我们可以用Argmax代替昂贵的Softmax计算。我们将此选项表示为Fast SCNN cls(分类)。另一方面,如果需要输出概率模型,则使用softmax,表示为FastSCNN prob(概率)。

3.3 和现有的最先进技术比较

3.3.1与双分支模型的关系

最先进的实时模型(ContextNet[21]、BiSeNet[34]和GUN[17])使用双分支结构。我们的“学习下采样”模块相当于它们的空间路径,因为它很浅,从全分辨率学习,并用于特征融合模块(图1)。

我们的全局特征提取模块相当于这种方法更深层的低分辨率分支。相反,我们的全局特征抽取器与学习下采样模块共享其前几层的计算。通过共享层,我们不仅降低了特征提取的计算复杂度,而且还降低了所需的输入大小,因为FastSCNN使用1/8分辨率而不是1/4分辨率进行全局特征提取。

3.3.2与编码-解码模型的关系

FastSCNN可以看做是诸如FCN[29]或U-Net[26]等编码-解码框架的特例。然而,与FCN中的多个跳连和U-Net中的密集跳连不同,FastSCNN只使用一个跳连来减少计算量和内存。

与[35]一致,他主张在DCNNs中只在前几层共享特征,我们将跳连放在网络的前几层。和我们相反,现有的最先进技术都是在每个分辨率下使用很深的模块之后才使用跳连。

4.实验

我们在Cityscapes数据集[6]上评估我们的方法,并且在测试集,也就是Cityscapes benchmark server上提交了它的性能。

4.1实现细节

我们用Python、Tensorflow上进行了实验。我们实验的工作站有有Nvidia Titan X(Maxwell)或Nvidia Titan Xp(Pascal)GPU、CUDA 9.0和CuDNN v7。运行时评估在单个CPU线程和一个GPU中执行,以测量前向推理时间。我们取100帧的平均耗时作为单帧耗时。

我们使用SGD(momentum=0.9),批量大小是12。受[4,37,10]的启发,我们使用“poly”学习率,其中基学习率为0.045,幂为0.9。与MobileNet-V2类似,我们发现L2正则化对深度卷积(depthwise convolution)不必要。其他的层,L2系数是0.00004。因为语义分割的训练数据有限,我们使用了多种数据增强技术:随机缩放(缩放率范围是0.5到2)、平移/裁剪、水平翻转、颜色通道噪声和亮度变化。使用交叉熵损失训练。我们发现学习结束时的辅助损失和0.4权值的全局特征提取模块是有益的。

批量归一化在每个激活函数之前使用。Dropout只在最后一层,也就是softmax之前。与MobileNet[10]和ContextNet[21]相反,我们发现使用ReLU训练得更快,而且精度比ReLU6稍高,即使整个模型都使用深度可分离卷积。

我们发现训练更多的迭代次数可以提高性能。除非另有说明,我们使用Cityescapes数据集[6]用1000个epoch训练我们的模型。值得注意的是,Fast-SCNN的容量故意非常低,只有1.11million个参数。后来我们发现有益的数据增强技术使得不太可能过度拟合。

4.2.在Cityscapes数据集上的评估

Cityscapes是最大的公开的城市道路数据集,包含从欧洲50个不同城市拍摄的高分辨率图像(1024×2048px)。它有5000个高质量标注的图像,其中训练集2975个,验证集500个,测试集1525个。训练集和验证集的标注是公开的,测试集的结果可以在评估服务器上进行评估。此外,20000个弱标注图像(粗糙标签)可用于训练。我们在这两者上都进行评估:高质量标注样本和粗糙标注样本。Cityscapes提供30个类别标签,而只有19个类别用于评估。接下来我们报告模型的mIoU和推断时间。下面报告联合上的平均交集(mIoU)和网络推理时间。

我们在Cityscapes不公开的测试集上评估总体性能。我们所提的FastSCNN与其他最先进的实时语义分割方法(ContextNet[21]、BiSeNet[34]、GUN[17]、ENet[20]和ICNet[36])和离线方法(PSPNet[37]和DeepLab-V2[4])的比较如表4所示。FastSCNN达到68.0%mIoU,略低于BiSeNet(71.5%)和GUN(70.4%)。ContextNet在这里只达到66.1%。

表5比较了不同分辨率下的推断时间。在这里,BiSeNet(57.3 fps)和GUN(33.3 fps)明显慢于FastSCNN(123.5 fps)。与ContextNet(41.9fps)相比,在Nvidia Titan X(Maxwell)上,FastSCNN的速度也明显更快。因此,我们得出结论,FastSCNN显著提高了最先进模型的速度,而只以轻微的精度降低为代价。FastSCNN为低内存嵌入设备而设计,使用1.11million个参数,比BiSeNet的5.8million个参数少5倍。

最后,我们将跳连的作用置零,来测试FastSCNN的性能。验证集上,mIoU从69.22%降低到64.30%。图3比较了定性结果。正如所料,跳连对FastSCNN是有益的,特别是在边界和小尺寸物体周围。

4.3 预训练和弱标注数据

大容量的深度卷积网络,如R-CNN[7]和PSPNet[37]已经表明,通过不同的辅助任务,预训练可以提高性能。由于我们的FastSCNN是低容量的,我们希望在使用预训练和不使用预训练的情况下分别测试性能。据我们所知,预训练和弱标注数据对低容量模型的作用的重要性,还没有被研究过。结果如表6所示。

我们在ImageNet[27]上预先训练FastSCNN,用平均池化替换特征融合模块,分类模块现在只有一个softmax层。FastSCNN在ImageNet的验证集上达到60.71%的top-1精度和83.0%的top-5精度。这一结果表明,FastSCNN的容量不足以达到ImageNet上大多数标准DCNNs的性能(>70%top-1)[10,28]。使用ImageNet预训练的Fast-SCNN在城市景观验证集上的准确率为69.15%mIoU,仅比没有预训练的FastSCNN提高0.53%。因此,我们得出结论,在FastSCNN中,使用ImageNet预训练不能获得显著的提升。

由于Cityscapes数据集和ImageNet数据集之间的重叠是有限的,因此可以合理地假设,由于两个领域的容量有限,FastSCNN可能不会受益。因此,我们现在合并了Cityscapes提供的20000张粗糙标记的附加图像,因为这些图像来自类似的领域。然而,使用粗糙标注数据训练的FastSCNN(使用或不使用ImageNet预训练)性能相似,仅在没有预训练的情况下略优于原始的FastSCNN。请注意,由于DCNNs的随机初始化,微小的性能浮动是微不足道的。

我们表明,无论是ImageNet预训练还是弱标记数据都对我们的低容量DCNN没有显著的好处。图4显示了训练曲线。使用粗糙标注数据训练的FastSCNN的迭代速度慢,因为标注的质量差。使用ImageNet预训练的两个模型在早期阶段(对不用粗标注数据的模型是前400个epoch,对使用粗标注数据的模型是前100个epoch)表现的更好。带有粗数据序列的快速SCNN迭代速度慢是标签质量差的原因。ImageNet的两个预训练版本只在早期阶段都表现得更好(单独训练集最多400个阶段,使用附加的粗略标记数据训练时为100个阶段)。这意味着,当我们从头训练模型(也就是不使用预训练)时,多训练一些epoch就能达到和使用预训练类似的精度。

4.4 更低的输入分辨率

我们评估下在1/2和1/4分辨率下模型的性能(表7)。

1/4分辨率下,模型精度51.9%,速度485.4fps,这比MiniNet(佚名)的40.7%mIoU、250fps好得多。在1/2分辨率下,可达到具有竞争力的62.8%mIoU、285.8fps。我们强调,无需修改,快速SCNN直接适用于较低的输入分辨率,使其非常适合嵌入式设备。

5 结论

我们提出了FastSCNN用于实时语义分割。多分支结构的共享计算可以节省计算量提高速度。实验表明跳连有利于恢复空间细节。如果训练的epoch数足够多,对低容量网络而言,大规模辅助任务预训练没必要。

原文标题:10 Python image manipulation tools.

作者 | Parul Pandey

翻译 | 安其罗乔尔、JimmyHua

今天,在我们的世界里充满了数据,图像成为构成这些数据的重要组成部分。但无论是用于何种用途,这些图像都需要进行处理。图像处理就是分析和处理数字图像的过程,主要旨在提高其质量或从中提取一些信息,然后可以将其用于某种用途。

图像处理中的常见任务包括显示图像,基本操作如裁剪、翻转、旋转等,图像分割,分类和特征提取,图像恢复和图像识别。Python成为这种图像处理任务是一个恰当选择,这是因为它作为一种科学编程语言正在日益普及,并且在其生态系统中免费提供许多最先进的图像处理工具供大家使用。

让我们看一下可以用于图像处理任务中的常用 Python 库有哪些吧。

1.scikit-image

scikit-image是一个开源的Python包,适用于numpy数组。它实现了用于研究,教育和工业应用的算法和实用工具。即使是那些刚接触Python生态系统的人,它也是一个相当简单直接的库。此代码是由活跃的志愿者社区编写的,具有高质量和同行评审的性质。

资源

文档里记录了丰富的例子和实际用例,阅读下面的文档:

http://scikit-image.org/docs/stable/user_guide.html

用法

该包作为skimage导入,大多数功能都在子模块中找的到。下面列举一些skimage的例子:

图像过滤

使用match_template函数进行模板匹配

你可以通过此处查看图库找到更多示例。

2. Numpy

Numpy是Python编程的核心库之一,并为数组提供支持。图像本质上是包含数据点像素的标准Numpy数组。因此,我们可以通过使用基本的NumPy操作,例如切片、掩膜和花式索引,来修改图像的像素值。可以使用skimage加载图像并使用matplotlib显示图像。

资源

Numpy的官方文档页面提供了完整的资源和文档列表:

http://www.numpy.org/

用法

使用Numpy来掩膜图像.

3.Scipy

scipy是Python的另一个类似Numpy的核心科学模块,可用于基本的图像操作和处理任务。特别是子模块scipy.ndimage,提供了在n维NumPy数组上操作的函数。该包目前包括线性和非线性滤波,二值形态学,B样条插值和对象测量等功能函数。

资源

有关scipy.ndimage包提供的完整功能列表,请参阅下面的链接:

https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution

用法

使用SciPy通过高斯滤波器进行模糊:

4. PIL/ Pillow

PIL( Python图像库 )是Python编程语言的一个免费库,它支持打开、操作和保存许多不同的文件格式的图像。然而, 随着2009年的最后一次发布,它的开发停滞不前。但幸运的是还有有Pillow,一个PIL积极开发的且更容易安装的分支,它能运行在所有主要的操作系统,并支持Python3。这个库包含了基本的图像处理功能,包括点运算、使用一组内置卷积核的滤波和色彩空间的转换。

资源

文档中有安装说明,以及涵盖库的每个模块的示例:

https://pillow.readthedocs.io/en/3.1.x/index.html

用法

在 Pillow 中使用 ImageFilter 增强图像:

5. OpenCV-Python

OpenCV( 开源计算机视觉库 )是计算机视觉应用中应用最广泛的库之一 。OpenCV-Python 是OpenCV的python版API。OpenCV-Python的优点不只有高效,这源于它的内部组成是用C/C++编写的,而且它还容易编写和部署(因为前端是用Python包装的)。这使得它成为执行计算密集型计算机视觉程序的一个很好的选择。

资源

OpenCV-Python-Guide指南可以让你使用OpenCV-Python更容易:

https://github.com/abidrahmank/OpenCV2-Python-Tutorials

用法

下面是一个例子,展示了OpenCV-Python使用金字塔方法创建一个名为“Orapple”的新水果图像融合的功能。

6. SimpleCV

SimpleCV 也是一个用于构建计算机视觉应用程序的开源框架。有了它,你就可以访问几个高性能的计算机视觉库,如OpenCV,而且不需要先学习了解位深度、文件格式、颜色空间等。

它的学习曲线大大小于OpenCV,正如它们的口号所说“计算机视觉变得简单”。一些支持SimpleCV的观点有:

即使是初学者也可以编写简单的机器视觉测试摄像机、视频文件、图像和视频流都是可互操作的资源

官方文档非常容易理解,而且有大量的例子和使用案例去学习:

https://simplecv.readthedocs.io/en/latest/

用法

7. Mahotas

Mahotas 是另一个计算机视觉和图像处理的Python库。它包括了传统的图像处理功能例如滤波和形态学操作以及更现代的计算机视觉功能用于特征计算,包括兴趣点检测和局部描述符。该接口是Python语言,适合于快速开发,但是算法是用C语言实现的,并根据速度进行了调优。Mahotas库速度快,代码简洁,甚至具有最小的依赖性。通过原文阅读它们的官方论文以获得更多的了解。

资源

文档包括安装指导,例子,以及一些教程,可以更好的帮助你开始使用mahotas。

https://mahotas.readthedocs.io/en/latest/install.html

用法

Mahotas库依赖于使用简单的代码来完成任务。关于‘Finding Wally’的问题,Mahotas做的很好并且代码量很少。下面是源码:

https://mahotas.readthedocs.io/en/latest/wally.html

8. SimpleITK

ITK 或者 Insight Segmentation and Registration Toolkit是一个开源的跨平台系统,为开发人员提供了一套广泛的图像分析软件工具 。其中, SimpleITK是建立在ITK之上的简化层,旨在促进其在快速原型设计、教育、解释语言中的应用。SimpleITK 是一个图像分析工具包,包含大量支持一般过滤操作、图像分割和匹配的组件。SimpleITK本身是用C++写的,但是对于包括Python以内的大部分编程语言都是可用的。

资源

大量的Jupyter Notebooks 表明了SimpleITK在教育和研究领域已经被使用。Notebook展示了用Python和R编程语言使用SimpleITK来进行交互式图像分析。

http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/

用法

下面的动画是用SimpleITK和Python创建的刚性CT/MR匹配过程的可视化 。点击此处可查看源码!

9. pgmagick

pgmagick是GraphicsMagick库的一个基于python的包装。 GraphicsMagick图像处理系统有时被称为图像处理的瑞士军刀。它提供了一个具有强大且高效的工具和库集合,支持以88种主要格式(包括重要格式,如DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF)读取、写入和操作图像。

资源

有一个专门用于PgMagick的Github库 ,其中包含安装和需求说明。还有关于这个的一个详细的用户指导:

https://github.com/hhatto/pgmagick

用法

使用pgmagick可以进行的图像处理活动很少,比如:

图像缩放

边缘提取

10. Pycairo

Pycairo是图像处理库cairo的一组Python捆绑。Cairo是一个用于绘制矢量图形的2D图形库。矢量图形很有趣,因为它们在调整大小或转换时不会失去清晰度 。Pycairo是cairo的一组绑定,可用于从Python调用cairo命令。

资源

Pycairo的GitHub库是一个很好的资源,有关于安装和使用的详细说明。还有一个入门指南,其中有一个关于Pycairo的简短教程。

库:https://github.com/pygobject/pycairo指南:https://pycairo.readthedocs.io/en/latest/tutorial.html用法

使用Pycairo绘制线条、基本形状和径向梯度:

总结

有一些有用且免费的Python图像处理库可以使用,有的是众所周知的,有的可能对你来说是新的,试着多去了解它们。