it-swarm.asia

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

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ı 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, azaltmak görüntünün ne kadar aşina olması gerektiğinin yüzdesi ve artış renklerin ne kadar değişebileceği ve istenmeyen görüntü kaldırmaya neden olacaktı ...

Düşüncesi olan var mı?

21
Aistis

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 hash işlevlerinden farklı olarak, özellikler benzerse algısal karmalar birbirine "yakın" olur.

17
Joe
  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.

9
Boris Yankov

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 resmin bir LOT tutabileceğini 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.

6
Loren Pechtel

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 içinde bu GDI + lib ile oldukça kolay bir şekilde yapılabilir.

1
Onno