Matlab:如何避免图像中的椭圆重叠? [英] Matlab: how to avoid ellipses overlapping in image?

查看:343
本文介绍了Matlab:如何避免图像中的椭圆重叠?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用函数文件 [ret] = drawellipse(x,y,a,b,angle,steps,color,img)。通过脚本文件调用函数以在图像中绘制随机椭圆。但是一旦我设置了随机中心点(x,y)和随机a,b,很可能会出现椭圆相交。我该如何防止交叉? (我应该绘制彼此分开的省略号)
好​​了,在这里我有一个函数文件来检查省略号是否重叠, overlap = overlap_ellipses(X0,Y0,A0,B0,angle0,X1,Y1,A1,B1,角度1)。如果两个椭圆重叠,则'overlap = 1',否则'overlap = 0'。
基于所有这些,我在命令窗口中测试:

I've been using a function file [ret]=drawellipse(x,y,a,b,angle,steps,color,img). Calling the function through a script file to draw random ellipses in image. But once i set the random center point(x,y), and random a, b, there is high possibility that the ellipses intersection would occur. How can i prevent the intersection? (I'm supposed to draw the ellipses that are all separate from each other) Well, over here i have a function file which is to check whether the ellipses got overlap or not,overlap = overlap_ellipses(x0,y0,a0,b0,angle0,x1,y1,a1,b1,angle1). If the two ellipses are overlap, then the 'overlap=1', otherwise 'overlap=0'. Based on all these, i tested in the command window:

x=rand(4,1)*400;  % x and y are the random coodinates for the center of ellipses
y=rand(4,1)*400;
a=[50 69 30 60];  % major axis   for a and b, i intend to use random also in the future
b=[20 40 10 40];  % minor axis
angle=[30 90 45 0]; % angle of ellipse
steps=10000;
color=[255 0 0];   % inputs for another function file to draw the ellipse
img=zeros(500,500,3);

以下我想显示省略号如果重叠== 0 和'if overlap == 1',减少a和b,直到没有交叉点。最后,要显示img。

The following i want to dispaly the ellipses if overlap==0, and 'if overlap==1', decrease the a and b, till there is no intersection. Lastly, to imshow the img.

for i=1:length(x)
img=drawellipse(x(i),y(i),a(i),b(i),angle(i),steps,color,img);
end

对我来说,我很难对中间部分进行编码。如何使用if语句获取 overlap 的值以及如何使索引对应于我需要绘制的椭圆。

For me now, i have difficulty in coding the middle part. How can i use the if statement to get the value of overlap and how to make the index corresponding to the ellipse i need to draw.

我的测试有点像

for k=1:(length(x)-1)
overlap = overlap_ellipses(x(1),y(1),a(1),b(1),angle(1),x(1+k),y(1+k),a(1+k),b(1+k),angle(1+k))
end

它返回

overlap=0
overlap=0
overlap=1

它不是[0 0 1]。我无法弄清楚,因此陷入了这个过程。
最终的图像看起来像这个椭圆的voronoi图
(任意两个省略号之间没有交集)

it is not [0 0 1]. I can't figure it out, thus stuck in the process. The final image shoule look like the picture in this voronoi diagram of ellipses. (There is no intersection between any two ellipses)

推荐答案

@arne.b (第一个)是栅格化的好方法非重叠的椭圆。

The solution proposed by @arne.b (the first one) is a good way to rasterize non-overlapping ellipses.

让我用一个例子说明这个想法。我将扩展我的之前的答案

Let me illustrate that idea with an example. I will be extending my previous answer:

%# color image
I = imread('pears.png');
sz = size(I);

%# parameters of ellipses
num = 7;
h = zeros(1,num);
clr = lines(num);             %# color of each ellipse
x = rand(num,1) .* sz(2);     %# center x-coords
y = rand(num,1) .* sz(1);     %# center y-coords
a = rand(num,1) .* 200;       %# major axis length
b = rand(num,1) .* 200;       %# minor axis length
angle = rand(num,1) .* 360;   %# angle of rotation

%# label image, used to hold rasterized ellipses
BW = zeros(sz(1),sz(2));

%# randomly place ellipses one-at-a-time, skip if overlaps previous ones
figure, imshow(I)
axis on, hold on
for i=1:num
    %# ellipse we would like to draw directly on image matrix
    [ex,ey] = calculateEllipse(x(i),y(i), a(i),b(i), angle(i), 100);

    %# lets plot the ellipse (overlayed)
    h(i) = plot(ex,ey, 'LineWidth',2, 'Color',clr(i,:));

    %# create mask for image pixels inside the ellipse polygon
    mask = poly2mask(ex,ey,sz(1),sz(2));

    %# get the perimter of this mask
    mask = bwperim(mask,8);

    %# skip if there is an existing overlapping ellipse
    if any( BW(mask)~=0 ), continue, end

    %# use the mask to place the ellipse in the label image
    BW(mask) = i;
end
hold off
legend(h, cellstr(num2str((1:num)','Line%d')), 'Location','BestOutside')    %'

%# set pixels corresponding to ellipses using specified colors
clr = im2uint8(clr);
II = I;
for i=1:num
    BW_ind = bsxfun(@plus, find(BW==i), prod(sz(1:2)).*(0:2));
    II(BW_ind) = repmat(clr(i,:), [size(BW_ind,1) 1]);
end
figure, imshow(II, 'InitialMagnification',100, 'Border','tight')


注意如何按照添加省略号的顺序执行重叠测试,因此在Line1之后(绘制了蓝色)和Line2(绿色),将跳过Line3(红色),因为它与之前的一个重叠,依此类推其余的......

Note how the overlap test is performed in the order the ellipses are added, thus after Line1 (blue) and Line2 (green) are drawn, Line3 (red) will be skipped because it overlaps one of the previous ones, and so on for the rest...

这篇关于Matlab:如何避免图像中的椭圆重叠?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