水平连接质心并检测丢失的对象
问题描述:
任务是将我使用regionprops
的质心连接成水平行,然后预测丢失的对象。水平连接质心并检测丢失的对象
这里是形象地说,我有:
所有的重心一定y坐标范围内,应连接。之后,我想预测丢失的物体。例如,上图中的绿线上应该存在更多的对象/质心。
我迄今为止代码:
BW = rgb2gray(imread('noise_removal_single_25_cropped.png'));
props = regionprops(im2bw(BW), 'Centroid');
centroids = cat(1, props.Centroid);
[B,L] = bwboundaries(BW,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end
plot(centroids(:,1),centroids(:,2), 'b*')
plot(centroids(:,1),centroids(:,2), 'k-')
代码垂直连接所有质心,我不知道如何检测丢失物件/心(可能会根据线路长度)?
答
让我们假设行是完全水平的。看起来你可以很容易地将坐标点集中在一起,或者事先知道行分隔符,或者通过分析点密度。
取每个聚类的中值坐标并丢弃离群值(远离中位数定义的容差)。
以横坐标对内点进行排序。间隙长度(或滑动窗口中的点数)会告诉您关于缺少的点。
如果行不是完全水平的,它仍然可能可以通过纵坐标进行聚类并获得良好的水平分隔符。在每个群集中,使用可执行异常值检测的稳健线拟合算法,并像以前一样水平排序。你也可以去偏移(使用直线方程),但是考虑到小的斜率,这几乎没有什么区别。
最后的备注:如果所有的行都是平行的,您可以通过查找集群的重心(或medioids)并将集群转换为公共中心来集体执行歪斜检测,从而给出一条粗线。
你在哪里垂直连接质心?我只看到你在代码中绘制边界和质心。一种方法是找到每个最近邻居点。缺少点会导致邻居有比平常更大的距离。当然,你有知道你的观点水平分组的优势https://en.wikipedia.org/wiki/Nearest_neighbor_search – Piglet