Birçok görüntünün benzerliğini karşılaştırmak için görüntü parmak izi


95

Her görüntüyü diğer görüntülerle çok hızlı bir şekilde karşılaştırmak için birçok görüntünün (yaklaşık 100.000 mevcut, günde 1000 yeni, RGB, JPEG, maksimum boyut 800x800) parmak izlerini oluşturmam gerekiyor. İkili karşılaştırma yöntemlerini kullanamıyorum çünkü neredeyse benzer görüntülerin de tanınması gerekiyor.

En iyisi mevcut bir kitaplık olabilir, ancak mevcut algoritmalara yönelik bazı ipuçları da bana çok yardımcı olacaktır.


1
Kütüphanenin olması gereken dil?
Ben S

Yanıtlar:


57

Normal karma veya CRC hesaplama algoritmaları, görüntü verileriyle iyi çalışmaz. Bilginin boyutsal niteliği dikkate alınmalıdır.

Afin dönüşümlerin (ölçekleme, döndürme, çevirme, çevirme) hesaba katılması için son derece sağlam parmak izine ihtiyacınız varsa , görüntü verilerinin normatif bir eşlemesini oluşturmak için görüntü kaynağında bir Radon dönüşümü kullanabilirsiniz - bunu her görüntü ile saklayın ve sonra sadece parmak izlerini karşılaştırın. Bu karmaşık bir algoritmadır ve kalbin zayıfları için değil.

birkaç basit çözüm mümkündür:

  1. Görüntü için parmak izi olarak bir parlaklık histogramı oluşturun
  2. Her görüntünün küçültülmüş versiyonlarını parmak izi olarak oluşturun
  3. Gelişmiş karşılaştırma kalitesi için tekniği (1) ve (2) hibrit bir yaklaşımla birleştirin

Parlaklık histogramı (özellikle RGB bileşenlerine ayrılmış olan) bir görüntü için makul bir parmak izidir ve oldukça verimli bir şekilde uygulanabilir. Bir histogramı diğerinden çıkarmak, iki görüntünün ne kadar benzer olduğuna karar vermek için işleyebileceğiniz yeni bir historgram oluşturacaktır. Histogramlar, parlaklık / renk bilgisinin dağılımını ve oluşumunu değerlendiren tek grafik, afin dönüşümleri oldukça iyi ele alır. Her bir renk bileşeninin parlaklık bilgisinin miktarını 8 bitlik bir değere indirirseniz, 768 bayt depolama, hemen hemen her makul boyuttaki bir görüntünün parmak izi için yeterlidir. Parlaklık histogramları, bir görüntüdeki renk bilgileri değiştirildiğinde yanlış negatifler üretir. Kontrast / parlaklık, posterleştirme, renk kaydırma, parlaklık bilgisi değişiklikleri gibi dönüşümler uygularsanız.

Ölçeklendirilmiş görüntüleri kullanmak, görüntünün bilgi yoğunluğunu karşılaştırması daha kolay bir düzeye indirmenin başka bir yoludur. Orijinal görüntü boyutunun% 10'unun altındaki küçültmeler genellikle kullanılamayacak kadar çok bilgiyi kaybeder - bu nedenle 800x800 piksellik bir görüntü 80x80'e küçültülebilir ve yine de düzgün parmak izi almak için yeterli bilgi sağlayabilir. Histogram verilerinden farklı olarak, kaynak çözünürlükleri değişen en-boy oranlarına sahip olduğunda görüntü verisinin anizotropik ölçeklendirmesini yapmanız gerekir. Başka bir deyişle, 300x800 bir görüntünün 80x80'lik bir küçük resme küçültülmesi görüntünün deformasyonuna neden olur, öyle ki 300x500 görüntü ile karşılaştırıldığında (bu çok benzer) yanlış negatiflere neden olur. Küçük resim parmak izleri, afin dönüşümler söz konusu olduğunda genellikle yanlış negatifler üretir. Bir resmi çevirirseniz veya döndürürseniz,

Her iki tekniği birleştirmek, bahislerinizi korumanın ve hem yanlış pozitif hem de yanlış negatiflerin oluşumunu azaltmanın makul bir yoludur.


CRC ile ilgili olarak, kabul etti. Ancak, kullanmak isterse, MD5 hash kullanmak
CRC32'den

5
MD5'i kullanmak istemezsiniz çünkü bu tek yönlü bir kriptografik karmadır. Karmalar arasındaki farkları doğrudan karşılaştırabilmeniz için, benzer bir girdi için benzer bir sonuç üretecek bir karma yöntem kullanmanız gerekir.
AJ Quick

34

Burada önerilen küçültülmüş görüntü varyantlarından çok daha az geçici bir yaklaşım var, genel lezzetlerini koruyor, ancak bu, olup bitenler için çok daha katı bir matematiksel temel sağlıyor.

