前几日,在百度Mma吧里,有朋友问了个问题:

怎么平滑手画线里的锯齿。

如果是想选绘图软件的话,建议:PhotoShop或几何画板之类的;如果是已经绘制好的图片,那么处理起来并不太简单,这里简单说一下如何用Mma处理。为了简单起见,只考虑简单封闭曲线,代码如下:

Snap1

Snap2


pts = Position[ImageData[Thinning[ColorNegate@Binarize[g]]],
x_ /; x > 0.5] // DeleteDuplicates; (*坐标;
Binarize:将图像化为二值图像; ColorNegate:反色; Thinning:瘦化曲线; ImageData:将图像转为矩阵; Position:获取曲线每个像素的坐标;*) n = Length[pts]; t = 0.01;(*平滑参数,0-1之间,越大越平滑*) means = Floor[t n] + 1; Do[ls = Total[Abs[#]] & /@ (# - pts[[k - 1]] & /@ pts[[k ;;]]); p = Position[ls, Min[ls]][[1, 1]] + k - 1; If[p > k, s = pts[[p]]; pts[[p]] = pts[[k]]; pts[[k]] = s;], {k, 2, n - 1}] Rotate[Graphics[{BSplineCurve[pts[[1 ;; -1 ;; means]], SplineClosed -> True]}], -Pi/2]

处理后的效果图:
如果你也是Mma爱好者,请将完善此功能。
比如,可以处理非封闭曲线和交叉曲线,还要考虑到处理拍摄的照片。

Snap3

注释
例子中的图片是使用Mma中的绘图工具画的。
BSplineCurve 是样条曲线函数