WedX - журнал о программировании и компьютерных науках

Как нормализовать положение элементов на картинке [OpenCV]

В настоящее время я работаю над программой, которая могла бы помочь в моей работе. Я пытаюсь использовать машинное обучение для целей классификации. Проблема в том, что у меня недостаточно образцов для обучения модели, и я стараюсь избегать увеличения из-за проблем с оборудованием (недостаточно оперативной памяти) как на ноутбуке моей компании, так и на Google Collab. Поэтому я решил попробовать как-то нормализовать положение элементов, чтобы различия были видны для машины даже при небольшом количестве разных сэмплов. К сожалению, сейчас я изо всех сил пытаюсь нормализовать эти фотографии.

Элемент 1a: Элемент 1а

Элемент 1b: Элемент 1b

Элемент 2а: Элемент 2а

Элемент 2b: Элемент 2b

Элементы 1а и 1б одного типа и 2а-2б одного типа. Есть ли способ как-то нормализовать положение этих изображений (что-то вроде положения 0), что помогло бы алгоритму увидеть различия между ними? Я попытался использовать cv2.minAreaSquare, чтобы получить квадратное положение, повернуть их и обрезать ненужную область, но, к сожалению, эти элементы могут иметь разную ширину, поэтому после их уменьшения контуры деформируются неравномерно. Затем я пытался получить ось симметрии и использовать ее для правильной обрезки после поворота, но все же результаты не оправдали моих ожиданий. Я думал добавить больше точек нормализации, например:

Точки нормализации: Точки нормализации

И использование этих точек нормализует положение остальных моих элементов, но Perspective Transform требует всего 4 точки, а с 4 точками это тоже не очень хорошая методология. Может быть, вы, ребята, знаете, как переместить эти элементы, чтобы они заняли одинаковое положение.


Ответы:


1

Глядя на изображения, я считаю, что трансформация между двумя картинками — это либо изометрия (перевод + поворот), либо подобие (перевод + поворот + масштабирование). Их можно определить всего по двум точкам. (Перспектива занимает четыре балла, но я думаю, что это перебор.)

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

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

На иллюстрации вы находите краевые точки вдоль красных профилей и от них проводите зеленые линии. Они пересекаются в желтых точках.

Для повышения точности можно использовать метод наименьших квадратов, чтобы найти наилучшее соответствие более чем двум точкам.

введите здесь описание изображения

18.02.2021
  • Большое спасибо за ответ. Это заставило меня задуматься о повторяющихся точках элементов, и даже если ваша идея не дала очень хороших результатов из-за разной ширины элементов, это показало мне мою ошибку в мышлении. Что ж, для получения точек нормализации я использовал уравнение с шириной элементов, и на основе этого для каждого элемента у меня было разное положение этих точек (потому что эти элементы могли иметь разную ширину). Когда я заменил ширину из уравнения постоянным значением, это дало мне очень хорошие результаты. Большое спасибо за то, что направили меня на правильный путь. 19.02.2021
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]