Масштабування та обертання інваріантних шаблонів відповідності


12

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

У цих статтях (перша - німецькою)

http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf

http://www.jprr.org/index.php/jprr/article/viewFile/355/148

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

source_log_polar.png http://www.shareimages.com/images/pics/0/0/3/62394-pZSfl5WenZysnpyVnKg-source_log_polar.png

template_log_polar.png

І після узгодження цих 2 зображень із функцією узгодження шаблонів OpenCV я отримав такий результат

match_log_polar.png

Тепер я не можу продовжувати.

Мої шаблони - це завжди прості символи при створенні креслення та самих кресленнях. Символи можуть відрізнятися за розміром та орієнтацією.

Наприклад, мій простий план:

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

І мій шаблон

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

У цьому прикладі є лише один шаблон, але у кресленнях він повинен знайти всі події, навіть ті, які мають розміри та / або орієнтацію.

Хтось має підхід, як я міг би це вирішити?

Редагувати:

Доповнення до підходу Андрія. Алгоритм фіксації відстані для радіального профілю. (Використання EmguCV)

private float[] getRadialProfile( Image<Gray, byte> image, Point center, int resolution )
 {

 var roi = image.ROI;

 if ( !roi.Contains( center ) )
  {
   return null;
  }

 var steps = resolution;
 var degreeSteps = 360 / (double)resolution;
 var data = image.Data;
 var peak = 0.0f;
 var bottom = double.MaxValue;
 var bottomIndex = 0;
 var width = roi.Width;
 var height = roi.Height;
 var minX = roi.X;
 var minY = roi.Y;

 float[] distances = new float[resolution];
 for ( var i = 0; i < steps; i++ )
  {
   var degree = i * degreeSteps;
   var radial = degree * Math.PI / 180.0;
   var dy = Math.Sin( radial );
   var dx = Math.Cos( radial );

   var x = (double)center.X;
   var y = (double)center.Y;

   while ( true )
    {
    x += dx;
    y += dy;
    if ( x >= minX + width || y >= minY + height || x <= minX || y <= minY )
     {
      x = -1;
      y = -1;
      break;
     }
    var pixel = data[(int)y, (int)x, 0];
    if ( pixel == 0 )
     {
      break;
     }
    }

    float distance = 0.0f;
    if ( x != -1 && y != -1 )
    {
      distance = (float)Math.Sqrt( Math.Pow( (center.X - x), 2 ) + Math.Pow( (center.Y - y), 2 ) );
    }

    distances[i] = distance;
    if ( distance > peak )
    {
      peak = distance;
    }
    if ( distance < bottom )
    {
      bottom = distance;
      bottomIndex = i;
    }
   }

    // Scale invariance. Divide by peak
   for ( var i = 0; i < distances.Length; i++ )
   {
     distances[i] /= peak;
   }

    // rotation invariance, shift to lowest value
   for ( var i = 0; i < bottomIndex; i++ )
   {
     distances.ShiftLeft(); // Just rotates the array nothing special
   }

   return distances;
}

Ласкаво просимо на dsp.SE. Ми спробуємо допомогти вам, але було б непогано надати більш точну інформацію. Що ви маєте на увазі під SIFT та SURF "повністю не вдалося"? Що вони виявили / збігли? Також я особисто не знаю про відповідність шаблонів з полярними шаблонами, але, якщо ви спробували, де саме була проблема?
пенелопа

Виявлення функцій SIFT та SURF не знайшло жодних особливостей у зображенні шаблону. Здається, що шаблон має занадто менше інформації (саме той маленький лук і рядок). Для відповідності Log-Polar я знайшов папір, де це описано, але не точну математику за ним. Я шукаю його і додаю.
Арндт Біберштейн


Гей, не дуже багато людей тут можуть зрозуміти німецьку мову, я думаю: D Але, для всього іншого: ви можете редагувати власний пост, щоб додавати будь-яку нову інформацію в потрібне місце, а не в коментарі. А також ви все ще не сказали, з чим саме у вас виникли проблеми.
пенелопа

3
Автор "німецької статті" має статтю англійською мовою - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf (завдяки google)
SergV

Відповіді:


6

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

Таким чином, моя рекомендація:

  • Пройдіться по периметру і знайдіть профіль відстаней ребер навколо центру шаблону. Це радіальний профіль шаблону. Розділіть на найбільшу відстань, щоб бути інваріантною за шкалою. Поверніть вектор так, щоб найменша відстань була першою, щоб вона була інваріантною обертання. (Якщо ваш шаблон не має домінуючої відстані, ви можете змінити крок 2 пізніше)

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

  • Знайдіть крапки на зображенні. Обчисліть радіальний профіль, описаний у частині (1), і порівняйте два вектори за нормалізованою кореляцією. Якщо ваш шаблон не має домінуючої відстані, кореляція стає нормалізованою перехресною кореляцією та вибираючи максимальну). Ті, хто проходить якийсь поріг, вважаються сірниками.

Ось якийсь код Matlab для початку - я написав частину, яка знаходить профіль відстані для певного блобу, і обчислив його для шаблону:

