在 Matlab 中生成随机椭圆

Generating random ellipses in Matlab

我将在 Matlab 中生成随机椭圆。我掌握的信息是:大半径椭圆的分布,小半径椭圆的分布,以及比例(例如,我想在网格填充一定数量或比例后停止这个过程)。

我尝试了以下圆圈代码:

out_size = [200 200];
out = zeros(out_size(1),out_size(2)); 
[xx,yy] = meshgrid(1:out_size(1),1:out_size(2));
for i=1:40
    obj = [random('unif',1,200) random('unif',1,200),random('unif',4,8)];
    d = sqrt((xx-obj(1)).^2 + (yy-obj(2)).^2);
    out(d <= obj(3))=1;
end
figure, imagesc(out), axis equal tight xy

有什么想法吗?

对于 Whosebug 社区中那些看起来很困惑的人,我将重新表述问题的内容(去 Mentalist!)。


OP 希望在图像中绘制随机椭圆。对于每个椭圆,我们可以通过其主要长度、次要长度和中心位置来表征它。对于每个椭圆,OP 希望从分布(均匀分布、高斯分布等)中随机抽样以获得主要长度、次要长度和中心位置。一旦生成这些,OP 希望将它们绘制到图像上。

要生成的椭圆数量取决于在此图像上绘制的绘制像素的比例。如果绘制的像素数量超过一定数量,我们将停止绘制。


你似乎走对了路。但是,我要做的是首先生成主要坐标、次要坐标和中心坐标。之后,您可以使用循环遍历每个参数的四重奏,为椭圆生成正确的空间位置,然后使用这些位置索引到您的图像并设置强度。我要开玩笑,我会随机设置每个椭圆的强度。但是,为了确保您能看到椭圆,我将限制 [32,255].

之间产生的强度

此外,我建议您不要从主要和次要长度的高斯分布中抽样,因为这些的定义要求它们是正的。现在,回顾一下,给定中心点 (x_0, y_0) 以及长短长度 (a,b) 的椭圆方程定义为:

请注意,如果 a > b,长轴是水平的,所以你会得到一个水平宽的椭圆。如果 b > a,长轴是垂直的,所以你会得到一个垂直宽的椭圆。不过这不会影响我们的代码。

现在,我们要做的是我们将有一个 while 循环,不断迭代和填充您的图像 直到 您的图像的一定比例已满。然后我们在填满这么多像素后停止。现在,我将选择总图像的 40%。

因此,做这样的事情,假设你知道图像中要使用的最大值 ab。我会让它们都相等,这样你就可以生成水平和垂直宽度椭圆的相等变化:

%// Declare output image
out = zeros(200,200);

%// Declare a and b
a = 20;
b = 20;

%// Declare reference coordinates
[X,Y] = meshgrid(1:size(out,2), 1:size(out,1));

%// Proportion
prop = 0.4;

%// Set seed for reproducibility
rng(123123);

while true
    %// Generate random a, b and centre
    x_axis = a*rand;
    y_axis = b*rand;
    centre = [size(out,2)*rand size(out,1)*rand];

    %// Define coordinates with respect to this centre
    Xmove = X - centre(1);
    Ymove = Y - centre(2);

    %// Check ellipse equation and filter out those locations
    %// that satisfy result
    ind = (((Xmove.^2) / x_axis^2) + ((Ymove.^2) / y_axis^2)) <= 1;

    %// Set these locations in the output image to a random intensity
    intensity = floor(223*rand) + 32;        
    out(ind) = intensity;

    %// Check proportion
    if sum((out(:) > 0) / numel(out)) >= prop
        break;
    end
end

%// Cast and show the output
out = uint8(out);
imshow(out);

这段代码可能需要一些解释。我们首先声明一个给定大小的输出图像,我们还声明ab的最小值和最大值。我们还定义了一个 meshgrid 点,以便我们可以使用它来为我们生成的每个椭圆生成我们的空间坐标。

我们定义了一个我们希望在退出之前填充图像的比例,所以我在这里选择了40%,并且通过rng.

将随机种子设置为123123

现在,我们将不断循环,直到图像中被填充的像素比例等于或超过这个比例。在循环的每次迭代中,我们生成 ab 和我们的中心,确保它们遵守图像的边界。然后我们偏移我们的参考坐标网格,使随机中心现在是原点,我们检查这个新坐标网格中的哪些点满足椭圆方程。无论哪个点满足方程,我们将图像中的这些点设置为[32,255]之间的随机强度。请记住,我选择了 小于 不等式,以便我们可以填充椭圆。我还确保故意选择最小强度 32,以便我们可以计算填充图像中有多少像素被填充。为了确定图像被填充了多少,我们计算了多少 non-zero像素点,看看这个比例是多少,和我们想要的比例比较。如果它等于或大于,我们就停止。如果不是,我们继续生成椭圆,直到满足这个比例。

综上所述,这就是我使用上述代码的 run-through 得到的结果。