Pencocokan Templat invarian Skala dan Rotasi


12

Saya mencari metode untuk pencocokan Templat invarian skala dan rotasi. Saya sudah mencoba beberapa, tetapi mereka tidak bekerja dengan baik untuk contoh saya atau mengambil untuk dieksekusi. Deteksi Fitur SIFT dan SURF gagal total. Saya juga mencoba menerapkan fungsi Pencocokan Log-Polar Template, tetapi saya tidak pernah selesai (tidak tahu persis bagaimana caranya).

Dalam Artikel ini (yang pertama adalah dalam bahasa Jerman)

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

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

Saya membaca tentang metode itu. Memetakan koordinat kutub bekerja, tetapi saya tidak tahu apakah itu benar. Gambarnya terlihat seperti ini.

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

template_log_polar.png

Dan setelah mencocokkan 2 gambar ini dengan fungsi Pencocokan Templat OpenCV saya mendapatkan hasil itu

match_log_polar.png

Sekarang saya tidak bisa melanjutkan.

Template saya selalu menjadi simbol sederhana dalam membangun cetak biru dan cetak biru itu sendiri. Simbol dapat berbeda dalam ukuran dan orientasi.

Misalnya cetak biru sederhana saya:

masukkan deskripsi gambar di sini

Dan template saya

masukkan deskripsi gambar di sini

Dalam contoh ini hanya ada satu template, tetapi dalam cetak biru itu harus menemukan semua kejadian, bahkan yang dengan ukuran dan / atau orientasi.

Adakah yang punya pendekatan bagaimana saya bisa menyelesaikan ini?

Edit:

Selain pendekatan Andrey. Algoritma penangkapan jarak untuk profil radial. (Menggunakan 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;
}

selamat datang di dsp.SE. Kami akan mencoba membantu Anda, tetapi memberikan info yang lebih tepat akan menyenangkan. Apa yang Anda maksud dengan SIFT dan SURF "gagal total"? Apa yang mereka deteksi / cocokkan? Juga, saya pribadi tidak tahu tentang Pencocokan Log-Polar Template, tetapi, jika Anda mencoba, di mana sebenarnya masalahnya?
penelope

Deteksi fitur SIFT dan SURF tidak menemukan fitur apa pun pada gambar templat. Sepertinya template memiliki informasi terlalu sedikit (hanya busur kecil dan garis). Untuk pencocokan Log-Polar saya menemukan makalah di mana itu dijelaskan, tetapi bukan matematika yang tepat di belakangnya. Saya akan mencarinya dan menambahkannya.
Arndt Bieberstein


Hei, tidak banyak orang di sini yang bisa mengerti bahasa Jerman, saya pikir: D Tapi, untuk yang lainnya: Anda dapat mengedit posting Anda sendiri untuk menambahkan informasi baru di tempat yang tepat, alih-alih di komentar. Dan, juga, Anda masih belum mengatakan apa sebenarnya yang Anda hadapi.
penelope

3
Penulis "jerman Article" memiliki artikel dalam bahasa Inggris - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf (terima kasih ke google)
SergV

Jawaban:


6

Saya pikir Anda dapat memecahkan masalah Anda dengan cara yang jauh lebih mudah. Mengingat Anda berurusan dengan cetak biru, Anda tidak perlu khawatir tentang konektivitas tepi, kebisingan, dan banyak hal lain yang SIFT dan SURF dibangun untuk mengakomodasi. Template Anda adalah bentuk berongga dengan bentuk tepi tertentu.

Jadi, rekomendasi saya adalah:

  • Berjalan di sekeliling perimeter dan temukan profil jarak tepian di sekitar pusat templat. Ini adalah profil radial templat. Bagi dengan jarak terbesar, untuk menjadi skala invarian. Putar vektor sehingga jarak terkecil adalah yang pertama, menjadi rotasi invarian. (Jika templat Anda tidak memiliki jarak dominan, Anda dapat mengubah langkah 2 nanti)

masukkan deskripsi gambar di sini

  • Temukan gumpalan pada gambar. Hitung profil radial yang dijelaskan pada bagian (1), dan bandingkan dua vektor dengan korelasi yang dinormalisasi. Jika templat Anda tidak memiliki jarak dominan, korelasi menjadi korelasi silang dinormalisasi, dan memilih maksimum). Mereka yang melewati ambang batas dianggap cocok.

Berikut adalah beberapa kode Matlab untuk Anda mulai - saya menulis bagian yang menemukan profil jarak untuk gumpalan tertentu dan menghitungnya untuk templat:

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

Saya kira ini tidak bekerja dengan bentuk yang tidak tertutup? Atau apakah saya melewatkan "lubang" dalam bentuk.
Arndt Bieberstein

@ ArndtBieberstein, Yap hanya berfungsi untuk bentuk tertutup. Saya kira harus ada beberapa metode untuk memperpanjangnya.
Andrey Rubshtein

Karena OpenCV tidak mengandung fungsi bwtraceboundary, saya menulis sendiri dan hanya "melompati" lubang dan diisi dengan nol. Inilah sedikit contoh bagaimana hasilnya sekarang terlihat. 5 Plot untuk setiap templat. Titik merah adalah titik awal. Contoh Plot
Arndt Bieberstein

