@R4ndolphC4rter

Как сделать выделение кластеров для бинарных изображений?

Существует набор, состоящий из изображений, примеры которых приведены ниже. Некие "бинарные амёбы".

62710f3412211819067078.png

Данных изображений довольно много, и передо мной стоит задача: разделить эти изображения на классы. При этом мне надо соблюсти два, казалось бы, противоречивых условия:
1. Классов должно быть как можно больше;
2. "Амёбы" должны максимально сильно друг от друга отличаться по форме.

Как мне это сделать?

Пока удалось выделить только два класса (см. изображение ниже), но этого, наверняка, мало.

6271110602a96643426624.png

Как я это сделал? Нашёл расстояния (функция вычисления расстояния между двумя изображениями ниже) между всеми изображениями, отобрал десяток максимальных расстояний и посмотрел, между какими изображениями эти расстояния были вычислены. Наборы получились все +- одинаковые, как на изображении выше.
def distance(reference: np.array, frame: np.array) -> np.number:
    return np.sum((reference - frame)**2) / (W * H)

Т.е. здесь я суммирую квадраты разности значений яркости пикселей[i, j] двух изображений, а затем делю эту сумму на общее количество пикселей изображения (у всех изображений размер одинаковый).
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@AlexSku
Программист по автоматике
В Матлабе есть способ построения дерева (иерархическая кластеризация), указываете нужное количество (или другой параметр близости).
Правда, из-за санкций, скорее всего, Матлаб недоступен в России.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@U235U235
Для начала хорошо бы определиться с признаками объектов, по которым их кластеризировать, а это можете сделать только вы, исходя из контекста задачи. Попробуйте использовать статистические моменты, топологические признаки, площадь, периметр, коэффициент формы, направление главных осей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы