我正在使用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
任何有最简单解决方案的人。
答案 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)));
x
和y
是模板按照数组左上角显示的顺序排列的位置。
编辑:如果你有图像处理工具箱,并且正在寻找一种不太严格的方法来查找具有大致圆形形状的对象,则可以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(:)))