Ölçek ve Döndürme değişmez Şablon Eşleme


12

Ölçek ve döndürme değişmez Şablon eşleştirme için bir yöntem arıyorum. Zaten bazılarını denedim, ancak örneklerim için çok iyi çalışmadılar veya yürütmek için hiç sürmediler. SIFT ve SURF Özellik tespiti tamamen başarısız oldu. Ayrıca bir Log-Polar Şablon Eşleştirme işlevi uygulamaya çalıştım, ancak hiç bitirmedim (nasıl yapılacağını tam olarak bilmiyordum).

Bu Makalelerde (birincisi almanca)

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

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

Bu yöntemi okudum. Kutupsal koordinatları haritalamak işe yaradı, ama doğru olup olmadığını bilmiyorum. Görüntüler şöyle görünür.

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

template_log_polar.png

Ve bu 2 görüntüyü OpenCV'nin Şablon Eşleme fonksiyonu ile eşleştirdikten sonra bu sonucu aldım

match_log_polar.png

Şimdi nasıl devam edeceğimi bilmiyorum.

Şablonlarım, planları ve planların kendisini oluştururken her zaman basit sembollerdir. Semboller boyut ve yön bakımından farklılık gösterebilir.

Örneğin benim basit planım:

resim açıklamasını buraya girin

Ve şablonum

resim açıklamasını buraya girin

Bu örnekte yalnızca bir şablon vardır, ancak taslaklarda, boyutları ve / veya yönlendirmeleri olanlar da dahil olmak üzere tüm oluşumları bulmalıdır.

Bunu nasıl çözebileceğim kimse var mı?

Düzenle:

Andrey'nin yaklaşımına ek olarak. Radyal profil için mesafe yakalama algoritması. (EmguCV Kullanarak)

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'ye hoş geldiniz. Size yardımcı olmaya çalışacağız, ancak daha kesin bilgi vermek iyi olurdu. Ne demek SIFT ve SURF "tamamen başarısız"? Neyi tespit ettiler / eşleştirdiler? Ayrıca, kişisel olarak Log-Polar Şablon Eşleştirmesi'ni bilmiyorum, ancak denediyseniz, sorunun tam olarak nerede olduğu?
penelope

SIFT ve SURF özellik algılamaları, şablon görüntüsünde herhangi bir özellik bulamadı. Şablon çok daha az bilgiye sahip gibi görünüyor (sadece o küçük yay ve bir çizgi). Log-Polar eşleşmesi için, açıklandığı yerde bir kağıt buldum, ancak arkasındaki tam matematiği bulamadım. Onu arayacağım ve ekleyeceğim.
Arndt Bieberstein


Hey, burada pek çok insan Almanca anlayamıyor, bence: D Ancak, her şey için: yorumlarınız yerine doğru yere yeni bilgiler eklemek için kendi yayınınızı düzenleyebilirsiniz. Ve ayrıca, hala tam olarak neyle problemin olduğunu söylemedin.
penelope

3
"Alman Makalesi" nin yazarı İngilizce'dir - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf (google sayesinde)
SergV

Yanıtlar:


6

Sanırım probleminizi çok daha kolay bir şekilde çözebilirsiniz. Planlarla uğraştığınızı göz önünde bulundurarak, kenar bağlantısı, gürültü ve SIFT ve SURF'un barındırmak için inşa edildiği diğer birçok şey hakkında endişelenmemelisiniz. Şablonunuz belirli kenar şekillerine sahip içi boş bir şekildir.

Böylece, Benim tavsiyem:

  • Çevre etrafında yürüyün ve şablonun merkezi etrafındaki kenar mesafelerinin profilini bulun. Bu, şablonun radyal profilidir. Ölçek değişmez olmak için en büyük mesafeye bölün. Vektörü, dönme değişmezi olarak en küçük mesafe ilk olacak şekilde döndürün. (Şablonunuzda hakim mesafe yoksa, 2. adımı daha sonra değiştirebilirsiniz)

resim açıklamasını buraya girin

  • Görüntüdeki lekeleri bulun. Bölüm (1) 'de tanımlanan radyal profili hesaplayın ve iki vektörü normalleştirilmiş korelasyon ile karşılaştırın. Şablonunuzda baskın mesafe yoksa, korelasyon normalleştirilmiş çapraz korelasyon haline gelir ve maksimum seçimi). Bir eşiği geçenler eşleşme olarak kabul edilir.

İşte başlamanız için bazı Matlab kodu - Belirli bir damla için mesafe profilini bulan kısmı yazdım ve şablon için hesapladım:

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

Sanırım bu kapalı olmayan şekillerle çalışmıyor? Yoksa sadece bu "delikleri" şeklinde atlıyor muyum.
Arndt Bieberstein

@ArndtBieberstein, Evet, sadece kapalı şekiller için çalışıyor. Sanırım uzatmak için bir yöntem olmalı.
Andrey Rubshtein

OpenCV bwtraceboundary fonksiyonunu içermediğinden, ben kendi yazdım ve sadece delikleri atladı ve sıfırlarla dolu. Sonuçların şimdi nasıl göründüğüne dair küçük bir örnek. Her şablon için 5 grafik. Kırmızı nokta başlangıç ​​noktalarıdır. Örnek Arsa
Arndt Bieberstein

