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.
Dan setelah mencocokkan 2 gambar ini dengan fungsi Pencocokan Templat OpenCV saya mendapatkan hasil itu
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:
Dan template saya
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;
}
sumber
Jawaban:
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:
Berikut adalah beberapa kode Matlab untuk Anda mulai - saya menulis bagian yang menemukan profil jarak untuk gumpalan tertentu dan menghitungnya untuk templat:
sumber
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.
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.
sumber
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.
sumber
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.
sumber