Mam ponad 10.000 zdjęć, które około 2000 są duplikatami w innych formatach (jak JPEG, PNG, GIF). Obie te liczby rosną każdego dnia. Muszę usunąć te duplikaty i za to muszę wiedzieć, jak je znaleźć w pierwszej kolejności.
Moją pierwszą myślą było, by sprawdzić e obrazy piksele i znaleźć inne zdjęcia, które mają takie same kolorowe piksele w tych samych współrzędnych. Ale opcja ta nie zawsze działa. Powiedzmy, że szukam duplikatu. Jeśli chodzi o obiekt do przeszukiwania, wybieram 8-bitowy plik PNG. Znajdzie wszystkie duplikaty tego obrazu, ale tylko 8-bitowy PNG, czasem 8-bitowy GIF i rzadko JPEG (z powodu algorytmów obrazów, jak sądzę?).
Moją drugą myślą było zduplikowanie wszystkich tych obrazów i ponowne pokolorowanie ich w ścisłej palecie dwóch kolorów (powiedzmy czarno-biały) i wykonanie takiego samego skanu, jak podano powyżej. Po raz kolejny obraz JPEG nie jest w 100% podobny do formatu GIF lub PNG (z tego samego powodu co powyżej?).
Trzecią myślą było zmniejszenie procentu tego, jak bardzo obraz musi być znajomy, i zwiększenie ilości kolorów, które mogą się różnić, co skutkuje niechcianym usunięciem obrazu ...
jakieś pomysły?
źródło
Odpowiedzi:
Percepcyjne mieszań może być odpowiedź:
http://www.phash.org/
źródło
Nie porównuj RGB (czerwony, zielony, niebieski). Porównanie jasności jako połowa masy i porównanie barwy / barwę w drugiej połowie (lub 2 / 3rds vs 1/3). Obliczyć różnicę w zależności od wartości i wartości „Tolerancja” są takie same lub nie.
JPEG mocno ściska informacji o kolorze, ale nie stara się zniszczyć wartości liminance.
źródło
Kiedy kilka lat temu przeglądałem kilka zdjęć pod kątem duplikatów, stwierdziłem, że zmniejszenie wszystkiego do miniatur 8 x 8, a następnie obliczenie podobieństwa na podstawie kwadratu odległości (traktowanie trzech kolorów osobno) między miniaturami działało całkiem dobrze. Pamiętaj, że możesz przechowywać DUŻO miniatur 8x8.
Praktycznie wszystkie duplikaty zdobył poniżej niebędących powtórzeń, o problemach będących tylko niektóre obrazy, które były bardzo niski kontrast i ogólnie podobne, chociaż rzeczywista zawartość zróżnicowane (tło w każdym przypadku była piaszczysta plaża).
Było to również skuteczne w przechwytywaniu obrazów, które były duplikatami, z wyjątkiem tego, że ktoś zmniejszył rozdzielczość lub jakość jednego w celu zmniejszenia rozmiaru pliku.
źródło
Może powinieneś napisać kod, który skanuje obrazy na podobieństwo. Można przekonwertować wszystkie fotki w formacie ARGB i porównać je. (w pamięci)
Możliwym rozwiązaniem mogłoby być w ten sposób: Podzielić zdjęcia w strefach. Zeskanuj średni kolor i / lub jasność stref, aby porównać podobieństwo dwóch zdjęć.
Jeśli więcej niż powiedzą, 90% stref się zgadza, wybrałeś jedną, aby przejść do listy kandydatów do usunięcia. W ten sposób masz listę kandydatów. Możesz użyć współczynnika kształtu zdjęć, aby podzielić je na kategorie w poziomie i pionie, aby przyspieszyć porównania. w ten sposób można zrekompensować algorytmy stratne, które nie odtwarzają właściwych kolorów piksel po pikselu. Po uruchomieniu programu na noc, a rano trzeba to zrobić :) w .NET można to zrobić dość łatwo mu GDI + lib.
źródło