function Doors
    im = imread('http://i.stack.imgur.com/Tf8EV.png');
    im = im(:,:,1);
    template = imread('http://i.stack.imgur.com/PlP4i.png');
    template = template(:,:,1);

    blobs = regionprops(template>0,'Area','Image');
    largestBlob = GetLargestBlob(blobs);
    [prof,edgeImage] = GetBlobRadialProfile(largestBlob);

    figure;
    subplot(1,2,1);plot(prof); title('Radial profile')
    subplot(1,2,2);imshow(edgeImage); title('Template');

end

function [prof,edgeImage] = GetBlobRadialProfile(blob)
    paddedImage = padarray( blob.Image,[8 8]);
    erodedImage = imerode(paddedImage,strel('disk',1));
    edgeImage = xor(erodedImage,paddedImage);

    c = regionprops(paddedImage,'Centroid');
    cx  = c.Centroid(1);
    cy  = c.Centroid(2);

    [y,x] = find(edgeImage);
    rad = (x(:)-cx).^2 + (y(:)-cy).^2;
    [~,minIndex] = min(rad);
    contour = bwtraceboundary(edgeImage, [y(minIndex), x(minIndex)],'N');
    prof = (contour(:,2)-cx).^2 + (contour(:,1)-cy).^2;
    prof = prof./max(prof);
end

function largestBlob = GetLargestBlob(blobs)    
    area = [blobs.Area];
    [~,index] = max(area);
    largestBlob = blobs(index);
end

Я думаю, це не працює з незакритими формами? Або я просто пропускаю ці "дірки" у формі.
Арндт Біберштейн

@ArndtBieberstein, так, це працює лише для закритих фігур. Я думаю, що має бути якийсь метод, щоб розширити його.
Андрій Рубштейн

Оскільки OpenCV не містить функції обмеження границь, я написав свою власну і просто "пропустив" дірки та заповнив нулі. Ось невеликий приклад того, як зараз виглядають результати. 5 сюжетів для кожного шаблону. Червоні точки - Стартові точки. Зразок зразка
Арндт Біберштейн

@ArndtBieberstein, дуже приємно! Можливо, ви могли б поділитися результатами з нами, як тільки закінчите.
Андрій Рубштейн

Звичайно, Кодекс не такий приємний чи вдалий, але він працює. Я додаю його під моїм запитанням. Це написано на C # (я використовую EmguCV)
Арндт Біберштейн

3

Ось основна ідея того, що я знаю, можна зробити, спираючись на розмову професора Анурага Міттала з ІІТ Мадрас.

Ідея полягає у виявленні об'єктів на основі форми, але, очевидно, може бути поширена і в іншому місці.

  1. Обчисліть ребра за допомогою детектора ребер Берклі.
  2. З’єднайте отримані краї. "Глобальне виявлення меж об'єкта".
  3. Відповідність форми за допомогою відстані Шамфера або відстані Хоустофа.

Його документ про це доступний на сайті: Багатоетапне контурне виявлення деформованих об'єктів.

З іншого боку, я думаю, що SIFT повинен працювати, як алгоритми виявлення кутів працюватимуть над функцією шаблону, яка у вас є.

Примітка: SIFT не є повністю інваріантним обертанням. Він не в змозі впоратися з обертаннями> 60 градусів або близько того. Тож формування декількох шаблонів - хороша ідея.

Як і у випадку перетворення Фур'є-Мелліна на основі логополярних пород: вони спричиняють втрату інформації через те, як відбувається вибірка для перетворень.


Цей метод звучить справді перспективно! Я не можу відкрити ваше посилання, але я гуглив ваш підхід. Я не знав, що SIFT, що SIFT, не є повною мірою обертання ірівантним! Дуже гарна відповідь! +1
Арндт Біберштейн

1
Я майже не знайшов нічого про Chamfer Distance та про те, як це працює, для тих, хто також шукає це, спробуйте це посилання.
Арндт Біберштейн

@Naresh SIFT не є інваріантним обертанням для великих обертів поза площиною. Не в одній площині.
а-Джейс

1

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

Просто поводьтеся з периметром вашої кімнати так, ніби вони були 1D-сигналом, де амплітуда сигналу - це нормальна відстань від центральної частини об'єкта, відібрана з певною стійкою швидкістю. Отже, зробіть просту модель FD для дверей. Потім скануйте параметр кожної кімнати своєрідним опуклим фільтром, шукаючи піднімаючий край, пік і падіння, який встановлює вікно початку / зупинки "сигналу" для зйомки. Зробіть FFT або подібний FD-альго на захопленому "сигналі" та порівняйте з шаблоном FD. Можливо, крок порівняння шаблону може бути простим співвідношенням з порогом, щоб викликати збіг. Оскільки у ваших дверей є круглі кромки, це має бути досить легкою проблемою узгодження FD.

Подумайте про це як про використання зображення FD для пошуку зображень або музики з бази даних. Про це багато документів.

Це хороший посібник із використання FD для наближення фігур: я сумніваюся, вам це знадобиться, але ви також можете спочатку перетворити свої зображення в полярну координатну рамку для вирішення обертань, як запропоновано в цій статті: Пошук зображень на основі форми за допомогою загальний дескриптор Фур'є

подивіться, як вони FD параметризують виявлення периметру яблук? Така ж ідея, як і ваші двері.

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

дайте мені знати, як це відбувається, якщо ви спробуєте такий підхід.


0

Можливо, ви знайдете цей код Matlab, який я написав корисним: Fractal Mosaics

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

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