在Matlab(wrt.y轴)上找出图像中的第一个圆圈

时间:2014-02-04 14:28:42

标签: 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

我想找出相对于y轴的第一个白色块/圆的中心 回答上面的图片将是。

0 1 0
1 1 1
0 1 0

任何有最简单解决方案的人。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找模板的完全匹配,您可以使用移动过滤器,例如:

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)));

xy是模板按照数组左上角显示的顺序排列的位置。

编辑:如果你有图像处理工具箱,并且正在寻找一种不太严格的方法来查找具有大致圆形形状的对象,则可以regionprops使用'Centroid' }和'Eccentricity'函数的bwconncomp参数。

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

请注意,在您的情况下,单个像素是偏心率为0的对象,它是您可以找到的最小“圆”。如果您需要定义最小尺寸,请使用regionprops

的“区域”属性

答案 1 :(得分:1)

您可以使用简单的二维卷积来完成此操作。它将沿着较大的矩阵“叠加”滤波器,并将滤波器乘以它所覆盖的值。如果产品等于过滤器的总和,那么您知道找到了匹配项。

这是一些简单的代码。

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(:)))