2013-11-19 2 views
0

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

http://en.wikipedia.org/wiki/Connected-component_labeling 

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

+1

Вы не должны удалить свой код из вопроса. Он будет давать ответы, ссылаясь на код, который трудно понять. – mags

ответ

1

Таблица эквивалентности может быть реализована с использованием HashMap. Каждый раз, когда вы найдете метку, эквивалентную другой метке, просто добавьте это отношение к карте хэша.

final Map<Integer, Integer> equivalenceTable = new HashMap<>(); 

Таким образом, всякий раз, когда вы найдете две одинаковые метки, просто поместите их в таблицу эквивалентности.

private void storeEquivalence(final Integer label0, final Integer label1, final Map<Integer, Integer> table) { 
    if (table.keySet().contains(label0)) { 
    table.put(label1, table.get(label0)); 
    } 
    else if (table.keySet().contains(label1)) { 
    table.put(label0, table.get(label1)); 
    } 
    else { 
    table.put(label0, label1); 
    } 
} 

Итак, когда вы определить, что region[x-1][y] и region[x][y-1] равны, вы должны проверить, если метки различны (они должны быть) и обновить таблицу эквивалентности, если являются по телефону

storeEquivalence(region[x-1][y], region[x][y-1], equivalenceTable); 

Тогда в второй проход вы просто заменяете каждую метку, которая имеет значение в таблице эквивалентности.

for (int x = 1; x < imageTwo.getWidth(); x++) { 
    for (int y =1; y < imageTwo.getHeight(); y++) { 
    if (equivalenceTable.keySet().contains(region[x][y])) { 
     region[x][y] = equivalenceTable.get(region[x][y]); 
    } 
    } 
} 
+0

благодарит ... так что после области [x] [y] = Math.min (область [x-1] [y], область [x] [y-1]); если есть эквивалентность, я объявляю storeEquivalence (область [x-1] [y], область [x] [y-1], эквивалентность Table) ;? –

+0

Если оба оператора if: if (imageTwo.getRed (x-1, y)! = 0) 'и' if (imageTwo.getRed (x, y-1)! = 0) 'истинны, тогда вы должны проверить, метки различаются и сохраняют их в таблице эквивалентности, если они есть (если они одинаковы, их, очевидно, не нужно хранить в таблице). Я отредактировал ответ соответственно. – mags

+0

Если вы удовлетворены ответом, я был бы признателен, если бы вы отметили его как принятый. – mags

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