在Matlab上找出图像中的第一个圆(wrt.y轴)
我正在使用Matlab。我有一个二维二进制图像/数组。像这样在Matlab上找出图像中的第一个圆(wrt.y轴),matlab,Matlab,我正在使用Matlab。我有一个二维二进制图像/数组。像这样 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 我想找出第一个白色块
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 1 0 0
0 0 1 1 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
我想找出第一个白色块/圆相对于y轴的中心
以上图片的答案将是
0 1 0
1 1 1
0 1 0
任何对此有最简单解决方案的人。如果要查找模板的精确匹配项,可以使用移动过滤器,例如:
H=[0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 0 0 0 0 0 0;
0 0 0 0 0 1 1 1 0 0 1 0 0;
0 0 1 1 0 0 1 0 0 0 0 0 0;
0 0 0 1 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 0 0 0 0 0;
0 0 0 0 0 0 1 0 0 0 0 0 0];
b=[0 1 0;
1 1 1;
0 1 0];
C=filter2(b,H, 'same');
[x,y]=find(C==max(max(C)));
x
和y
是模板在数组左上角的显示顺序
编辑:如果您有图像处理工具箱,并且正在寻找一种不太严格的方法来查找大致呈圆形的对象,您可以使用'Centroid'
和'centrics'
参数以及bwconcomp
函数
ObjectStats=regionprops(bwconncomp(H,4), 'Centroid', 'Eccentricity');
“偏心率”为0(或接近0)的对象将是圆
idx=find(cell2mat({ObjectStats.Eccentricity})==0); % Change ==0 to <0.2 or something to make it less strict.
ctrs={ObjectStats.Centroid};
>> ctrs{1,idx(1)}
ans =
7 3
idx=find(cell2mat({ObjectStats.偏心率})==0);%Change==0到>ctrs{1,idx(1)}
ans=
7 3
请注意,在您的例子中,单个像素是偏心率为0的对象,它是您可以找到的最小“圆”。如果需要定义最小大小,请使用
regionprops
的“区域”属性。您可以通过简单的二维卷积来完成此操作。它将沿一个较大的矩阵“叠加”过滤器,并将过滤器乘以其叠加的值。如果乘积等于过滤器的和,那么您就知道找到了匹配项
下面是一些简单的代码
mat = [0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 1 0 0
0 0 1 1 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0];
filt = [0 1 0
1 1 1
0 1 0];
[row,col] = find(conv2(mat,filt,'same') == sum(filt(:)))
这是一个具体的例子,因此那里的答案应该也能帮助你,尽管这里的答案似乎更简单。您可能还对这种模式可能会有所不同的模式感兴趣。。可能是0 0 0 0 1 0 0 1 0 0 0 0 0 0 0注意,如果要添加有关问题的信息,最好的方法是编辑它,而不是写评论。不,这不是必需的。这是一个具体的案例。。我想要一个找到第一个圆的一般解。它现在的形状像一颗钻石,可能有两颗以上的钻石。。。形状可以随时变化。请指出您是否对圆形或连接的像素点感兴趣,在后一种情况下,请检查
bwconcomp
函数。只需注意regionprops
需要图像处理工具箱,因此,它可能不是每个人都可以使用。我有这个图像s24.postimg.org/n1r2kg0bl/image.png我想得到关于y轴的第一块1(白色)(不包括x轴)这可能是一个圆或一个圆block@muaaz这些根本不是圆。你有图像处理工具箱吗?@MZimmerman6同意,我在回答中加了一条注释。谢谢通知我。我有这个图像s24.postimg.org/n1r2kg0bl/image.png我想得到关于y轴的第一块1(白色)(不包括x轴)这可能是一个圆或一个圆block@muaaz首先,我建议不要多次发布相同的评论。其次,您只需要稍微调整过滤器,使其与您正在寻找的形状相匹配。你请客。该过程将是相同的,并且不需要任何额外的工具箱。您还需要定义什么是“第一”,从左到右扫描时是“第一”,还是从上到下扫描时是“第一”?MATLAB将按列显示索引