Görüntünün Haar dalgacıklarını alın . Temelde Haar dalgacığı, düşük çözünürlüklü görüntülerden her yüksek çözünürlüklü görüntüye kadar olan farklılıklar dizisidir, ancak mipmap'lerin 'ağacında' ne kadar derin olduğunuza göre ağırlıklandırılır. Hesaplama basittir. Sonra, Haar dalgacıklarını uygun şekilde ağırlıklandırdıktan sonra, en büyük katsayılar (mutlak değer cinsinden) dışında tümünü atın, vektörü normalleştirin ve kaydedin.

Bu normalleştirilmiş vektörlerden ikisinin iç çarpımını alırsanız, bu size 1'in neredeyse aynı olduğu bir benzerlik ölçüsü verir. Ben üzerinde daha fazla bilgi yayınlanmıştır burada .


20

Phash'a kesinlikle bir göz atmalısınız .

Görüntü karşılaştırması için şu php projesi var: https://github.com/kennethrapp/phasher

Ve benim küçük javascript klonum: https://redaktor.me/phasher/demo_js/index.html

Maalesef bu "bit sayısı" tabanlıdır ancak döndürülmüş resimleri tanıyacaktır. Javascript'teki diğer bir yaklaşım, tuval yardımıyla görüntüden bir parlaklık histogramı oluşturmaktı. Tuval üzerinde bir çokgen histogramını görselleştirebilir ve bu çokgeni veritabanınızda karşılaştırabilirsiniz (örneğin mySQL uzamsal ...)


bu npm'de mi? Javascript kullanarak iki resim arasındaki benzerliği karşılaştırmanın bir yolunu arıyorum
chovy

Hm, "npm için ucuza" olduğunu düşündüm. Gerçekten sıfırdan hızlıca yazılmış bir demodur. Ancak kaynakla istediğinizi yapmaktan çekinmeyin. Yapabilirsem, daha sonra inceleyip github github.com/redaktor'a göndereceğim ...
sebilasse

@SebastianLasse JS bağlantı noktanızı kontrol ettim ve bu harika! Compare()Önce görüntüyü indirmek zorunda kalmadan işleve bir görüntü URI'si geçirebilmenizi diliyorum . Ayrıca, benim testime göre, "çok benzer bir görüntü" için eşik,>% 98 değil,>% 90 olmalıdır.
thdoan

12

Uzun zaman önce benzer özelliklere sahip bir sistem üzerinde çalıştım ve bu takip ettiğimiz algoritmanın bir tahminidir:

  1. Resmi bölgelere ayırın. Bizim durumumuzda 4: 3 çözünürlükte video ile uğraşıyorduk, bu yüzden 12 bölge kullandık. Bunu yapmak, kaynak görüntülerin çözünürlüğünü resimden çıkarır.
  2. Her bölge için genel bir renk hesaplayın - bölgedeki tüm piksellerin ortalaması
  3. Görüntünün tamamı için genel bir renk hesaplayın - tüm bölgelerin ortalaması

Dolayısıyla, her görüntü için, n + 1tam sayı değerleri depoluyorsunuz , burada nizlediğiniz bölge sayısı.

Karşılaştırmalar için, her renk kanalına ayrı ayrı bakmanız da gerekir.

  1. Genel görüntü için, belirli bir eşik içinde olup olmadıklarını görmek için genel renklerin renk kanallarını karşılaştırın - örneğin,% 10
  2. Görüntüler eşik içindeyse, daha sonra her bir bölgeyi karşılaştırın. Tüm bölgeler de eşik dahilindeyse, görüntüler yeterince güçlü bir eşleşmedir ve en azından daha fazla karşılaştırma için işaretleyebilirsiniz.

Bu, eşleşmeyen resimleri hızlı bir şekilde atmanıza olanak tanır; daha güçlü eşleşme güveni elde etmek için daha fazla bölge kullanabilir ve / veya algoritmayı yinelemeli olarak uygulayabilirsiniz.


6

Ic'nin cevabına benzer şekilde - görüntüleri birden çok çözünürlükte karşılaştırmayı deneyebilirsiniz. Böylece her resim 1x1, 2x2, 4x4 .. 800x800 olarak kaydedilir. En düşük çözünürlük eşleşmezse (bir eşiğe bağlı olarak), hemen reddedebilirsiniz. Eğer eşleşirse, bunları bir sonraki daha yüksek çözünürlükte karşılaştırabilirsiniz ve bu böyle devam eder ..

Ayrıca - görüntüler tıbbi görüntüler gibi benzer bir yapıyı paylaşıyorsa, bu yapıyı karşılaştırması daha kolay / daha hızlı olan bir açıklamaya çıkarabilirsiniz.


Bu sanırım bir tür ağaç arama ile eşleşiyor. İlginç.
André Laszlo

3

Yani "görüntü eşleştirme" den oldukça farklı "parmak izi eşleştirme" yapmak istiyorsunuz. Parmak izlerinin analizi, son 20 yılda derinlemesine incelenmiştir ve doğru tespit oranını sağlamak için birkaç ilginç algoritma geliştirilmiştir ( FAR ve FRR ölçümlerine göre - Yanlış Kabul Oranı ve Yanlış Red Oranı ).

