前几日,在百度Mma吧里,有朋友问了个问题:
怎么平滑手画线里的锯齿。
如果是想选绘图软件的话,建议:PhotoShop或几何画板之类的;如果是已经绘制好的图片,那么处理起来并不太简单,这里简单说一下如何用Mma处理。为了简单起见,只考虑简单封闭曲线,代码如下:
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爱好者,请将完善此功能。
比如,可以处理非封闭曲线和交叉曲线,还要考虑到处理拍摄的照片。