Поиск квадратов в изображении

34

Мне нужно найти квадраты на изображении, используя OpenCV (нет проблем в Matlab или любой другой, как правило, я ожидаю, что некоторые идеи).

Рассмотрим тестовое изображение ниже:

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

Мне нужно точно найти эти цветные квадраты на изображении выше (не белые длинные полосы).

Что я сделал :

  • Я применил общий метод (который поставляется с образцами OpenCV), т.е. найти контуры во всех цветовых плоскостях, приблизить его и проверить количество элементов = 4. Это работает до некоторой степени, что несколько квадратов обнаружены, особенно темные.

  • Следующим шагом я сделал прогноз . т.е. это расположение является фиксированным . Так что, если некоторые получены, я могу предсказать оставшиеся. Это также сработало в некоторой степени. Но точность была очень плохой.

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

Что мне нужно :

1) Есть ли другие лучшие методы для более точного определения этих квадратов? Или несколько методов?

Важным моментом является то, что время здесь не проблема . Алгоритм может быть медленным, это не имеет значения. Но точность является основным критерием.

Иногда изображения могут быть гораздо более размытыми.

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

Ищете идеи, заранее спасибо

ОБНОВИТЬ :

Ниже приведен максимально точный результат, который я получил:

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

Конечно, результирующее изображение немного изменено.

ОБНОВЛЕНИЕ 2:

Я дал намного более лучшее решение в своем ответе ниже: https://dsp.stackexchange.com/a/7526/818

