Мне нужно найти квадраты на изображении, используя OpenCV (нет проблем в Matlab или любой другой, как правило, я ожидаю, что некоторые идеи).
Рассмотрим тестовое изображение ниже:
Мне нужно точно найти эти цветные квадраты на изображении выше (не белые длинные полосы).
Что я сделал :
Я применил общий метод (который поставляется с образцами OpenCV), т.е. найти контуры во всех цветовых плоскостях, приблизить его и проверить количество элементов = 4. Это работает до некоторой степени, что несколько квадратов обнаружены, особенно темные.
Следующим шагом я сделал прогноз . т.е. это расположение является фиксированным . Так что, если некоторые получены, я могу предсказать оставшиеся. Это также сработало в некоторой степени. Но точность была очень плохой.
Но я чувствую, что предсказание здесь не очень хороший метод, и он не всегда дает точные ответы в соответствии с первым шагом.
Что мне нужно :
1) Есть ли другие лучшие методы для более точного определения этих квадратов? Или несколько методов?
Важным моментом является то, что время здесь не проблема . Алгоритм может быть медленным, это не имеет значения. Но точность является основным критерием.
Иногда изображения могут быть гораздо более размытыми.
И одна из основных проблем, с которыми я столкнулся, заключается в том, что некоторые квадраты имеют почти такой же цвет, как и фон (проверьте столбец 3 первого и второго квадратов).
Ищете идеи, заранее спасибо
ОБНОВИТЬ :
Ниже приведен максимально точный результат, который я получил:
Конечно, результирующее изображение немного изменено.
ОБНОВЛЕНИЕ 2:
Я дал намного более лучшее решение в своем ответе ниже: https://dsp.stackexchange.com/a/7526/818
источник
Ответы:
Первая попытка с использованием Matlab:
Результаты в следующих регионах:
Как видите, выбор порога, который приводит к наибольшему количеству регионов (T = 120), уже даст 7 правильных местоположений, несколько объединенных местоположений, одно ложное положительное и два ложных отрицательных.
Это была довольно простая попытка, но я думаю, что это показывает, что подход работает. Добавление некоторых вещей для разбиения вытянутых областей или выполнение этого для каждого цветового канала отдельно - это всего лишь пара вещей, которые вы можете сделать, чтобы улучшить это.
Также было бы полезно, если бы вы предоставили еще несколько тестовых изображений.
источник
Я пытался что-то еще, чтобы улучшить свой результат в вопросе. Приведенное ниже решение основано на предположении, что первый квадрат (оранжевый) всегда обнаруживается на шаге 1. И это практично благодаря высококонтрастному цвету по сравнению с фоном. Даже результат, который я показал в вопросе, обнаружил это правильно
Шаг 1: Найдите как можно больше квадратов
Я разделил изображение на плоскости R, G, B, H, S, V и установил порог изображения для различных пороговых значений, например, кратных 25. Для каждого изображения я нашел в нем квадраты и поместил их в «изображение маски» . Я также нашел среднюю высоту и ширину квадрата.
маска изображения (Всего обнаружено 7/12 квадратов):
Шаг 2: Сформируйте сетку из квадратов
Затем я нашел центроиды этих квадратов в изображении маски. Сортировал их и нашел центр тяжести первого квадрата (оранжевый). Из тщательного анализа мы видим, что разрыв между двумя квадратами представляет собой квадрат как в горизонтальном, так и в вертикальном направлении. Таким образом, я сделал сетку квадратов, как показано ниже, и назвал ее ideal_squares (это просто имя, это не значит, что мне нужен вывод):
идеальные квадраты:
Шаг 3: переназначить ideal_image
Теперь у нас есть центроиды ideal_squares и оригинальные центроиды. Я обнаружил правильные совпадения для каждого оригинального центроида из ideal_centroids (взяв евклидово расстояние между ними). Затем я использовал Scipy interpolate.griddata для интерполяции и переназначил ideal_image в соответствии со значениями центроида (это почти то же самое, что и деформация, сделанная в следующих вопросах и ответах: как устранить дефекты выпуклости в квадрате судоку и преобразовании изображения в OpenCV ). Ниже приведен вывод, который я получил:
Выход :
Шаг 4: ИЛИ работать над выводом с изображением маски с первого шага
Теперь вы можете видеть, что все квадраты обнаружены, но с проблемой, упомянутой ниже:
Проблема:
Посмотрите на результат шага 3, то есть переназначенного изображения квадратной сетки. За исключением двух центральных площадей, все остальные квадраты обрезаны. Это проблема, связанная с этим переназначением. Я не уверен, где проблема, с scipy.interpolate.griddata () или cv2.remap (). Я думал, что весь образ будет искажен, но это не так. Это искажает только изображение внутри центроидов, которые мы дали. Если я могу это исправить, вывод будет в порядке.
Так что, если кто-то знает хорошую идею для этого, очень добро пожаловать!
источник
Примечание. Этот метод будет очень медленным.
Создайте маску, которая выглядит как контуры идеального объекта. Похоже на это:
затем передвиньте (положение, масштаб, вращение) маску на изображение и сопоставьте его с контуром реального изображения (возможно, немного размытым, чтобы получить более мягкий отклик), чтобы вычислить, насколько они похожи (положение, масштаб, вращение) с самый высокий отклик подобия должен быть (положение, масштаб, вращение) реального объекта.
Метод не возражает против слияния квадратов с фоном или даже с частичными окклюзиями объекта, поскольку он рассматривает весь объект.
Лично я успешно использовал этот метод для отслеживания морды мыши и усов, но у меня были некоторые предположения, как будто это было близко к последней известной позиции и т. Д. Но я думаю, что вы можете уменьшить пространство поиска, применяя некоторые предположения, такие как: возможные размеры объекта в камере, как далеко от центра это может быть или вращение <10 градусов и т. д.
источник
Шаг 1: Какое бы окончательное двоичное изображение вы не получили, анализируя в плоскости B, G, R, H, S, V, в этом изображении выполните алгоритм подсчета капель.
Шаг 2: Найдите самый большой шарик на основе площади или длины контура. Поскольку ваши капли будут в основном параллелограммными, то есть площадь или контур, подойдет любой.
Шаг 3: С помощью самого большого шарика (так как самый большой шарик - это самый лучший шарик, напоминающий ваши квадраты реального мира), попробуйте найти ориентацию шарика ... это вы можете получить, подобрав прямоугольник наилучшего соответствия ИЛИ вы можете получить угловые точки ... получить наклон линий, соединяющих их (как по горизонтали, так и по вертикали).
Шаг 4: Как только вы получите два склона, проведите две линии, проходящие через ось капли. для оси вы можете усреднить угловые точки или вы можете использовать центроид (центр масс) ... Я бы пошел со средним угловых точек ...
Шаг 5: Так как в каждом горизонтальном и вертикальном направлении интервалы равны (в идеале горизонтальные и вертикальные интервалы также равны, поскольку они исходят из вашей идеальной квадратной картинки, но мы не будем предполагать это ...), просто нужно найти возможные центроиды других параллелограммы
НИЖНЯЯ ЛИНИЯ: Если какой-то один квадрат будет обнаружен идеально, вы можете сделать всю сетку. Просто пометьте центры с интервалом 2H (H = горизонтальная ширина самого большого шарика) вдоль горизонтальной оси самого большого шарика и с интервалом 2V (V = вертикальная высота самого большого шарика) вертикально вдоль вертикальной оси шарика.
Некоторые фото для поддержки
источник
Я действительно не знаю, какой прогноз вы делали раньше, но пытались ли вы сосредоточиться на белых длинных полосах в качестве корня. Затем (если 3 столбца квадратов имеют одинаковый размер), вы можете определить высоту квадрата (расстояние между двумя полосами) и определить максимальную и минимальную области (высоту и ширину) на изображении.
Затем попытайтесь определить наиболее распространенный цвет внутри всего квадрата и установите для него «неквадратную» область. Остальные должны быть квадратами, которые вы ищете.
источник
Я бы предложил использовать преобразование Хафа, которое является очень надежным алгоритмом для нахождения простых параметрических фигур, например линий, окружностей и т. Д. Обнаружение линий было бы наилучшим в вашем случае. Вы могли найти стороны длинных белых срипов по крайней мере; затем с помощью любого алгоритма извлечения углов (Харриса или, может быть, даже SIFT или SURF) вы можете находить углы вдоль этих линий, даже используя тот факт, что квадраты расположены примерно одинаково на расстоянии.
источник
Я пробовал эту проблему, используя opencv, python. Подход предполагает маскирование изображения на основе цветов с последующим нахождением подходящих контуров.
Код: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_box
[Пропустил 1 коробку, но это должно произойти, настроив функцию маскировки]
источник