这是一个示例矩阵(但结果不应仅限于此):
a=zeros(7,7);
a(5,3:6)=1;
a(2,2)=1;
a(2,4)=1;
a(7,1:2)=1
a=
0 0 0 0 0 0 0
0 1 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
1 1 0 0 0 0 0
我想去掉所有单独的 1(噪音),这样我就只有第五行的 1 行。
规则: -如果有相邻的 1(包括对角线),则 1 位于“连接线”中,例如:
0 0 0 1 0 0 1 0 1
1 1 1 0 1 0 0 1 0
0 0 0 0 0 1 0 0 0
(相连的线是我要保留的,我想去掉所有不在相连线上的1,相连的线可以相互交叉)
- '连接线的长度必须至少为 3 个元素。因此在 7x7 示例中,只有一行符合此条件。如果a(7,3)设为1,那么左下角也会有一条连线
我目前正在通过逐列方法查看此内容,这是迄今为止我的代码的初稿:
for nnn=2:6
rowPoss=find(a(:,nnn)==1);
rowPoss2=find(a(:,nnn+1)==1);
for nn=1:length(rowPoss)
if myResult(rowPoss(nn)-1:rowPoss(nn)+1,n-1)==0 %
%then?
end
end
end
我的困难是,在这个逐栏处理的过程中,我必须启用一种方法来识别连接线的开头、连接线的中间以及连接线的结束时间。同样的规则,当应用于噪声(单独的 1)时,只会忽略单独的 1。
我想要的输出基本上是:
b=
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 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
最佳答案
如果你有图像处理工具箱,试试bwareaopen
b = bwareaopen(a, 3);
示例运行 #1:
>> a
a =
0 0 0 0 0 0 0
0 1 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
1 1 0 0 0 0 0
>> b
b =
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 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
示例运行 #2:
>> a
a =
0 0 0 0 0 0 0
0 1 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
1 1 0 0 0 0 0
>> b
b =
0 0 0 0 0 0 0
0 1 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
关于Matlab:保持非零矩阵元素彼此相邻并忽略孤立元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888576/