在 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%。
因此,做这样的事情,假设你知道图像中要使用的最大值 a
和 b
。我会让它们都相等,这样你就可以生成水平和垂直宽度椭圆的相等变化:
%// 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);
这段代码可能需要一些解释。我们首先声明一个给定大小的输出图像,我们还声明a
和b
的最小值和最大值。我们还定义了一个 meshgrid
点,以便我们可以使用它来为我们生成的每个椭圆生成我们的空间坐标。
我们定义了一个我们希望在退出之前填充图像的比例,所以我在这里选择了40%,并且通过rng
.
将随机种子设置为123123
现在,我们将不断循环,直到图像中被填充的像素比例等于或超过这个比例。在循环的每次迭代中,我们生成 a
、b
和我们的中心,确保它们遵守图像的边界。然后我们偏移我们的参考坐标网格,使随机中心现在是原点,我们检查这个新坐标网格中的哪些点满足椭圆方程。无论哪个点满足方程,我们将图像中的这些点设置为[32,255]
之间的随机强度。请记住,我选择了 小于 不等式,以便我们可以填充椭圆。我还确保故意选择最小强度 32,以便我们可以计算填充图像中有多少像素被填充。为了确定图像被填充了多少,我们计算了多少 non-zero像素点,看看这个比例是多少,和我们想要的比例比较。如果它等于或大于,我们就停止。如果不是,我们继续生成椭圆,直到满足这个比例。
综上所述,这就是我使用上述代码的 run-through 得到的结果。
我将在 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%。
因此,做这样的事情,假设你知道图像中要使用的最大值 a
和 b
。我会让它们都相等,这样你就可以生成水平和垂直宽度椭圆的相等变化:
%// 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);
这段代码可能需要一些解释。我们首先声明一个给定大小的输出图像,我们还声明a
和b
的最小值和最大值。我们还定义了一个 meshgrid
点,以便我们可以使用它来为我们生成的每个椭圆生成我们的空间坐标。
我们定义了一个我们希望在退出之前填充图像的比例,所以我在这里选择了40%,并且通过rng
.
现在,我们将不断循环,直到图像中被填充的像素比例等于或超过这个比例。在循环的每次迭代中,我们生成 a
、b
和我们的中心,确保它们遵守图像的边界。然后我们偏移我们的参考坐标网格,使随机中心现在是原点,我们检查这个新坐标网格中的哪些点满足椭圆方程。无论哪个点满足方程,我们将图像中的这些点设置为[32,255]
之间的随机强度。请记住,我选择了 小于 不等式,以便我们可以填充椭圆。我还确保故意选择最小强度 32,以便我们可以计算填充图像中有多少像素被填充。为了确定图像被填充了多少,我们计算了多少 non-zero像素点,看看这个比例是多少,和我们想要的比例比较。如果它等于或大于,我们就停止。如果不是,我们继续生成椭圆,直到满足这个比例。
综上所述,这就是我使用上述代码的 run-through 得到的结果。