Одним из самых интересных проектов, над которыми я работал за последние пару лет, был проект по обработке изображений. Целью была разработка системы, позволяющей распознавать банки Coca-Cola (обратите внимание, что я подчеркиваю слово «банки», через минуту вы поймете, почему). Ниже вы можете увидеть образец, в котором банка распознается в зеленом прямоугольнике с масштабированием и вращением.
Некоторые ограничения проекта:
Фон может быть очень шумным.
can может иметь любой масштаб, поворот или даже ориентацию. (в разумных пределах).
Изображение может иметь некоторую размытость (контуры могут быть не совсем прямыми).
Может быть кока- На изображении бутылки с колой, и алгоритм должен обнаруживать только банку!
Яркость изображения может сильно различаться (поэтому полагаться нельзя" слишком много» при определении цвета).
Банка может быть частично скрыта по бокам или посередине и, возможно, частично скрыта за бутылкой.
На изображении вообще не могло быть может, и в этом случае приходилось ничего не находить и писать об этом сообщение.
Таким образом, вы можете столкнуться с такими сложными вещами (в данном случае мой алгоритм полностью провалится):
Я работал над этим проектом некоторое время назад, и мне было очень весело делать это, и у меня было достойная реализация. Вот некоторые подробности моей реализации: Язык: выполнено на C++ с использованием библиотеки OpenCV. Предварительно -обработка: для предварительной обработки изображения, т. е. преобразования изображения в более необработанную форму для передачи алгоритму, я использовал 2 метода:
< li>Изменение цветовой области с RGB на HSV и фильтрация на основе «красного» оттенка, насыщенности выше определенного порога, чтобы избежать оранжевых цветов, и фильтрация низкого значения, чтобы избежать темных тонов. Конечным результатом было двоичное черно-белое изображение, где все белые пиксели представляли собой пиксели, соответствующие этому порогу. Очевидно, что в изображении по-прежнему много мусора, но это уменьшает количество измерений, с которыми вам приходится работать.
Фильтрация шума с использованием медианной фильтрации (взятие медианного значения пикселя всех соседей и замена пикселя этим значением) для уменьшения шума.
Использование фильтра Canny Edge Detection Filter для получения контуров всех элементов после двух предшествующих шагов.
Алгоритм: Сам алгоритм, который я выбрал для этой задачи, был взят из этой замечательной книги по извлечению признаков и называется «Обобщенный». Преобразование Хафа (сильно отличается от обычного преобразования Хафа). По сути, там говорится о нескольких вещах:
Вы можете описать объект в пространстве, не зная его аналитического уравнения (как в данном случае).
Он устойчив к деформациям изображения, таким как масштабирование и поворот, поскольку он в основном проверяет ваше изображение на предмет каждой комбинации коэффициента масштабирования и коэффициента поворота.
Он использует базу модель (шаблон), которую «обучит» алгоритм.
Каждый пиксель, оставшийся в контурном изображении, будет голосовать за другой пиксель, который предположительно будет центром (с точки зрения гравитации) вашего объект, основываясь на том, что он узнал из модели.
В конечном итоге вы получаете тепловую карту голосов, например здесь все пиксели контура банки будут голосовать за ее гравитационный центр, поэтому у вас будет много голосов в одном пикселе, соответствующем центру, и вы увидите пик на тепловой карте, как показано ниже:
Как только вы это сделаете, появится простой порог Эвристика на основе - может дать вам местоположение центрального пикселя, из которого вы можете получить масштаб и поворот, а затем построить вокруг него маленький прямоугольник (окончательный масштаб и коэффициент поворота, очевидно, будут относительно вашего исходного шаблона). По крайней мере теоретически... Результаты: хотя этот подход работал в основных случаях, в некоторых областях его явно не хватало:
Это очень медленно! Я недостаточно подчеркиваю это. На обработку 30 тестовых изображений понадобился почти целый день, очевидно потому, что у меня был очень высокий коэффициент масштабирования для вращения и перемещения, так как некоторые банки были очень маленькими.
Это было вполне терялись, когда на изображении были бутылки, и по какой-то причине почти всегда находили бутылку вместо банки (возможно, потому, что бутылки были больше, следовательно, имели больше пикселей, а значит, больше голосов)
Нечеткие изображения тоже были бесполезны, поскольку голоса попадали в пиксели в случайных местах вокруг центра, что заканчивалось очень зашумленной тепловой картой.
Инвариантность в перемещении и вращении была достигнута, но не в ориентации, то есть банка, которая не была направлена прямо в объектив камеры, не была распознана.
Как мне улучшить свои конкретные< /strong> алгоритм, использующий исключительно функции OpenCV, для решения четырех конкретных упомянутых проблем?
Одним из самых интересных проектов, над которыми я работал за последние пару лет, был проект по обработке изображений. Целью была разработка системы, позволяющей распознавать [b]банки[/b] Coca-Cola (обратите внимание, что я подчеркиваю слово «банки», через минуту вы поймете, почему). Ниже вы можете увидеть образец, в котором банка распознается в зеленом прямоугольнике с масштабированием и вращением. [img]https ://i.sstatic.net/irQtR.png[/img]
Некоторые ограничения проекта: [list] [*] Фон может быть очень шумным. [*]can может иметь любой масштаб, поворот или даже ориентацию. (в разумных пределах). [*]Изображение может иметь некоторую размытость (контуры могут быть не совсем прямыми). [*]Может быть кока- На изображении бутылки с колой, и алгоритм должен обнаруживать только банку! [*]Яркость изображения может сильно различаться (поэтому полагаться нельзя" слишком много» при определении цвета). [*]Банка может быть частично скрыта по бокам или посередине и, возможно, частично скрыта за бутылкой. [*]На изображении вообще не могло быть может, и в этом случае приходилось ничего не находить и писать об этом сообщение.
Таким образом, вы можете столкнуться с такими сложными вещами (в данном случае мой алгоритм полностью провалится): [img]https://i.sstatic.net/Byw82.png[/img]
Я работал над этим проектом некоторое время назад, и мне было очень весело делать это, и у меня было достойная реализация. Вот некоторые подробности моей реализации: [b]Язык[/b]: выполнено на C++ с использованием библиотеки OpenCV. [b]Предварительно -обработка[/b]: для предварительной обработки изображения, т. е. преобразования изображения в более необработанную форму для передачи алгоритму, я использовал 2 метода: [list] < li>Изменение цветовой области с RGB на HSV и фильтрация на основе «красного» оттенка, насыщенности выше определенного порога, чтобы избежать оранжевых цветов, и фильтрация низкого значения, чтобы избежать темных тонов. Конечным результатом было двоичное черно-белое изображение, где все белые пиксели представляли собой пиксели, соответствующие этому порогу. Очевидно, что в изображении по-прежнему много мусора, но это уменьшает количество измерений, с которыми вам приходится работать. [img]https://i.sstatic.net/ ktdAB.png[/img]
[*]Фильтрация шума с использованием медианной фильтрации (взятие медианного значения пикселя всех соседей и замена пикселя этим значением) для уменьшения шума. [*]Использование фильтра Canny Edge Detection Filter для получения контуров всех элементов после двух предшествующих шагов. [img]https://i.sstatic.net/F9319.png[/img] [/list] [b]Алгоритм[/b]: Сам алгоритм, который я выбрал для этой задачи, был взят из этой замечательной книги по извлечению признаков и называется «Обобщенный». Преобразование Хафа (сильно отличается от обычного преобразования Хафа). По сути, там говорится о нескольких вещах:
[*]Вы можете описать объект в пространстве, не зная его аналитического уравнения (как в данном случае).[*]Он устойчив к деформациям изображения, таким как масштабирование и поворот, поскольку он в основном проверяет ваше изображение на предмет каждой комбинации коэффициента масштабирования и коэффициента поворота. [*]Он использует базу модель (шаблон), которую «обучит» алгоритм. [*]Каждый пиксель, оставшийся в контурном изображении, будет голосовать за другой пиксель, который предположительно будет центром (с точки зрения гравитации) вашего объект, основываясь на том, что он узнал из модели. [/list] В конечном итоге вы получаете тепловую карту голосов, например здесь все пиксели контура банки будут голосовать за ее гравитационный центр, поэтому у вас будет много голосов в одном пикселе, соответствующем центру, и вы увидите пик на тепловой карте, как показано ниже: [img]https://i.sstatic.net/wxrT1.png[/img]
Как только вы это сделаете, появится простой порог Эвристика на основе - может дать вам местоположение центрального пикселя, из которого вы можете получить масштаб и поворот, а затем построить вокруг него маленький прямоугольник (окончательный масштаб и коэффициент поворота, очевидно, будут относительно вашего исходного шаблона). По крайней мере теоретически... [b]Результаты[/b]: хотя этот подход работал в основных случаях, в некоторых областях его явно не хватало: [list] [*]Это [b]очень медленно[/b]! Я недостаточно подчеркиваю это. На обработку 30 тестовых изображений понадобился почти целый день, очевидно потому, что у меня был очень высокий коэффициент масштабирования для вращения и перемещения, так как некоторые банки были очень маленькими. [*]Это было вполне терялись, когда на изображении были бутылки, и по какой-то причине почти всегда находили бутылку вместо банки (возможно, потому, что бутылки были больше, следовательно, имели больше пикселей, а значит, больше голосов) [*]Нечеткие изображения тоже были бесполезны, поскольку голоса попадали в пиксели в случайных местах вокруг центра, что заканчивалось очень зашумленной тепловой картой. [*]Инвариантность в перемещении и вращении была достигнута, но не в ориентации, то есть банка, которая не была направлена прямо в объектив камеры, не была распознана. [/list] Как мне улучшить свои [b]конкретные< /strong> алгоритм, использующий исключительно функции OpenCV[/b], для решения [b]четырех конкретных[/b] упомянутых проблем?
Одним из самых интересных проектов, над которыми я работал за последние пару лет, был проект по обработке изображений. Целью была разработка системы, позволяющей распознавать банки Coca-Cola (обратите внимание, что я подчеркиваю слово «банки», через...
Я работаю над большим набором сервисов, которые запускают Springboot в контейнерах. Мы создаем «пружинный багажник» и выполняем ее с помощью «java -Jar ...» в качестве стартового скрипта в контейнере. Дополненная трасса класса, включая...
cola — это именно то, что мне нужно для нескольких вещей — в основном она создает принудительное расположение графов, поддерживающее группировку и ограничения. Я использую его с d3.
Однако я заметил, что кола, кажется, не работает в d3 v4, тогда как...
Я занимаюсь предварительной обработкой изображений для оптического распознавания символов в Python. Я преобразовал PDF в двоичные изображения. Я получаю такой результат: