2016-07-06 5 views
0

Задача состоит в том, чтобы связать центроиды, которые у меня есть, используя regionprops по горизонтали в строках, а затем предсказать отсутствующие объекты.Подключить центроиды по горизонтали и обнаружить отсутствующие объекты

Вот образ, который у меня есть:

detect_boundaries_and_centroids

Это то, что я хочу добиться: Connected_centroids_horizontally

Все центроиды в пределах определенного у-координату диапазон должен быть подключен. После этого я хочу предсказать недостающие объекты. Например, на зеленой линии на изображении выше должно быть больше объектов/центроидов.

Мой код до сих пор:

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

Предположим, что строки идеально горизонтальны. Кажется, что вы можете легко скопировать точки по ординате, либо заранее знать разделители строк, либо проанализировать плотность точек.

Возьмите медианную ординату каждого кластера и отбросьте выбросы (те, которые больше, чем определенный допуск от медианного).

Сортировка лифтов по абсциссе. Длины зазоров (или количество точек в скользящем окне) расскажут вам о недостающих точках.

Если строки не являются абсолютно горизонтальными, остается вероятным, что вы можете группировать по ординатам и получать хорошие горизонтальные разделители. В каждом кластере используйте надежный алгоритм подгонки линий, который будет выполнять обнаружение более ранних версий и сортировать по горизонтали, как и раньше. Вы также можете использовать (используя уравнение линии), но, учитывая небольшой наклон, это будет иметь мало значения.

Заключительное замечание: если все линии параллельны, вы можете выполнять обнаружение перекоса коллективно путем нахождения центров тяжести (или медиоидов) кластеров и перевода кластеров в общий центр, давая единственную толстую линию.

Смежные вопросы