Sidik jari gambar untuk membandingkan kesamaan banyak gambar

94

Saya perlu membuat sidik jari dari banyak gambar (sekitar 100.000 yang ada, 1000 baru per hari, RGB, JPEG, ukuran maks 800x800) untuk membandingkan setiap gambar dengan setiap gambar lainnya dengan sangat cepat. Saya tidak dapat menggunakan metode perbandingan biner karena gambar yang hampir mirip juga harus dikenali.

Yang terbaik adalah pustaka yang ada, tetapi juga beberapa petunjuk untuk algoritme yang ada akan banyak membantu saya.

Philip Dreyer
sumber
1
Bahasa perpustakaan itu seharusnya?
Ben S

Jawaban:

57

Algoritme penghitungan hashing atau CRC normal tidak berfungsi dengan baik dengan data gambar. Sifat dimensi informasi harus diperhitungkan.

Jika Anda memerlukan sidik jari yang sangat kuat, sehingga transformasi affine (penskalaan, rotasi, terjemahan, membalik) diperhitungkan, Anda dapat menggunakan transformasi Radon pada sumber gambar untuk menghasilkan pemetaan normatif dari data gambar - simpan ini dengan setiap gambar dan lalu bandingkan hanya dengan sidik jarinya. Ini adalah algoritma yang kompleks dan bukan untuk orang yang lemah hati.

beberapa solusi sederhana dimungkinkan:

  1. Buat histogram luminositas untuk gambar sebagai sidik jari
  2. Buat versi yang diperkecil dari setiap gambar sebagai sidik jari
  3. Gabungkan teknik (1) dan (2) ke dalam pendekatan hybrid untuk meningkatkan kualitas perbandingan

Histogram luminositas (terutama yang dipisahkan menjadi komponen RGB) adalah sidik jari yang wajar untuk sebuah gambar - dan dapat diimplementasikan dengan cukup efisien. Mengurangkan satu histogram dari yang lain akan menghasilkan histogram baru yang dapat Anda proses untuk memutuskan seberapa mirip dua gambar tersebut. Histogram, karena hanya mengevaluasi distribusi dan kemunculan luminositas / informasi warna menangani transformasi affine dengan cukup baik. Jika Anda mengukur informasi luminositas setiap komponen warna hingga nilai 8-bit, penyimpanan 768 byte sudah cukup untuk sidik jari dari gambar dengan ukuran apa pun yang wajar. Histogram luminositas menghasilkan negatif palsu saat informasi warna dalam gambar dimanipulasi. Jika Anda menerapkan transformasi seperti kontras / kecerahan, posterize, perubahan warna, perubahan informasi luminositas.

Menggunakan gambar berskala adalah cara lain untuk mengurangi kepadatan informasi gambar ke tingkat yang lebih mudah untuk dibandingkan. Pengurangan di bawah 10% dari ukuran gambar asli umumnya kehilangan terlalu banyak informasi untuk digunakan - sehingga gambar 800x800 piksel dapat diperkecil menjadi 80x80 dan masih memberikan informasi yang cukup untuk melakukan sidik jari yang layak. Tidak seperti data histogram, Anda harus melakukan penskalaan anisotropik pada data gambar jika resolusi sumber memiliki rasio aspek yang berbeda-beda. Dengan kata lain, memperkecil gambar 300x800 menjadi thumbnail 80x80 menyebabkan deformasi gambar, sehingga jika dibandingkan dengan gambar 300x500 (yang sangat mirip) akan menyebabkan negatif palsu. Sidik jari thumbnail juga sering menghasilkan negatif palsu saat transformasi affine terlibat. Jika Anda membalik atau memutar gambar,

Menggabungkan kedua teknik adalah cara yang masuk akal untuk melindungi taruhan Anda dan mengurangi terjadinya positif palsu dan negatif palsu.

LBushkin
sumber
Tentang CRC, setuju. Namun, jika seseorang ingin menggunakannya, lebih baik menggunakan hash MD5 daripada CRC32
mloskot
5
Anda tidak ingin menggunakan MD5 karena ini adalah hash kriptografi satu arah. Anda perlu menggunakan metode hash yang akan menghasilkan hasil serupa untuk masukan serupa sehingga Anda dapat langsung membandingkan perbedaan antara hash.
AJ Quick
34

Ada pendekatan ad-hoc yang jauh lebih sedikit daripada varian gambar yang diperkecil yang telah diusulkan di sini yang mempertahankan cita rasa umumnya, tetapi yang memberikan dasar matematika yang jauh lebih ketat untuk apa yang sedang terjadi.

Ambil gambar wavelet Haar . Pada dasarnya, Haar wavelet adalah rangkaian perbedaan dari gambar beresolusi lebih rendah ke setiap gambar beresolusi lebih tinggi, tetapi dibobotkan oleh seberapa dalam Anda berada di 'pohon' mipmap. Perhitungannya mudah. Kemudian setelah Anda memiliki wavelet Haar dengan bobot yang tepat, buang semua kecuali k koefisien terbesar (dalam hal nilai absolut), normalisasi vektor dan simpan.

