Matlab实心圆

时间:2014-05-19 13:14:30

标签: matlab geometry

我们想要的是在深灰色背景上随机灰度背景随机位置绘制几个实心圆。我们应该怎么做?此外,如果圆圈重叠,我们需要它们来改变重叠部分的颜色。

由于这是学校的作业,我们不是在寻找现成的答案,而是寻找在MATLAB中使用哪些工具的指南!

3 个答案:

答案 0 :(得分:3)

如果您想要正确执行此操作,请查看我要调查的事项清单:

  • 弄清楚如何在MATLAB中绘制圆圈。因为您没有图像处理工具箱(请参阅注释),您可能必须自己创建一个功能。我会给你一些入门代码:

     function [xout, yout] = circle(x,y,r,rows,cols)
     [X,Y] = meshgrid(x-r:x+r, y-r:y+r);
     ind = find(X.^2 + Y.^2 <= r^2 & X >= 1 & X <= cols & Y >= 1 & Y <= rows);     
     xout = X(ind);
     yout = Y(ind);
     end
    

    上述功能的作用是它接收(x,y)坐标以及半径 圆圈。您还需要指定图像中需要的行数和列数。之所以如此,是因为这个函数会阻止你给出你无法画出的图像范围外的坐标。最终输出将为您提供所有值的坐标,其中的边界内。这些坐标已经是整数,所以不需要任何舍入和这样的事情。此外,当您将这些坐标分配到图像中的位置时,这些完全适合。需要注意的一点是,坐标采用倒置笛卡尔。这意味着左上角是原点(0,0)x值从左到右增加,y值从上到下增加。在图像中绘制圆圈时,您需要牢记这一惯例。

  • 查看rand类函数。 rand会为您生成随机值,因此您可以使用这些值生成一组随机坐标 - 这些坐标中的每一个都可以作为您的中心。此外,你可以使用这类功能来帮助你弄清楚你想要你的圈子有多大,以及你想要你的圈子的灰色阴影。

  • 查看设置操作(逻辑AND,逻辑OR)等。您可以使用逻辑AND来查找彼此相交的任何圆。当您找到这些区域时,可以用不同的灰色填充这些区域。同样,rand函数也可以在这里使用。

因此,这里有一个(可能的)算法来帮助你做到这一点:

  1. 获取您想要的任何大小的矩阵,并将所有元素初始化为深灰色。也许强度为32可能有效。

  2. 为每个圆生成一组随机的(x,y)坐标,一组随机半径和一组随机强度值。

  3. 对于每对圆圈,检查是否有任何相互交叉的坐标。如果有这样的坐标,产生一个随机的灰色阴影,并用这个新的灰色阴影填充这些坐标。一种可能的方法是采用两个圆圈的每组坐标并将它们绘制在单独的临时图像上。然后,您将使用逻辑AND运算符来查找圆相交的位置。

  4. 现在你有了自己的圈子,你可以将它们全部绘制出来。看一下plot如何使用绘图矩阵。这样你就不必循环遍历所有圈子,因为它效率低下。

  5. 祝你好运!

答案 1 :(得分:2)

让我们回家,好吗?现在这远离图像处理工具箱功能,所以希望这些功能也必须适合你。

<强>代码

%%// Paramters
numc = 5;
graph_size = [300 300];
max_r = 100;

r_arr = randperm(max_r/2,numc)+max_r/2
cpts = [randperm(graph_size(1)-max_r,numc)' randperm(graph_size(2)-max_r,numc)']
color1 = randperm(155,numc)+100

prev = zeros(graph_size(1),graph_size(2));
for k = 1:numc
    r = r_arr(k);
    curr = zeros(graph_size(1),graph_size(2));
    curr(cpts(k,1):cpts(k,1)+r-1,cpts(k,2):cpts(k,2)+r-1)= color1(k)*imcircle(r);

    common_blob = prev & curr;
    curr = prev + curr;
    curr(common_blob) = min(color1(1),color1(2))-50;
    prev = curr;
end
figure,imagesc(curr), colormap gray

%// Please note that the code uses a MATLAB file-exchange tool called
%// imcircle, which is available at -
%// http://www.mathworks.com/matlabcentral/fileexchange/128-imcircle

示例运行的屏幕截图

enter image description here

答案 2 :(得分:1)

正如你所说的那样,你的问题是学校的任务,因此我不会告诉你究竟该怎么做,而是你应该注意什么。

你应该熟悉2d数组(矩阵)如何工作以及如何使用image / imagesc / imshow绘制它们;

你应该看一下strel函数;

你应该看看rand / randn函数;

这样的概念对于作业来说应该足够了。