最近工作上有将位图轮廓转换为矢量轮廓的需求,在进行了一些资料收集之后发现了AutoTrace与Potrace两个比较成熟的算法,并且都有广泛应用的开源实现版本,一个星期了一直想要把自己的摸索过程分享出来帮助更多的人少走些弯路,却拖拉至今,这篇笔记在blog草稿箱中也不知道什么时候才能发表出来。上面都是些碎碎念,下面是正文。
2019.03.09更新:
增加包装类libPotraceWrapper与调用Demo[Github]
一切都要从工作上的需求说起,其需要将送入的图像前背景分割(这个将会在另外一篇blog中详细介绍),然后将分割出来的前景的外部轮廓转为路径,如下面Photoshop中演示的选区转路径一样。
前序操作是使用OpenCV完成的,在处理后已经完成了前景的提取以及将图像转换为背景为纯白,前景为只有外围轮廓的二值图像,如下所示
下面一步操作就是将其转换为矢量路径,其实在OpenCV处理的过程中cv::findContours已经将轮廓描述为一系列的点的集合了,只是大量的点并不是最优的甚至可以称为最差的矢量路径的描述方式,如同上面PS的操作演示一般,PS能够很好地将选区转换为只有几个锚点描述的几条曲线路径,是非常优秀的转换了。
所以这时候我们就需要一个能够将位图转换为矢量描述的算法来完成这个需求,这样就找到了符合条件的Potrace
0.项目地址:Potrace:Transforming bitmaps into vector graphics
1.算法详解:Potrace: a polygon-based tracing algorithm - Peter Selinger
2.中文翻译:Potrace:一个基于多边形的位图轮廓矢量化算法
本篇blog只记录Potrace的使用以及libpotrace的配置与编译,由于博主水平有限,就描述算法实现细节,劳请移步上面贴出的链接处阅读。
Potrace
Potrace is a cross-platform, open-source software which converts bitmapped images into vector graphics. It is written and maintained by Peter Selinger.
其实wiki的解释能够知道Potrace是一个程序,一个命令行工具,而不只是一个库,所以在我们在程序中集成其功能时会没有办法直接使用,所以在它的项目首页就有一些第三方的工具是对这个纯命令行工具的GUI封装,比如Rasterbater就是一个C#实现的带有GU