@ ArndtBieberstein, sangat bagus! Mungkin Anda bisa membagikan hasilnya dengan kami setelah selesai.
Andrey Rubshtein

Tentu, Kode Etik ini tidak bagus atau performan, tetapi berfungsi. Saya akan melampirkannya di bawah Pertanyaan saya. Ini ditulis dalam C # (Saya menggunakan EmguCV)
Arndt Bieberstein

3

Inilah ide dasar dari apa yang saya tahu dapat dilakukan, berdasarkan ceramah oleh Profesor Anurag Mittal dari IIT Madras.

Idenya adalah deteksi objek berbasis bentuk, tetapi jelas dapat diperpanjang di tempat lain juga.

  1. Hitung edgels menggunakan detektor tepi Berkeley.
  2. Hubungkan tepi yang diperoleh. "Deteksi Batas Objek Global".
  3. Pencocokan bentuk menggunakan jarak Chamfer atau Jarak Houstoff.

Makalahnya pada hal yang sama tersedia di: Deteksi berbasis Objek Multi-Stage Contour berbasis Deformable.

Di sisi lain saya pikir SIFT harus berfungsi sebagai algoritma deteksi sudut akan berfungsi pada fitur template yang Anda miliki di sana.

Catatan: SIFT tidak sepenuhnya invarian rotasi. Itu tidak dapat mengatasi rotasi> 60 derajat atau lebih. Jadi membentuk banyak templat adalah ide yang bagus.

Seperti pada Fourier-Mellin Transfroms berbasis log-polar: Mereka menyebabkan hilangnya informasi karena bagaimana pengambilan sampel berlangsung untuk transformasi.


Metode ini kedengarannya sangat menjanjikan! Saya tidak dapat membuka tautan Anda, tetapi saya meng-Google-kan pendekatan Anda. Saya tidak tahu SIFT itu SIFT tidak sepenuhnya rotasi ivariant! Jawaban yang sangat bagus +1
Arndt Bieberstein

1
Saya hampir tidak menemukan apa pun tentang Chamfer Distance dan cara kerjanya, bagi mereka yang juga mencari ini coba tautan ini .
Arndt Bieberstein

@Neshesh SIFT tidak rotasi-invarian untuk rotasi besar di luar pesawat. Tidak di pesawat yang sama.
a-Jays

1

Saya belum terlalu memikirkannya, tapi saya cukup yakin solusi yang kuat dapat diperoleh tanpa banyak kesulitan menggunakan klasik Fourier Descriptors (FD). Saya pikir masalah Anda mungkin kandidat yang sangat baik untuk itu. Jangan berpikir Anda perlu melakukan deteksi tepi b / c Anda memiliki gambar garis hitam. Cukup mulai pemindaian raster hingga Anda mencapai piksel apa pun, lalu lakukan hal berikut:

Perlakukan saja perimeter ruangan Anda seolah-olah itu adalah sinyal 1D, di mana amplitudo sinyal adalah jarak normal dari centroid objek, disampel pada tingkat yang stabil. Jadi, lakukan model FD sederhana untuk pintu. Kemudian, pindai setiap parameter kamar dengan semacam filter cembung mencari tepi naik, puncak, dan turun, yang menetapkan jendela awal / berhenti "sinyal" untuk ditangkap. Lakukan FFT atau algo FD serupa pada "sinyal" yang ditangkap dan bandingkan dengan template FD. Mungkin langkah membandingkan template dapat berupa korelasi sederhana dengan ambang batas untuk memicu kecocokan. Karena hanya pintu Anda yang memiliki tepi bundar yang seharusnya menjadi masalah pencocokan FD yang cukup mudah.

Anggap saja seperti menggunakan pengambilan gambar atau musik yang dilakukan FD dari database. Banyak kertas putih tentang itu.

Ini adalah tutorial yang baik tentang penggunaan FD untuk memperkirakan bentuk: Saya ragu Anda akan membutuhkannya, tetapi Anda juga dapat pertama-tama mengubah gambar Anda menjadi kerangka koordinat kutub untuk menangani rotasi, seperti yang diusulkan dalam makalah ini: Pengambilan gambar berbasis bentuk menggunakan deskriptor Fourier generik

lihat bagaimana mereka memparameterisasi deteksi perimeter apel? Gagasan yang sama seperti pintu Anda.

BTW, saya cukup yakin memetakan seluruh skema untuk koordinat kutub tidak akan membantu invarian rotasi - Anda perlu melakukan itu tentang centroid setiap pintu, yang merupakan masalah awal Anda. Itulah mengapa saya pikir Anda hanya ingin menangkap kandidat pintu, dan mungkin memetakannya ke koordinat kutub agar sesuai dengan templat pintu FD, seperti yang dilakukan di kertas yang ditautkan di atas.

beri tahu saya bagaimana hasilnya jika Anda mencoba pendekatan ini.


0

Mungkin Anda akan menemukan kode Matlab yang saya tulis berguna: Mosaik Fraktal

Ini mengimplementasikan makalah "Robust Image Registration Menggunakan Log-Polar Transform" ( pdf ) dalam aplikasi artistik yang membutuhkan ketahanan lebih dari metode tradisional yang saya temukan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.