@ArndtBieberstein, çok güzel! Belki bitirdikten sonra sonuçları bizimle paylaşabilirsiniz.
Andrey Rubshtein

Tabii, Kod o kadar iyi veya performans değil, ama işe yarıyor. Sorumun altına ekleyeceğim. C # ile yazılmış (EmguCV kullanıyorum)
Arndt Bieberstein

3

İşte IIT Madras'tan Profesör Anurag Mittal'in konuşmasına dayanarak, bildiklerimin temel fikri.

Fikir şekle dayalı nesne algılamadır, ancak başka yerlerde de genişletilebilir.

  1. Kenarları Berkeley kenar detektörü kullanarak hesaplayın.
  2. Elde edilen kenarları bağlayın. Msgstr "Küresel Nesne Sınır Tespiti".
  3. Pah mesafesi veya Houstoff Mesafesi kullanılarak şekil eşleme.

Aynı makaleyi şu adreste bulabilirsiniz: Çok Aşamalı Kontur tabanlı Deforme Objelerin Saptanması.

Öte yandan, SIFT'in köşe algılama algoritmaları üzerinde sahip olduğunuz şablon özelliği üzerinde çalışacağı için çalışması gerektiğini düşünüyorum.

Not: SIFT tamamen dönme değişmezi değildir. 60 dereceden fazla rotasyonlarla baş edemiyor. Bu yüzden birden fazla şablon oluşturmak iyi bir fikirdir.

Log-polar tabanlı Fourier-Mellin Transfromlarında olduğu gibi: Dönüşümler için örneklemenin nasıl gerçekleştiğinden dolayı bilgi kaybına neden olurlar.


Bu yöntem kulağa umut verici geliyor! Bağlantınızı açamıyorum, ama yaklaşımınızı araştırdım. SIFT'in SIFT'nin tamamen rotasyonlu bir değişken olmadığını bilmiyordum! Çok iyi cevap! +1
Arndt Bieberstein

1
Pah Mesafesi ve nasıl çalıştığı hakkında pek bir şey bulamadım, bu da arayanlar için bu bağlantıyı deneyin .
Arndt Bieberstein

@Naresh SIFT düzlem dışı büyük rotasyonlar için rotasyonla değişmez değildir . Aynı düzlemde değil.
a-Jays

1

Çok fazla düşünmedim, ancak klasik Fourier Tanımlayıcıları (FD) kullanarak çok fazla sorun olmadan sağlam bir çözümün bulunabileceğinden eminim. Bence probleminiz bunun için çok iyi bir aday olabilir. Siyah çizgi çizimleriniz varsa kenar algılama b / c yapmanız gerektiğini düşünmeyin. Herhangi bir piksele ulaşana kadar raster taramaya başlayın, ardından aşağıdakileri yapın:

Odanızın çevresini, sinyal genliğinin, nesnenin centroidinden normal uzaklık olduğu ve bir miktar sabit oranda örneklendiği bir 1D sinyaliymiş gibi davranın. Yani, kapı için basit bir FD modeli yapın. Ardından, her odanın parametresini, yükselecek bir kenar, bir tepe noktası ve bir düşüş arayan bir tür dışbükey filtre ile tarayın, bu yakalama için bir "sinyal" başlatma / durdurma penceresi ayarlar. Yakalanan "sinyal" üzerinde bir FFT veya benzeri bir FD algo yapın ve FD şablonuyla karşılaştırın. Belki şablon karşılaştırma adımı, bir eşleşmeyi tetiklemek için bir eşik ile basit bir korelasyon olabilir. Sadece kapılarınız yuvarlak kenarlara sahip olduğundan, bu oldukça kolay bir FD eşleştirme problemi olmalıdır.

FD'leri bir veritabanından görüntü veya müzik alımı yapıyor gibi düşünün. Bir sürü beyaz kağıt var.

Bu, şekilleri yaklaşıklaştırmak için FD'leri kullanma konusunda iyi bir öğreticidir: İhtiyacınız olacağından şüpheliyim, ancak önce bu makalede önerildiği gibi dönüşlerle başa çıkmak için resimlerinizi kutupsal bir koordinat çerçevesine dönüştürebilirsiniz: Şekil tabanlı görüntü alma genel Fourier tanımlayıcısı

FD'nin elma çevre algılamasını nasıl parametrelendirdiğini görüyor musunuz? Kapınızla aynı fikir.

BTW, tüm şematiği kutupsal koordinatlara eşlemek, dönme değişmezliğine yardımcı olmayacağından eminim - bunu her kapının sentroidi hakkında yapmanız gerekir, ki bu tam olarak probleminizle başlamaktır. Bu yüzden, sadece kapı adaylarını yakalamak ve belki de yukarıda bağlantılı olan bu kağıtta yapılan gibi, FD kapı şablonuyla eşleşmek için bunları kutupsal koordinatlarla eşleştirmek istediğinizi düşünüyorum.

bu yaklaşımı denerseniz nasıl gittiğini bana bildirin.


0

Belki de yararlı bulduğum bu Matlab kodunu bulacaksınız: Fraktal Mozaikler

Bulduğum geleneksel yöntemlerden daha sağlamlık gerektiren sanatsal bir uygulamada "Log-Polar Dönüşümü Kullanarak Sağlam Görüntü Kaydı" ( pdf ) kağıdını uygular .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.