Определите две фигуры по сходству

Я пытаюсь найти надежный способ определить сходство между геометрическими фигурами (многоугольниками).

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

Я начал исследовать вопрос дальше и попытался определить идентичность фигур на основе площади, периметра и сравнения углов фигур. Но и этот вариант не совсем оптимален, так как одинаковые фигуры могут отличаться по размеру (а значит, и по площади и по периметру), а углы фигур могут немного отличаться. Пример ниже

Вы можете спросить: какие цифры я считаю схожими, а какие разными? В примере ниже фигуры категорически не похожи друг на друга, но первые две фотографии я отнесу к похожим фигурам.

Я не прошу готовый код решения, я лишь прошу у вас советов и идей. Какими еще методами можно попробовать правильно определить сходство фигур?

Считаются ли фигуры подобными, если они имеют совершенно одинаковую форму, но во много раз больше/меньше? А как насчет того, где одно является вращением другого?

Mark Setchell 11.07.2024 00:17

matchShapes должен работать. Почему вы считаете, что это не так? Масштаб и вращение не должны быть проблемой.

fmw42 11.07.2024 01:15

Похожий вопрос: stackoverflow.com/q/77774217/12728244

stateMachine 11.07.2024 02:26

Можете ли вы определить, что именно здесь означает сходство? Типичными подходами являются контурные моменты, расстояние Хаусдорфа, расстояние фаски и тому подобное, но часто это недостаточно хорошо соответствует интуитивному неявному определению «сходства». Подходы могут использоваться с нормализацией положения, размера и угла фигур или без них.

Micka 11.07.2024 07:32

@MarkSetchell Да, в этом случае цифры также считаются схожими.

Paul 11.07.2024 08:11

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

Christoph Rackwitz 11.07.2024 11:02

@ChristophRackwitz Я не думал, что это важно. Могу поделиться: сравниваю текст в документе на тождественность по ключевым фразам. Я сделал шаблон рисунка, определив координаты ключевых фраз. На каждом последующем входящем документе я ищу ключевые фразы и рисую цифру. Затем я сравниваю фигуру на шаблоне с новой фигурой.

Paul 11.07.2024 12:01

Вас волнует исключительно текст или также документ/макет текста? чем может отличаться сам текст? какие различия несущественны, какие существенны? — звучит как задача НЛП, возможно, ML/DL/AI. Я бы не подумал подойти к этому «графически».

Christoph Rackwitz 11.07.2024 12:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вопрос интересный, и я уверен, что на него можно посмотреть со многих точек зрения, поскольку очень много вопросов остается открытым. Мой вопрос к вам: хотите ли вы узнать, похожи ли они по форме? или должность тоже?

Пара методов, которые пришли мне в голову прямо сейчас:

  1. если разные положения фигур являются проблемой, вы всегда можете переместить их друг над другом, прежде чем приступить к анализу, или, если требуется более сложное решение, вы можете попробовать разные положения, масштабы и даже повороты одного из многоугольников и в каждой позиции. вы можете сделать один из анализов ниже
  2. попробуйте перебрать конечные точки многоугольников и проверить их координаты, записать расстояние между конечной точкой многоугольника 1 и многоугольника 2, а затем вычислить среднее расстояние (или медиану, или максимум) как меру сходства (предположение: многоугольники с одинаковым количеством конечных точек)
  3. видя, насколько велика область пересечения, большая площадь = большее сходство (осторожно, это не всегда справедливо: две фигуры могут иметь одинаковую площадь, не будучи похожими по форме, но на предоставленных вами изображениях это может сработать)
  4. вероятно, это сильное излишество, но обучение нейронной сети вычислению показателя сходства двух изображений могло бы помочь.

Удачи!

1) Если фигурки одинаковые, но разных размеров - по мне они должны быть одинаковыми; 2) Если фигуры одинаковые, но лежат в разных координатах - по мне они должны быть одинаковыми; 3) Если 1-3 угла имеют разные наклоны (как в примере номер два), но в целом видно, что фигуры похожи - по мне они должны быть одинаковыми;

Paul 11.07.2024 08:35
Ответ принят как подходящий

Один из вариантов — использовать сходство формы (несколько модулей), в котором в основном используется расстояние Фреше :

from shapesimilarity import shape_similarity

def are_similar(p1, p2, threshold=0.9): #  << adjust if needed
    try:
        sim = shape_similarity(p1, p2)
    except AssertionError:
        sim = 0
    return sim > threshold

Используемые входы:

желтый красный Дело 1 [[101, 0], [548, 4], [430, 216], [400, 211], [330, 313], [240, 324], [219, 245], [101, 0]] [[115, 12], [554, 10], [445, 219], [417, 212], [353, 317], [267, 330], [242, 254], [115, 12]] случай2 [[104, 0], [534, 3], [421, 198], [390, 194], [321, 290], [236, 298], [217, 233], [104, 0]] [[158, 32], [554, 30], [430, 195], [413, 199], [328, 306], [233, 321], [251, 240], [158, 32]] случай3 [[168, 0], [555, 1], [452, 212], [427, 209], [365, 309], [287, 319], [271, 247], [168, 0]] [[102, 232], [549, 190], [378, 255], [408, 298], [295, 334], [102, 232]]

Спасибо, что обратили внимание на мой вопрос и поделились кодом. Я рассмотрю этот подход и вернусь к вам.

Paul 11.07.2024 08:27

Спасибо, ваш подход мне очень помог

Paul 12.07.2024 10:04

Другие вопросы по теме