İki görüntü arasındaki benzerliği nasıl ölçebilirim? [kapalı]


96

Bir uygulamanın ekran görüntüsünü (bir Web sayfası olabilir) daha önce alınmış bir ekran görüntüsüyle, uygulamanın kendisini doğru şekilde görüntüleyip görüntülemediğini belirlemek için karşılaştırmak istiyorum. Tam bir eşleşme karşılaştırması istemiyorum çünkü bakış açısı biraz farklı olabilir (bir Web uygulaması durumunda, tarayıcıya bağlı olarak, bazı öğeler biraz farklı bir konumda olabilir). Ekran görüntülerinin ne kadar benzer olduğuna dair bir ölçü vermelidir.

Bunu zaten yapan bir kitaplık / araç var mı? Nasıl uygularsın?


1
Bu diğer benzer söz konusu bazı iyi cevaplar vardır: stackoverflow.com/questions/75891/...
blak

1
Ve daha fazlası burada: stackoverflow.com/questions/189943/…
Anoyz

1
Yanıtları, Makine Öğrenimindeki ve daha özel olarak "Derin Öğrenme" deki son gelişmeler ışığında güncelleme zamanı.
jldupont

Laboratuvarımın da bu sorunu çözmesi gerekiyordu ve burada özetlenen iş akışını kullandı: douglasduhaime.com/posts/…
duhaime

Yanıtlar:


75

Bu tamamen algoritmanın ne kadar akıllı olmasını istediğinize bağlıdır.

Örneğin, bazı sorunlar şunlardır:

  • kırpılmış resimler ile kırpılmamış bir resim
  • metin eklenmiş ve başka biri olmayan resimler
  • yansıtılmış görüntüler

Bunun için gördüğüm en kolay ve en basit algoritma , her görüntü için aşağıdaki adımları uygulamaktır:

  1. 64x64 veya 32x32 gibi küçük bir boyuta ölçekleyin, en boy oranını göz ardı edin, en yakın piksel yerine bir birleşik ölçekleme algoritması kullanın
  2. en koyu siyah ve en açık beyaz olacak şekilde renk aralıklarını ölçeklendirin
  3. en açık renk sol üstte olacak şekilde görüntüyü döndürün ve çevirin ve ardından üst-sağ bir sonraki koyu, alt-sol bir sonraki daha koyu (tabii ki mümkün olduğunca)

Düzenleme Bir birleşik ölçekleme algoritması , 10 piksel küçültüldüğünde, tüm bu 10 pikselin rengini alan ve bunları tek bir pikselde birleştiren bir işlev kullanarak bunu yapacak bir algoritmadır . Ortalama, ortalama değer gibi algoritmalar veya bikübik eğriler gibi daha karmaşık algoritmalarla yapılabilir.

Ardından, iki görüntü arasındaki ortalama mesafeyi piksel piksel hesaplayın.

Bir veritabanında olası bir eşleşmeyi aramak için, piksel renklerini veritabanında ayrı sütunlar olarak depolayın, bir grup dizini dizinleyin (ancak çok küçük bir görüntü kullanmadığınız sürece hepsini değil) ve her biri için bir aralık kullanan bir sorgu yapın piksel değeri, yani. küçük resimdeki pikselin, bakmak istediğiniz görüntünün -5 ile +5'i arasında olduğu her görüntü.

Bu, uygulanması kolay ve oldukça hızlıdır, ancak elbette en gelişmiş farklılıkların üstesinden gelmeyecektir. Bunun için çok daha gelişmiş algoritmalara ihtiyacınız var.


14
"Birleştirme ölçekleme algoritması" nedir?
Gregg Lind

32

Bunu ölçmenin 'klasik' yolu, görüntüyü bazı kanonik sayıda bölüme (örneğin 10x10 ızgara) ayırmak ve ardından her hücrenin içindeki RGB değerlerinin bir histogramını hesaplamak ve karşılık gelen histogramları karşılaştırmaktır. Bu tür bir algoritma, hem basitliği hem de ölçeklendirmeye ve (küçük!) Çeviriye karşı değişmezliği nedeniyle tercih edilir.