Jika Anda mengambil perkalian titik dari dua vektor yang dinormalisasi itu memberi Anda ukuran kemiripan dengan 1 hampir identik. Saya memposting lebih banyak informasi di sini .

Edward KMETT
sumber
20

Anda pasti harus melihat phash .

Untuk perbandingan gambar ada proyek php ini: https://github.com/kennethrapp/phasher

Dan klon javascript kecil saya : https://redaktor.me/phasher/demo_js/index.html

Sayangnya ini berbasis "bitcount" tetapi akan mengenali gambar yang diputar. Pendekatan lain dalam javascript adalah membangun histogram luminositas dari gambar dengan bantuan kanvas. Anda dapat memvisualisasikan histogram poligon di kanvas dan membandingkan poligon tersebut di database Anda (mis. MySQL spatial ...)

sebilasse
sumber
apakah ini di npm? Saya mencari cara untuk membandingkan kesamaan antara dua gambar menggunakan javascript
chovy
Hm, saya pikir itu "murah untuk npm". Itu benar-benar hanya demo yang ditulis dengan cepat dari awal. Namun jangan ragu untuk melakukan apapun yang Anda inginkan dengan sumbernya. Jika saya bisa membuatnya, saya akan memeriksanya nanti dan mendorongnya ke github github.com/redaktor ...
sebilasse
@SebastianLasse Saya baru saja memeriksa port JS Anda dan itu luar biasa! Saya hanya berharap Anda dapat meneruskan gambar URI ke Compare()fungsi daripada harus mendownload gambar terlebih dahulu. Selain itu, dari pengujian saya, ambang batas untuk "gambar yang sangat mirip" harus> 90%, bukan> 98%.
thdoan
12

Dahulu kala saya mengerjakan sistem yang memiliki beberapa karakteristik serupa, dan ini adalah perkiraan dari algoritme yang kami ikuti:

  1. Bagilah gambar menjadi beberapa zona. Dalam kasus kami, kami berurusan dengan video resolusi 4: 3, jadi kami menggunakan 12 zona. Melakukan ini akan menghilangkan resolusi gambar sumber dari gambar.
  2. Untuk setiap zona, hitung warna keseluruhan - rata-rata semua piksel di zona tersebut
  3. Untuk seluruh gambar, hitung warna keseluruhan - rata-rata semua zona

Jadi untuk setiap gambar, Anda menyimpan n + 1nilai integer, di mana njumlah zona yang Anda lacak.

Untuk perbandingan, Anda juga perlu melihat setiap saluran warna satu per satu.

  1. Untuk gambar keseluruhan, bandingkan saluran warna untuk warna keseluruhan untuk melihat apakah mereka berada dalam ambang tertentu - katakanlah, 10%
  2. Jika gambar berada dalam ambang batas, selanjutnya bandingkan setiap zona. Jika semua zona juga berada dalam ambang batas, gambar tersebut cukup cocok sehingga Anda setidaknya dapat menandainya untuk perbandingan lebih lanjut.

Ini memungkinkan Anda dengan cepat membuang gambar yang tidak cocok; Anda juga dapat menggunakan lebih banyak zona dan / atau menerapkan algoritme secara rekursif untuk mendapatkan keyakinan kecocokan yang lebih kuat.

GalacticCowboy
sumber
6

Mirip dengan jawaban Ic - Anda dapat mencoba membandingkan gambar pada berbagai resolusi. Jadi setiap gambar disimpan sebagai 1x1, 2x2, 4x4 .. 800x800. Jika resolusi terendah tidak cocok (tunduk pada ambang batas), Anda dapat langsung menolaknya. Jika cocok, Anda dapat membandingkannya pada resolusi lebih tinggi berikutnya, dan seterusnya ..

Selain itu - jika gambar memiliki struktur yang serupa, seperti gambar medis, Anda mungkin dapat mengekstrak struktur tersebut menjadi deskripsi yang lebih mudah / cepat untuk dibandingkan.

allclaws
sumber
Ini memetakan semacam pencarian pohon menurut saya. Ini menarik.
André Laszlo
3

Jadi, Anda ingin melakukan "pencocokan sidik jari" yang sangat berbeda dari "pencocokan gambar". Analisis sidik jari telah dipelajari secara mendalam selama 20 tahun terakhir, dan beberapa algoritme menarik telah dikembangkan untuk memastikan tingkat deteksi yang tepat (sehubungan dengan pengukuran FAR dan FRR - Tingkat Penerimaan Palsu dan Tingkat Penolakan Palsu ).

