首页 > 解决方案 > 如何将 OpenCV 找到的轮廓转换为平滑样条或贝塞尔曲线

问题描述

我正在对颜色位图进行矢量化:很快,我找到了颜色的数量,将每种颜色提取为黑白蒙版,并检测轮廓,然后将所有内容作为 SVG 转储到文件中。但是由于颜色边缘的轮廓非常脆和粗糙,结果很差。此外,我得到了很多噪音(“盐和胡椒”),这为输出添加了太多的小轮廓。

问题

为了消除“盐和胡椒”,我尝试在轮廓检测之前应用不同的模糊效果(中值模糊、高斯)以及形态算子(腐蚀/扩张/打开/关闭),它们都不适合我的情况,因为它们会模糊甚至去除必须保持清晰的微小物体/轮廓。

最后,我最终想到了将检测到的轮廓中的一组点转换为样条曲线或贝塞尔曲线的想法,但还没有找到一种方法来处理 cv2.findContour(...) 返回的数组。

作为一个实验,我试图应用c = cv2.approxPolyDP(c, simplification_param, False)到轮廓上,但它们变得更加棱角分明和破碎,而不是平滑和连续。

有没有办法将 cv2.approxPolyDP(...) 的结果转换为样条曲线或使用其他库来获得与 approxPolyDP 相同但使用贝塞尔曲线的结果?

这些是我用来通过 cv2.findContours(...) 确定轮廓的黑白蒙版示例。最终,它们应该被转换为平滑的连续曲线(不一定是连接或闭合的轮廓)。

面具

面具

谢谢!

标签: pythonopencvcontouropencv-pythonopencv-contour

解决方案


推荐阅读