2016-07-06 2 views
0

작업은 내가 가지고있는 centroid를 regionprops 행에 가로로 연결 한 다음 누락 된 객체를 예측하는 것입니다. 여기 centroids를 수평으로 연결하고 누락 된 객체를 감지하십시오.

내가 가진 그 이미지 : Connected_centroids_horizontally

모든 무게 중심을 특정 y 좌표 범위 내에서 연결되어 있어야합니다 : 이것은 내가 달성하고자하는 것입니다

detect_boundaries_and_centroids

. 그 후 누락 된 객체를 예측하고 싶습니다. 예를 들어 위의 이미지에서 녹색 선에 더 많은 객체/중심이 있어야합니다. 지금까지

내 코드 :

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

centroid를 어디에서 수직 연결합니까? 나는 당신이 당신의 코드에서 경계와 중심을 그리는 것을 본다. 한 가지 방법은 가장 가까운 이웃을 찾는 것입니다. 누락 된 포인트는 이웃 사람들이 평소보다 더 큰 거리를 갖게합니다. 물론 당신은 포인트가 수평으로 그룹화되어 있다는 것을 알 수있는 장점이 있습니다. https://en.wikipedia.org/wiki/Nearest_neighbor_search – Piglet

답변

1

행이 완전히 수평이라고 가정합시다. 세로 구분선을 사용하여 행 구분 기호를 미리 알고 있거나 점 밀도를 분석하여 쉽게 점을 클러스터 할 수 있습니다.

모든 클러스터의 중간 좌표를 취하고 이상 치 (중앙값에서 정의 된 허용치보다 먼 것)를 버립니다.

가로 좌표로 inliers를 정렬하십시오. 갭 길이 (또는 슬라이딩 윈도우의 포인트 수)는 누락 된 포인트를 알려줍니다.

행이 완벽하게 수평이 아닌 경우 세로 좌표로 클러스터를 만들고 좋은 가로 구분 기호를 얻을 수 있습니다. 모든 클러스터에서 아웃 라이어 탐지를 수행하고 이전과 같이 수평 정렬 할 수있는 견고한 라인 피팅 알고리즘을 사용하십시오. 또한 기울기 보정 (기울기 방정식 사용)을 적용 할 수 있지만 기울기가 작 으면 약간의 차이가 있습니다.

최종 설명 : 모든 행이 평행이면 클러스터의 중력 중심 (또는 중간 값)을 찾아 클러스터를 공통 중심으로 변환하여 단일 한 두꺼운 선을 제공하여 일괄 적으로 스큐 감지를 수행 할 수 있습니다.

관련 문제