Saya menyarankan Anda untuk lebih melihat kelas teknik deteksi LFA (Local Feature Analysis) , yang sebagian besar dibangun di atas inspeksi kecil-kecilan. Minutiae adalah karakteristik khusus dari setiap sidik jari, dan telah diklasifikasikan dalam beberapa kelas. Memetakan gambar raster ke peta detail adalah apa yang sebenarnya dilakukan oleh sebagian besar Otoritas Publik untuk mengajukan penjahat atau teroris.

Lihat di sini untuk referensi lebih lanjut

ZZambia
sumber
Apakah Anda tahu cara menghitung False Acceptance Rate jika Anda memiliki distribusi skor Gaussian untuk sistem biometrik tertentu?
GobiasKoffi
OP ingin "membuat sidik jari dari banyak gambar". Tidak membandingkan gambar sidik jari manusia.
Navin
3

Pada 2015 (kembali ke masa depan ... pada pertanyaan 2009 ini yang sekarang menduduki peringkat tinggi di Google), kesamaan gambar dapat dihitung menggunakan teknik Deep Learning. Keluarga algoritma yang dikenal sebagai Auto Encoders dapat membuat representasi vektor yang dapat dicari kemiripannya. Ada demo di sini .

Alex R
sumber
Apakah mungkin untuk menghasilkan gambar sidik jari dari data biner?
SwR
Tentu, ada ANN untuk tugas ini, tetapi jawaban Anda sepertinya tidak menjawab apa pun. Pertanyaannya adalah: Bagaimana cara melakukannya? Halaman tertaut tidak mengungkapkan informasi apa pun dan istilah "Pembuat Enkode Otomatis" juga tidak membantu.
Simon Steinberger
Pertanyaan Asli tidak mengatakan "Bagaimana cara melakukannya?", tetapi mengatakan "beberapa petunjuk untuk algoritme yang ada akan banyak membantu saya", itulah yang saya berikan.
Alex R
Anda tidak menautkan "petunjuk" ke algoritme, pada kenyataannya halaman yang ditautkan mengatakan, "berfungsi, tetapi tidak ada yang tahu mengapa. Harap jangan berharap terlalu banyak tentang hasilnya" ...
odyth
Deeplearning4j.org/deepautoencoder#use-cases ini memberikan kejelasan lebih lanjut tentang bagaimana Auto Encoder dapat digunakan untuk membuat sidik jari dan kemudian bagaimana Anda dapat menggunakan sidik jari tersebut untuk menemukan kesamaan pada gambar lain berdasarkan seberapa mirip simpul tersebut.
1818
2

Salah satu cara Anda dapat melakukannya adalah dengan mengubah ukuran gambar dan menurunkan resolusi secara signifikan (mungkin 200x200?), Menyimpan versi yang lebih kecil (rata-rata piksel) untuk melakukan perbandingan. Kemudian tentukan ambang toleransi dan bandingkan setiap piksel. Jika RGB dari semua piksel berada dalam toleransi, Anda memiliki kecocokan.

Proses awal Anda adalah O (n ^ 2) tetapi jika Anda membuat katalog semua kecocokan, setiap gambar baru hanyalah algoritme O (n) untuk dibandingkan (Anda hanya perlu membandingkannya dengan setiap gambar yang disisipkan sebelumnya). Namun pada akhirnya akan rusak karena daftar gambar untuk dibandingkan menjadi lebih besar, tetapi saya pikir Anda aman untuk sementara waktu.

Setelah 400 hari berjalan, Anda akan memiliki 500.000 gambar, yang berarti (dengan mengabaikan waktu untuk mengubah ukuran gambar) 200(H)*200(W)*500,000(images)*3(RGB)= 60.000.000.000 perbandingan. Jika setiap gambar sama persis, Anda akan tertinggal, tapi itu mungkin tidak akan menjadi masalah, bukan? Ingat, Anda dapat mendiskon gambar sebagai pertandingan segera setelah perbandingan tunggal berada di luar ambang batas Anda.

lc.
sumber
2

Apakah Anda benar-benar ingin membandingkan setiap gambar dengan yang lain? Apa aplikasinya? Mungkin Anda hanya perlu semacam pengindeksan dan pengambilan gambar berdasarkan deskriptor tertentu? Kemudian misalnya Anda dapat melihat standar MPEG-7 untuk Antarmuka Deskripsi Konten Multimedia. Kemudian Anda dapat membandingkan deskriptor gambar yang berbeda, yang tidak akan terlalu akurat tetapi jauh lebih cepat.

Anonim
sumber
mungkin pilihan antara lengkap dan terbatas
johnny
0

Tampaknya algoritme hashing gambar khusus adalah area penelitian aktif tetapi mungkin penghitungan hash normal dari byte gambar akan berhasil.

Apakah Anda mencari gambar yang identik dengan byte daripada mencari gambar yang berasal dari sumber yang sama tetapi mungkin format atau resolusi yang berbeda (menurut saya sebagai masalah yang agak sulit).

Ian Hopkinson
sumber