在Matlab中生成随机椭圆

时间:2015-02-23 20:02:33

标签: matlab image-processing

我将在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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

对于那些看起来很困惑的StackOverflow社区中的人,我会重新提出问题的内容(去找心理学家!)。


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%,并将随机种子设置为123123到rng

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

所有这一切,这就是我通过上述代码的运行所得到的。

enter image description here