6
Bu, görüntünün tamamı için tek bir histogram yapmaya benzemiyor, ancak aynaya ve döndürmeye dirençli olmamanın ek dezavantajları var mı?
dodgy_coder

Görüntünün 2 yarısından 2 histogram, bir bütünün 1 histogramından daha iyi eşleşme hassasiyetine sahip olacaktır. Bahsettiğiniz dezavantajları olsa da, hangi sorunu çözdüğünüze bağlıdır.
psycho brm

25

Normalleştirilmiş bir renk histogramı kullanın. ( Buradaki uygulamalarla ilgili bölümü okuyun ), görüntü alma / eşleştirme sistemlerinde yaygın olarak kullanılırlar ve çok güvenilir, nispeten hızlı ve uygulaması çok kolay olan görüntüleri eşleştirmenin standart bir yoludur.

Esasen bir renk histogramı, görüntünün renk dağılımını yakalayacaktır. Bu, daha sonra renk dağılımlarının eşleşip eşleşmediğini görmek için başka bir görüntü ile karşılaştırılabilir.

Bu tür bir eşleştirme, ölçeklemeye (histogram normalleştirildikten sonra) ve döndürme / kaydırma / hareket vb. İçin oldukça dayanıklıdır.

Görüntü biraz döndürülmüş / kaydırılmış gibi piksel piksel karşılaştırmalardan kaçının, bu durum büyük bir farkın raporlanmasına neden olabilir.

Histogramlar kendinizi oluşturmak için basittir (piksel değerlerine erişebileceğinizi varsayarsak), ancak böyle hissetmiyorsanız, OpenCV kitaplığı bu tür şeyler yapmak için harika bir kaynaktır. İşte size OpenCV kullanarak nasıl histogram oluşturacağınızı gösteren bir powerpoint sunumu.


14

MPEG gibi video kodlama algoritmaları, bir videonun her karesi arasındaki farkı sadece deltayı kodlayabilmeleri için hesaplamaz mı? Video kodlama algoritmalarının bu kare farklılıklarını nasıl hesapladığını inceleyebilirsiniz.

Bu açık kaynaklı görsel arama uygulamasına bakın http://www.semanticmetadata.net/lire/ . Üçü MPEG-7 standardından olan birkaç görüntü benzerliği algoritmasını açıklar: ScalableColor, ColorLayout, EdgeHistogram ve Auto Color Correlogram.


1
Bu, buradaki soruyu cevaplamaz. Soru piksel başına piksel karşılaştırması ile ilgili değil.
Kousha

@Kousha True, ama yine de düşünmek için ilginç bir yön.
anlam meseleleri

13

Saf matematiksel bir yaklaşım kullanabilirsiniz O(n^2), ancak bu, yalnızca ofset veya bunun gibi bir şey olmadığından eminseniz faydalı olacaktır. (Bununla birlikte, homojen renklendirmeye sahip birkaç nesneniz varsa, yine de oldukça iyi çalışacaktır.)

Her neyse, fikir, iki matrisin normalleştirilmiş iç çarpımını hesaplamaktır. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Bu formül aslında matrisler (garip) arasındaki açının "kosinüsü" dür. Benzerlik ne kadar büyükse (diyelim Pij=Qij), C 1 olacaktır ve eğer tamamen farklılarsa, her biri için diyelim i,j Qij = 1(sıfır bölümden kaçınarak) Pij = 255, o zaman boyut nxniçin ne kadar büyük nolacak, sıfıra yakın olacağız almak. (Kaba hesaplama ile:) C=1/n^2.



7

Yakut çözümü burada bulunabilir

Benioku'dan:

Phashion, yinelenen ve neredeyse yinelenen multimedya dosyalarını algılayan, pHash kitaplığı "algısal karma" etrafında bir Ruby sarmalayıcısıdır.


5

İki görüntü arasındaki benzerliğin nasıl ölçüleceği tamamen ölçmek istediğiniz şeye bağlıdır, örneğin: kontrast, parlaklık, modalite, gürültü ... ve sonra sizin için en uygun benzerlik ölçüsünü seçin. Şunlar arasından seçim yapabilirsiniz MAD (ortalama mutlak fark), MSD parlaklığını ölçmek için iyidir (ortalama kare farkı) ... mevcut orada da CR iki resim arasındaki korelasyonu gösteren iyidir (korelasyon katsayısı). Ayrıca, SDH (fark görüntü histogramının standart sapması) gibi histogram tabanlı benzerlik ölçütlerinden veya MI (karşılıklı bilgi) veya NMI (normalleştirilmiş karşılıklı bilgi) gibi çok modlu benzerlik ölçülerinden seçim yapabilirsiniz .

