2016-07-06 39 views
0

任务是将我使用regionprops的质心连接成水平行,然后预测丢失的对象。水平连接质心并检测丢失的对象

这里是形象地说,我有:

detect_boundaries_and_centroids

这就是我想要达到的目标: Connected_centroids_horizontally

所有的重心一定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-') 

代码垂直连接所有质心,我不知道如何检测丢失物件/心(可能会根据线路长度)?

+0

你在哪里垂直连接质心?我只看到你在代码中绘制边界和质心。一种方法是找到每个最近邻居点。缺少点会导致邻居有比平常更大的距离。当然,你有知道你的观点水平分组的优势https://en.wikipedia.org/wiki/Nearest_neighbor_search – Piglet

回答

1

让我们假设行是完全水平的。看起来你可以很容易地将坐标点集中在一起,或者事先知道行分隔符,或者通过分析点密度。

取每个聚类的中值坐标并丢弃离群值(远离中位数定义的容差)。

以横坐标对内点进行排序。间隙长度(或滑动窗口中的点数)会告诉您关于缺少的点。

如果行不是完全水平的,它仍然可能可以通过纵坐标进行聚类并获得良好的水平分隔符。在每个群集中,使用可执行异常值检测的稳健线拟合算法,并像以前一样水平排序。你也可以去偏移(使用直线方程),但是考虑到小的斜率,这几乎没有什么区别。

最后的备注:如果所有的行都是平行的,您可以通过查找集群的重心(或medioids)并将集群转换为公共中心来集体执行歪斜检测,从而给出一条粗线。