经常可以看见有一些少年们拿着GrafEq和几何画板去不停地靠试错来用一个方程模拟想要的图像,像这样:
虽然我觉得试错没什么技术含量,但是我也没有想到什么好的方法来批量地制造这种方程。今天在我搜索“二元Lagrange插值”的时候,才发现StackExchange上早就有大神解决了这个问题。
故事的起源是这样的。有人发现Wolfram|Alpha中有一组“人形曲线”,神似而且有解析式:一组三角函数的加和。于是此人发到StackExchange上提问。
一例人形曲线(Dirac):
于是,一位大神就用Fourier变换完成了任务。
先把Mathematica代码贴出来:
param[x_, m_, t_] :=
Module[{f, n = Length[x], nf},
f = Chop[Fourier[x]][[;; Ceiling[Length[x]/2]]];
nf = Length[f];
Total[Rationalize[
2 Abs[f]/Sqrt[n] Sin[
Pi/2 - Arg[f] + 2. Pi Range[0, nf - 1] t], .01][[;;
Min[m, nf]]]]]
tocurve[Line[data_], m_, t_] := param[#, m, t] & /@ Transpose[data]
img = Import["file"];
img = Binarize[img~ColorConvert~"Grayscale"~ImageResize~320~Blur~3]~
Blur~3;
lines = Cases[
Normal@ ListContourPlot[Reverse@ ImageData[img],
Contours -> {0.5}], _Line, -1];
ParametricPlot[Evaluate[tocurve[#, 30, t] & /@ lines],{t,0,1}]
请自行将file换成待处理的文件地址;320是图片大小,3控制圆滑程度。效果是这样的:
具体的过程是先把图片转换成轮廓,打成一堆点,再进行Fourier变换。十分有趣。
注:exp618原创
联系客服