Çoğunlukla minutiae incelemesi üzerine inşa edilen LFA (Yerel Özellik Analizi) algılama tekniklerine daha iyi bakmanızı öneririm . Minutiae, herhangi bir parmak izinin belirli özellikleridir ve birkaç sınıfta sınıflandırılmıştır. Bir raster görüntüyü küçük bir haritayla eşleştirmek, aslında Kamu Otoritelerinin çoğunun suçluları veya teröristleri dosyalamak için yaptığı şeydir.

Daha fazla referans için buraya bakın


Belirli bir biyometrik sistem için Gauss dağılımına sahipseniz Yanlış Kabul Oranını nasıl hesaplayacağınızı biliyor musunuz?
GobiasKoffi

1
OP "birçok görüntünün parmak izlerini oluşturmak" istiyor. İnsan parmak izlerinin görüntülerini karşılaştırmayın.
Navin

3

2015 itibariyle (geleceğe dönüş ... şu anda Google'da üst sıralarda yer alan bu 2009 sorusunda) görüntü benzerliği Derin Öğrenme teknikleri kullanılarak hesaplanabilir. Otomatik Kodlayıcılar olarak bilinen algoritma ailesi, benzerlik için aranabilir bir vektör gösterimi oluşturabilir. Burada bir demo var .


İkili verilerden parmak izi görüntüsü oluşturmak mümkün müdür?
SwR

Elbette, bu görev için YSA var, ancak cevabınız aslında hiçbir şeyi yanıtlamıyor. Soru şu: Bu nasıl yapılır? Bağlantı verilen sayfa herhangi bir bilgiyi ifşa etmiyor ve "Otomatik Kodlayıcılar" terimi de yardımcı olmuyor.
Simon Steinberger

Orijinal Soru "Bu nasıl yapılır?" demiyor, ancak "mevcut algoritmalara yönelik bazı ipuçları bana çok yardımcı olabilir" diyor ki ben de bunu sağladım.
Alex R.

Bir algoritmaya "ipucu" bağlamadınız, aslında bağlantılı sayfa diyor ki, "işe yarıyor, ancak kimse nedenini bilmiyor. Lütfen sonuç hakkında çok fazla şey beklemeyin" ...
odyth

Bu deeplearning4j.org/deepautoencoder#use-cases , Otomatik Kodlayıcıların bir parmak izi oluşturmak için nasıl kullanılabileceği ve ardından bu parmak izini, köşelerin ne kadar benzer olduğuna bağlı olarak diğer görüntülerde benzerlikler bulmak için nasıl kullanabileceğiniz konusunda daha fazla netlik sağlar.
odyth

2

Bunu yapmanın bir yolu, karşılaştırmayı yapmak için daha küçük (piksel ortalamalı) bir sürüm depolayarak görüntüyü yeniden boyutlandırmak ve çözünürlüğü önemli ölçüde düşürmektir (belki 200x200'e?). Ardından bir tolerans eşiği tanımlayın ve her pikseli karşılaştırın. Tüm piksellerin RGB'si tolerans dahilindeyse, bir eşleşme elde etmiş olursunuz.

İlk çalıştırmanız O (n ^ 2), ancak tüm eşleşmeleri kataloglarsanız, her yeni görüntü, karşılaştırmak için yalnızca bir O (n) algoritmasıdır (yalnızca daha önce eklenen görüntülerle karşılaştırmanız gerekir). Bununla birlikte, karşılaştırılacak resimlerin listesi büyüdükçe sonunda bozulacak, ancak bir süre güvende olduğunuzu düşünüyorum.

400 gün çalıştıktan sonra, 500.000 görüntünüz olacak, yani (görüntüyü küçültmek için süre azaltma) 200(H)*200(W)*500,000(images)*3(RGB)= 60.000.000.000 karşılaştırma. Her görüntü tam olarak eşleşiyorsa, geride kalacaksınız, ancak muhtemelen durum böyle olmayacak, değil mi? Unutmayın, tek bir karşılaştırma eşiğinizin dışına çıktığı anda bir görüntüyü eşleşme olarak indirgeyebilirsiniz.


2

Kelimenin tam anlamıyla her görüntüyü diğerleriyle karşılaştırmak istiyor musunuz? Uygulama nedir? Belki sadece belirli tanımlayıcılara göre bir tür görüntü indeksleme ve geri alma işlemine ihtiyacınız var? Daha sonra örneğin Multimedya İçerik Tanımlama Arayüzü için MPEG-7 standardına bakabilirsiniz. Daha sonra farklı görüntü tanımlayıcılarını karşılaştırabilirsiniz, bu doğru olmayacak ama çok daha hızlı olacaktır.


belki kapsamlı ve sınırlı arasında bir seçim
johnny


0

Görünüşe göre özel görüntü karma algoritmaları aktif bir araştırma alanıdır, ancak görüntü baytlarının normal bir karma hesaplaması işe yarayabilir.

Aynı kaynaktan türetilen ancak farklı bir format veya çözünürlük (bu beni oldukça zor bir sorun olarak gören) görüntüleri aramak yerine bayt özdeş görüntüler mi arıyorsunuz?

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.