Знаходження квадратів у зображенні


34

Мені потрібно знайти квадрати на зображенні за допомогою OpenCV (жодна проблема в matlab чи будь-який інший, як правило, те, що я очікую, є деякі ідеї).

Розглянемо тестове зображення нижче:

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

Мені потрібно точно знайти ці кольорові квадрати на зображенні вище (не білі довгі смужки).

Що я зробив :

  • Я застосував звичайний метод (який поставляється із зразками OpenCV), тобто знайшов контури у всіх кольорах площини, наблизив його та перевірив на кількість елементів = 4. Деяк це працює, що виявлено небагато квадратів, особливо темних.

  • Наступним кроком, який я зробив, було прогнозування . тобто ця домовленість є фіксованою . Отже, якщо деякі отримані, я можу передбачити залишилися. Це також працювало до певного розширення. Але точність була дуже поганою.

Але я вважаю, що прогнозування тут не є гарним методом, і він не завжди дає точні відповіді, як дано на першому кроці.

Що мені потрібно:

1) Чи існують інші кращі методи виявлення цих квадратів точніше? Або кілька методів?

Важливим моментом є те, що час тут не є проблемою . Алгоритм може бути повільним, неважливо. Але точність - головний критерій.

Іноді зображення можуть бути набагато розмитішими.

І одна з найважливіших проблем, з якою я стикався, полягає в тому, що деякі квадрати мають майже подібний колір, як і фон (перевірте колонку 3 першого та другого квадратів).

Шукаєте ідеї, дякую заздалегідь

ОНОВЛЕННЯ:

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

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

Звичайно, результат зображення трохи змінено.

ОНОВЛЕННЯ 2:

Я відповів набагато краще рішення у своїй відповіді нижче: https://dsp.stackexchange.com/a/7526/818


ваш фон завжди білястий?

