İki görüntünün aynı olup olmadığını nasıl öğrenebilirim? [kapalı]


20

2000'den fazla başka formatta (JPEG, PNG, GIF gibi) kopya olan 10000'den fazla resmim var. Bu sayıların her ikisi de her geçen gün artmaktadır. Bu kopyaları silmem gerekiyor ve bunun için önce onları nasıl bulacağımı bilmeliyim.

İlk düşüncem bir görüntü piksellerini kontrol etmek ve aynı koordinatlarda aynı renkli piksellere sahip diğer resimleri bulmaktı. Ancak bu seçenek her zaman işe yaramaz. Diyelim ki bir kopya arıyorum. Aranabilir nesneye gelince, 8 bit PNG dosyası seçiyorum. Bu görüntünün tüm kopyalarını bulacak, ancak sadece 8 bit PNG, bazen 8 bit GIF ve nadiren JPEG (sanırım görüntüler algoritmik nedeniyle?).

İkinci düşüncem, tüm bu görüntüleri çoğaltmak ve katı bir iki renk paletinde (siyah-beyaz diyelim) yeniden renklendirmek ve yukarıda belirtilenle aynı taramayı yapmaktı. Yine JPEG görüntüsü PNG veya GIF formatına% 100 benzer değil (yukarıdaki ile aynı neden?).

Üçüncü düşünce, görüntünün ne kadar aşina olması gerektiğine ilişkin yüzdeyi azaltmak ve renklerin ne kadar değişebileceğini artırmak ve istenmeyen görüntü kaldırmaya neden olmaktı ...

Düşüncesi olan var mı?



Kayıplı sıkıştırma içeren biçimler, kayıpsız sürümlerle% 100 aynı olmayan görüntülere yol açacaktır. Bir komut satırı yardımcı programına sahip olmanız veya bir gui programı çalıştırmanız, önerilerde bulunmanız, ardından>% 90 benzer piksele (ortalama bir sapma hesaplaması) sahip görüntüleri göstermesi gerekir mi? (ve tabii ki piksel boyutu herhangi bir formatta aynı olmalıdır)
thorsten müller


1
Kaç tanesi aynı dosya adına ancak farklı bir uzantıya sahip olurdu?
JeffO

4
Haftalarca kodlama gerektirmeyen faydalı cevap: stackoverflow.com/questions/596262/…
mac

Yanıtlar:


17

Algısal karmalar cevap olabilir:

http://www.phash.org/

Algısal karma, içeriğinden çeşitli özelliklerden türetilen bir multimedya dosyasının parmak izidir. Çıktıda büyük değişikliklere yol açan girdideki küçük değişikliklerin çığ etkisine dayanan kriptografik karma işlevlerinden farklı olarak, özellikler benzerse algısal karmalar birbirine "yakın" olur.


9
  1. Boyutları kontrol edin. Farklı => görüntüler aynı değilse.
  2. Biçimleri kontrol edin. Aynı ise => Kesin karşılaştırma yapın, piksel piksel.
  3. Farklı biçimler bunu yaparsa:

RGB'yi (kırmızı, yeşil, mavi) karşılaştırmayın. Parlaklığı ağırlığın yarısı olarak ve rengi / tonu diğer yarısı (veya 2/3/1/3) ile karşılaştırın. Değerler arasındaki farkı hesaplayın ve 'tolerans' değerine bağlı olarak aynı ya da değildir.

JPEG renk bilgilerini yoğun bir şekilde sıkıştırır, ancak sınır değerlerini mahvetmemeye çalışır.


6

Birkaç yıl önce dupes için bir grup görüntüyü tararken, her şeyi 8x8 küçük resme indirgemenin ve ardından küçük resimler arasındaki mesafenin karesine (üç rengi ayrı ayrı muamele etme) dayalı bir benzerlik skoru hesaplamanın oldukça iyi çalıştığını gördüm. Bellekte 8x8 küçük resim LOT tutabileceğinizi unutmayın .

Neredeyse tüm dupes, dupes olmayanların altında, gerçek içerik değişse bile, çok düşük kontrastlı ve genel olarak benzer bazı görüntüler olmakla ilgili (her durumda arka plan plaj kumu idi).

Bu, dosya boyutunu kesmek için birinin çözünürlüğü veya kalitesini düşürmesi dışında dupes olan görüntüleri yakalamada da etkili oldu.


1
Genellikle YUV, RGB'den daha iyidir, renk dengesindeki küçük değişikliklere daha az duyarlıdır.
Martin Beckett

Potansiyel eşleşmeleri önceden seçmek için bu küçük resim tekniği geçerlidir, YUV hoş bir dokunuş ve aynı nedenlerle saf bir parlaklık haritasına dönüştüğünü gördüm.
Patrick Hughes

@Martin Beckett: RGB farkının karelerinin toplamı ilk denediğim şeydi ve onu geliştirmeye çalışmadığım kadar iyi çalıştı - ve düzenleme ile çiftleri yakaladı. Dupe'nin katı bir tanımıyla, otomatik olarak silmesine izin verecek kadar iyiydi.
Loren Pechtel

@Loren, eğer aynı görüntünün çalışması gereken küçük piksel düzenlemeleri olsaydı. Sadece jpeg gibi şeyler RGB'yi bir YUV renk uzayından daha fazla dağıtır. Just a tip ;-)
Martin Beckett

Doğası gereği, çok karanlık resimler, benzer olmasalar bile, farklılıkların karelerinin toplamı daha düşüktür. Eşik, resmin ortalama parlaklığı ile ayarlanabilir. Bu avg parlaklığını O (n ^ 2) görüntü karşılaştırmasını önlemek için bir ön filtre olarak kullanıyorum, bu yüzden zaten orada.
Gabriel

1

Belki de görüntüleri benzerlik için tarayan bir kod yazmalısınız. Tüm resimleri ARGB formatına dönüştürebilir ve karşılaştırabilirsiniz. (bellekte)

Olası bir yaklaşım şu şekilde olabilir: Resimleri bölgelere ayırın. İki resmi benzerlikle karşılaştırmak için bölgelerin ortalama rengini ve / veya parlaklığını tarayın.

Söylemekten fazlası, bölgelerin% 90'ı eşleşirse, silme aday listesine geçmek için birini seçtiniz. Bu şekilde bir aday listeniz olur. Karşılaştırmaları hızlandırmak için resimleri yatay ve dikey resimlerde kategorilere ayırmak için resimlerin en boy oranını kullanabilirsiniz. bu şekilde pikselleri doğru renkleri üretmeyen kayıplı algoritmaları telafi edebilirsiniz. Programı bir gecede çalıştırıyorsunuz ve sabah yaptınız :) .Net'te bu GDI + lib ile oldukça kolay bir şekilde yapılabilir.

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.