MATLAB中不用循环生成圆盘(圆形)/圆环掩膜矩阵
由于在计算中,经常需要生成圆盘(or叫圆形?)掩膜,所以特意写了一个生成圆盘的matlab函数,当然经过修改,也可以生成圆环函数。
譬如,我们想在一个矩阵里提取以某一点为圆心,半径r内的元素,让这个圆范围外的元素都为0时,这就需要一个圆盘掩膜。但是按普通人的第一直觉都是利用对行和列的两重循环,把矩阵内的每一个元素都遍历一遍,看是否在圆内,如果在的话,赋值为1,不在的话,赋值为0 。对于这种传统做法,明显采用了两重循环,会大大降低matlab程序的效率,那有没有不用循环的方法呢?
下面就讲如何不用循环生成圆盘掩膜:
假设矩阵大小为512*512 ,取矩阵最中间一点为圆心,半径r=50。先用函数meshgrid生成矩阵对应的每一个坐标,然后用circle=x.^2+y.^2生成代表半径的平方的矩阵,最后用find函数找到符合要求的元素,赋值为1,不符合要求的赋值为0 。具体程序如下:
- m=512; %矩阵的函数
- n=512; %矩阵的列数
- r=50; %生成圆的半径
- m1=-m/2:m/2-1; %把圆心变到矩阵的中间
- n1=-n/2:n/2-1;
- [x,y]=meshgrid(m1,n1);
- circle=x.^2+y.^2; %计算出每一点到圆心的距离的平方
- circ_mask=zeros(m,n);
- circ_mask(find(circle<=r*r))=1; %找到圆内的元素,并复制为1
- circ_mask(find(circle>r*r))=0; %找到圆外的元素,并复制为0
- figure;
- imshow(255*circ_mask);
程序运行结果如下:
另外,如果要生成圆环的话,只需要把find函数那里做相应的改变即可。