1
моя ідея полягала в тому, щоб обчислити "насичення" і поріг img, але використовуючи ваш приклад, він працює не дуже добре (обчислення насичення як макс (RG, RB, GB). Факт, що деякі квадрати виглядають майже як фон роблять Якщо всі ваші зображення мають однаковий малюнок (довгі білі смуги з квадратами поруч), вам слід розглянути можливість пошуку найпростіших бітів (наприклад, кольори справді кольорові або білі смуги), виведіть можливе місце для інших квадрати та ... знайти спосіб перевірити, чи вони там справді чи ні. Важко, але цікаво! Чи можете ви надати більше зображень?

Ну, я думаю, цього не варто було рухати.
Junuxx

1
Чи можете ви надати більше зображень? Також, що це за річ?
Андрій Рубштейн

2
ОП потрібно відповісти на деякі запитання. Можливо, білий фон не потрібен. А що з світлом? Це буде так погано? Вони виглядають просто зайвою складністю для мене.
Tae-Sung Shin

Відповіді:


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 правильних локацій, кілька об'єднаних місць, один помилковий позитив та два помилкові негативи.

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

Це також допоможе, якщо ви надали ще кілька тестових зображень.


8

Я спробував щось інше, щоб поліпшити результат. Нижче розроблено припущення, що перший крок (помаранчевий) завжди виявляється на кроці 1. І це практично завдяки високому контрастному кольору порівняно з фоном. Навіть результат, який я показав, про який я говорив, виявив його правильно

Крок 1. Знайдіть якомога більше квадратів

Я розділив зображення на площини R, G, B, H, S, V і поріг зображення для різних значень порогових значень, таких як кратні 25. Для кожного зображення я знайшов у ньому квадрати і поставив їх на "зображення маски" . Я також знайшов середню висоту і ширину квадрата.

зображення маски (Всього виявлено 7/12 квадратів):

зображення маски

Крок 2: Сформуйте сітку з квадратів

Далі я знайшов центроїди цих квадратів у зображенні маски. Сортував їх і знайшов центроїд першого квадрата (помаранчевий). З ретельного аналізу ми бачимо, що проміжок між двома квадратами - це квадрат у горизонтальному та вертикальному напрямку. Таким чином, я створив сітку квадратів, як показано нижче, і назвав її ideal_squares (це просто ім'я, це не означає, що це вихід, який мені потрібен):

ідеальні квадрати:

ідеальний образ

Крок 3: Переробіть ідеальне зображення

Тепер у нас є ідеальні квадратні центроїди та оригінальні центроїди. Я з'ясував правильні відповідники для кожного оригінального центроїда від ideal_centroids (провівши евклідову відстань між ними). Тоді я використовував Scipy interpolate.griddata для інтерполяції та перевпорядковував ideal_image відповідно до центроїдних значень (це майже те саме, що викривлення зроблено в цих запитаннях: Як усунути дефекти опуклості у квадраті судоку та перетворення зображення у OpenCV ). Отже нижче наведений результат:

Вихід:

Вихідне зображення

Крок 4: АБО працюйте над висновком із зображенням маски з першого кроку

кінцевий вихід

Тепер ви можете побачити всі квадрати виявлені, але з проблемою, згаданою нижче:

Проблема:

Подивіться на результат кроку 3, тобто перезаписане зображення квадратної сітки. За винятком двох центральних квадратів, всі інші квадрати вирізані. Це проблема, пов’язана з цим переоформленням. Я не впевнений, де проблема, з scipy.interpolate.griddata () або cv2.remap (). Я думав, що весь образ буде викривлений, але це не так. Він викривляє лише зображення всередині центроїдів, які ми дали. Якщо я можу це виправити, вихід буде нормальним.

Тож якщо хтось знає гарну ідею для цього, вітаю !!!


5

Примітка. Цей метод буде дійсно повільним.

Створіть маску, схожу на контури ідеального предмета. Подібно до цього:

маска предмета

потім пересуньте (положення, масштаб, обертання) маску по зображенню та порівняйте її з контуром реального зображення (можливо, трохи розмитим, щоб отримати більш м'яку реакцію), щоб обчислити, наскільки вони схожі, (положення, масштаб, обертання) з Найвища відповідність відповіді повинна бути (положення, масштаб, обертання) реального об'єкта.

Метод не заперечує квадрати, що змішуються з фоном або навіть частковими оклюзіями об'єкта, оскільки він враховує весь об'єкт.

Я особисто використовував цей метод успішно, щоб відслідковувати морду миші та вусів, але у мене були певні припущення, начебто це було близьке до останньої відомої позиції тощо. Але я думаю, що ви можете зменшити простір пошуку, застосувавши деякі припущення, такі як: можливі розміри об'єкта в камері, як далеко від центру він може бути, або обертання <10 градусів тощо.


5

Крок 1: Який би кінцевий бінарний образ ви не отримали, проаналізувавши площину B, G, R, H, S, V, у цьому зображенні виконайте алгоритм підрахунку крапок.

Крок 2: Знайдіть найбільшу крапку на основі площі або довжини контуру. Оскільки ваші краплі будуть в основному типів паралелограма, так що площа або контур, будь-яка з них буде робити.

Крок 3. За допомогою найбільшої краплі (оскільки найбільша крапля - найкраща крапля, що нагадує ваші реальні квадрати) спробуйте знайти орієнтацію краплі ... це ви можете отримати, обмістивши найкраще підходящий прямокутник АБО ви можете отримати кутові очки ... отримати нахил ліній, що приєднуються до них (і в горизонті, і у вертикальному напрямку).

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

Крок 5: Оскільки в кожному горизонтальному та вертикальному напрямку міжряддя однакові (в ідеалі горизонтальний та вертикальний інтервали також рівні, оскільки це виходить із ідеального квадратного зображення, але ми не будемо вважати цього). Просто потрібно знайти можливі центроїди іншого паралелограми

ЛІНІЯ БОТОМ: Якщо якийсь один квадрат виявиться ідеально, ви можете скласти всю сітку. Просто тримайте центри розмітки на інтервалі 2H (H = горизонтальна ширина найбільшої краплі) уздовж горизонтальної осі найбільшої краплі та на інтервалі 2V (V = вертикальна висота найбільшої краплі) вертикально вздовж вертикальної осі краплини.

Деякі фотографії для підтримки введіть тут опис зображення

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


1
+1 - Було б чудово, якби ви могли це реалізувати.
Абід Рахман К

2
@AbidRahmanK Це не те, для чого StackExchange. Питання -> Відповідь. Інакше це закінчиться ярмарком роботи.
Ян Крюгер

2

ця домовленість фіксована

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

Потім спробуйте виявити найпоширеніший колір у вашому цілому квадраті та встановити його на "неквадратичну" область. Решта - це квадрати, які ви шукаєте.


Я знайшов 3-4 квадрата за допомогою контурного методу. Потім отримали висоту і ширину кожного квадрата. Потім перевіряють наявність зазору між виявленими квадратами і припускають, чи зазор між ними достатньо великий, щоб вмістити ще один квадрат. Це прогноз, який я зробив.
Абід Рахман K

Деякі квадрати мають майже подібний колір, як і фон. Тому я боюся, вони також вважатимуться як неквадратична площа відповідно до вашого методу.
Абід Рахман K

Можливо, ви могли б спробувати працювати над кожними стовпцями, щоб побудувати криву, де вісь x буде висотою (у пікселях) на зображенні, а вісь y - інтенсивністю. Потім ви можете спробувати знайти кілька ріжучих країв із похідною формою.

це саме виявлення краю, правда? Я спробував це, але не отримав хорошого результату.
Абід Рахман K

1
Так, але ви самі могли зрозуміти, чому це не вдається, і, можливо, виділити кілька цікавих регіонів у сюжеті. До речі, якщо ви знайдете корисні поради щодо вирішення своєї проблеми, будь ласка, опублікуйте їх. Удачі вашим дослідженням

0

Я б запропонував використовувати перетворення Хаффа, який є дуже надійним алгоритмом пошуку простих параметричних фігур, наприклад, ліній, кіл тощо. Виявлення ліній було б найкращим у вашому випадку. Ти міг знайти хоча б сторони довгих білих пагонів; то за допомогою будь-якого алгоритму вилучення кутів (Гарріс або, можливо, навіть SIFT або SURF) ви могли знайти кути уздовж цих ліній, навіть використовуючи той факт, що квадрати приблизно однаково розташовані.


0

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

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

[Пропущено 1 коробку, але це має бути налаштовано функцію маскування]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.