生成随机平滑的二维闭合曲线

计算科学 matlab Python 可视化 几何学
2021-12-21 21:09:55

我想知道如何生成随机二维闭合平滑曲线的集合。

例如,我考虑过生成一个具有随机峰值的随机 3D 表面,然后将 Z=0 平面与其相交,并提取最大的轮廓。我只是不确定如何实际操作......这是正确的方法吗?我很想得到一些指导。

我正在寻找这种方式的结果:

在此处输入图像描述

2个回答

由于你的图形是一个闭环,它的参数曲线x(t)y(t)必须是周期函数。这提出了一种生成此类图形的方法,即通过对具有随机幅度和相位的正弦曲线/谐波求和来构造随机平滑周期函数x(t)y(t)不幸的是,很难保证这样的图形不会自相交。

但附近的想法是切换到极坐标,并考虑半径是极角的函数的圆形图形。闭环条件要求是周期性的,您可以使用相同类型的谐波总和过程来生成随机平滑周期性如果你通过添加一些常数项(大于随机幅度的总和r(t)tr(t)r(t)r(t)

一些实现这个想法的matlab代码:

clear all
close all

% Randomize amplitude and phase.
H = 10;
rho = rand(1,H) .* logspace(-0.5,-2.5,H);
phi = rand(1,H) .* 2*pi;

% Accumulate r(t) over t=[0,2*pi]
t = linspace(0,2*pi,101);
r = ones(size(t));
for h=1:H
  r = r + rho(h)*sin(h*t+phi(h));  
end

% Reconstruct x(t), y(t)
x = r .* cos(t);
y = r .* sin(t);

% Plot r(t) vs t
figure;
plot(t,r,'r-');
xlabel('t, radians');
ylabel('r(t)');

% Plot x(t) and y(t)
figure;
hold on;
plot(0,0,'ko');
plot(cos(t),sin(t),'k--');
plot(x,y,'b-');
xlabel('x(t)');
ylabel('y(t)');
axis equal;

这是一些示例(随机)输出:

随机 r(t) 对应的 x(t) 和 y(t)

使用 python + numpy + matplotlib 实现相同的想法应该很简单。

我最终做的是下载数千张随机图像,使用高斯滤波器对其进行平滑处理,并提取不同级别的轮廓。我从每个模糊图像中提取了 2-3 个闭合轮廓,并将它们全部打包成一组曲线。我的 MATLAB 代码可在此处获得:

https://github.com/royvelich/smooth-curves-generator

但是,您必须自己收集图像,一种选择是使用:

https://github.com/hardikvasa/google-images-download

在此处输入图像描述