Bu benzerlik ölçümleri zaman açısından çok maliyetli olduğu için, bu önlemleri üzerlerine uygulamadan önce görüntüleri küçültmeniz önerilir.


4

Bir görüntüyü diğerinden çıkararak ve sonra ortaya çıkan görüntüyü bir gif jpeg'i olarak sıkıştırarak ve dosya boyutunu şu şekilde alarak bir şey türetilip türetilemeyeceğini merak ediyorum (ve gerçekten sadece oraya vurulma fikrini ortaya atıyorum) bir benzerlik ölçüsü.

İki özdeş görüntünüz olsaydı, çok iyi sıkıştıran beyaz bir kutu alırdınız. Görüntüler ne kadar farklı olursa, temsil etmesi o kadar karmaşık ve dolayısıyla daha az sıkıştırılabilir olurdu.

Muhtemelen ideal bir test değil ve muhtemelen gerekenden çok daha yavaş, ancak hızlı ve kirli bir uygulama olarak işe yarayabilir.


90 derece dönmeyi düşünün; görüntüler hala benzer.
anlam meseleleri


2

Sorunuza doğrudan cevap vermeyeceğim, ama bunun olduğunu gördüm. Microsoft kısa süre önce , çok sayıda resimdeki (farklı en boy oranlarında olabilir) örtüşen alanları belirlemeye çok benzer bir şey yapan PhotoSynth adlı bir araç başlattı .

Bloglarında kullanılabilir kitaplıkları veya kod parçacıkları olup olmadığını merak ediyorum.


1
Bu teknoloji. durduruldu.
Joseph Rosson

2

Vaibhav'ın notunu genişletmek için hugin , sorun hakkında biraz fikir sahibi olması gereken açık kaynaklı bir "otomatik dikişçi" dir.


2

İhtiyacınız olanı (kısmen) yapan içerik tabanlı görüntü alma yazılımı var. Tüm referanslar ve açıklamalar proje sitesinden bağlantılıdır ve ayrıca kısa bir ders kitabı (Kindle) vardır: LIRE


1

Bu öğreticinin ardından iki görüntünün benzer veya farklı olup olmadığını görmek için Siamese Network'ü kullanabilirsiniz . Bu öğretici benzer görüntüleri bir araya getirirken L2, iki görüntünün benzerliğini ölçmek için mesafeyi kullanabilirsiniz .


0

Bu, ara sıra yapacağınız bir şeyse ve otomatikleştirmeye ihtiyaç duymuyorsa, bunu Photoshop veya Paint Shop Pro (muhtemelen GIMP veya Paint.Net gibi katmanları destekleyen bir resim düzenleyicide de yapabilirsiniz, ancak ben Bunlardan emin değilim). Her iki ekran görüntüsünü de açın ve birini diğerinin üzerine katman olarak yerleştirin. Katman karıştırma modunu Fark olarak değiştirin ve ikisi arasında aynı olan her şey siyah olur. Hizalama farklılıklarını en aza indirmek için üst katmanı hareket ettirebilirsiniz.


Bu tür farklılaştırmayı çok basitleştiren bir başka araç da kalidoscopeapp.com'dur
Michael Osofsky

0

Beyond Compare , görüntüler için piksel piksel karşılaştırmasına sahiptir, ör.

görüntü açıklamasını buraya girin


@xilpex, OP sorar: Bunu zaten yapan bir kitaplık / araç var mı? Cevabım böyle bir kitaplığa / araca bir bağlantı içeriyor.
emallove

-1

Aslında temel düzeyde bir yöntem, her piksel rengini inceleyebilir ve onu ikinci görüntüdeki karşılık gelen piksel rengiyle karşılaştırabilir - ancak bu muhtemelen çok çok yavaş bir çözümdür.

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.