Абид Рахман К
источник
Ваш фон всегда беловатый?
1
Моя идея состояла в том, чтобы вычислить «насыщенность» и пороговое значение sat img, но на вашем примере это не очень хорошо работает (вычисление насыщенности как max (RG, RB, GB). Тот факт, что некоторые квадраты выглядят почти как фон, делают дело довольно сложное. Если все ваши изображения имеют одинаковый рисунок (длинные белые полосы с квадратами рядом с ними), вам следует подумать о том, чтобы найти наиболее легкие фрагменты (например, действительно цветные квадраты или белые полосы), чтобы определить возможное местоположение для других квадраты и ... найдите способ проверить, действительно ли они есть или нет. Трудно, но интересно! Можете ли вы дать больше изображений?
Ну, я думаю, что это не должно было быть перемещено.
Junuxx
1
Можете ли вы предоставить больше изображений? Кроме того, что это за вещь?
Андрей Рубштейн
2
ОП должен ответить на несколько вопросов. Возможно белый фон не нужен. А что там со светом? Это будет так плохо? Это выглядит просто ненужной сложностью для меня.
Тае Сунг Шин

Ответы:

9

Первая попытка с использованием Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Результаты в следующих регионах:

помеченные регионы

Как видите, выбор порога, который приводит к наибольшему количеству регионов (T = 120), уже даст 7 правильных местоположений, несколько объединенных местоположений, одно ложное положительное и два ложных отрицательных.

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

Также было бы полезно, если бы вы предоставили еще несколько тестовых изображений.

Junuxx
источник
8

Я пытался что-то еще, чтобы улучшить свой результат в вопросе. Приведенное ниже решение основано на предположении, что первый квадрат (оранжевый) всегда обнаруживается на шаге 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 (). Я думал, что весь образ будет искажен, но это не так. Это искажает только изображение внутри центроидов, которые мы дали. Если я могу это исправить, вывод будет в порядке.

Так что, если кто-то знает хорошую идею для этого, очень добро пожаловать!

Абид Рахман К
источник
5

Примечание. Этот метод будет очень медленным.

Создайте маску, которая выглядит как контуры идеального объекта. Похоже на это:

маска объекта

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

Метод не возражает против слияния квадратов с фоном или даже с частичными окклюзиями объекта, поскольку он рассматривает весь объект.

Лично я успешно использовал этот метод для отслеживания морды мыши и усов, но у меня были некоторые предположения, как будто это было близко к последней известной позиции и т. Д. Но я думаю, что вы можете уменьшить пространство поиска, применяя некоторые предположения, такие как: возможные размеры объекта в камере, как далеко от центра это может быть или вращение <10 градусов и т. д.

SlimJim
источник
5

Шаг 1: Какое бы окончательное двоичное изображение вы не получили, анализируя в плоскости B, G, R, H, S, V, в этом изображении выполните алгоритм подсчета капель.

Шаг 2: Найдите самый большой шарик на основе площади или длины контура. Поскольку ваши капли будут в основном параллелограммными, то есть площадь или контур, подойдет любой.

Шаг 3: С помощью самого большого шарика (так как самый большой шарик - это самый лучший шарик, напоминающий ваши квадраты реального мира), попробуйте найти ориентацию шарика ... это вы можете получить, подобрав прямоугольник наилучшего соответствия ИЛИ вы можете получить угловые точки ... получить наклон линий, соединяющих их (как по горизонтали, так и по вертикали).

Шаг 4: Как только вы получите два склона, проведите две линии, проходящие через ось капли. для оси вы можете усреднить угловые точки или вы можете использовать центроид (центр масс) ... Я бы пошел со средним угловых точек ...

Шаг 5: Так как в каждом горизонтальном и вертикальном направлении интервалы равны (в идеале горизонтальные и вертикальные интервалы также равны, поскольку они исходят из вашей идеальной квадратной картинки, но мы не будем предполагать это ...), просто нужно найти возможные центроиды других параллелограммы

НИЖНЯЯ ЛИНИЯ: Если какой-то один квадрат будет обнаружен идеально, вы можете сделать всю сетку. Просто пометьте центры с интервалом 2H (H = горизонтальная ширина самого большого шарика) вдоль горизонтальной оси самого большого шарика и с интервалом 2V (V = вертикальная высота самого большого шарика) вертикально вдоль вертикальной оси шарика.

Некоторые фото для поддержки введите описание изображения здесь

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

rotating_image
источник
1
+1 - было бы здорово, если бы вы могли это реализовать.
Абид Рахман К
2
@AbidRahmanK Это не то, для чего предназначен StackExchange. Вопрос -> Ответ. В противном случае это будет ярмарка вакансий.
Ян Крюгер
2

эта договоренность исправлена

Я действительно не знаю, какой прогноз вы делали раньше, но пытались ли вы сосредоточиться на белых длинных полосах в качестве корня. Затем (если 3 столбца квадратов имеют одинаковый размер), вы можете определить высоту квадрата (расстояние между двумя полосами) и определить максимальную и минимальную области (высоту и ширину) на изображении.

Затем попытайтесь определить наиболее распространенный цвет внутри всего квадрата и установите для него «неквадратную» область. Остальные должны быть квадратами, которые вы ищете.


источник
Я нашел 3-4 квадрата, используя контурный метод. Затем получил высоту и ширину каждого квадрата. Затем проверяется разрыв между обнаруженными квадратами и предполагается, что разрыв между ними достаточно велик для размещения другого квадрата. Это прогноз, который я сделал.
Абид Рахман К
Некоторые квадраты имеют почти такой же цвет, как и фон. Поэтому я боюсь, что они также будут рассматриваться как неквадратная область в соответствии с вашим методом.
Абид Рахман К
Возможно, вы можете попробовать поработать с каждым столбцом, чтобы построить кривую, где ось x будет высотой (в пикселях) на изображении, а ось y будет интенсивностью. Затем вы можете попытаться найти некоторые режущие кромки с производной формой.
то есть само определение края, верно? Я попробовал, но не получил хороший результат.
Абид Рахман К
1
Да, это так, но вы сами могли понять, почему это не удалось, и, возможно, изолировать некоторые интересные области на сюжете. Кстати, если вы найдете несколько полезных советов для решения вашей проблемы, пожалуйста, напишите их. Удачи в ваших исследованиях
0

Я бы предложил использовать преобразование Хафа, которое является очень надежным алгоритмом для нахождения простых параметрических фигур, например линий, окружностей и т. Д. Обнаружение линий было бы наилучшим в вашем случае. Вы могли найти стороны длинных белых срипов по крайней мере; затем с помощью любого алгоритма извлечения углов (Харриса или, может быть, даже SIFT или SURF) вы можете находить углы вдоль этих линий, даже используя тот факт, что квадраты расположены примерно одинаково на расстоянии.

canahari
источник
0

Я пробовал эту проблему, используя opencv, python. Подход предполагает маскирование изображения на основе цветов с последующим нахождением подходящих контуров.

Код: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_boxвведите описание изображения здесь

[Пропустил 1 коробку, но это должно произойти, настроив функцию маскировки]

Рахул Бхамбри
источник