2016-07-06 42 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)並將集羣轉換爲公共中心來集體執行歪斜檢測,從而給出一條粗線。