2009-11-10 14 views
5

Załóżmy, że w galerii znajduje się 10 000 obrazów JPEG, PNG, jak znaleźć wszystkie obrazy z podobnymi paletami kolorów na wybranym obrazie posortowane według malejącego podobieństwa?Znajdź obrazy z podobną paletą kolorów za pomocą Pythona

+2

Możliwy duplikat: http://stackoverflow.com/questions/593925/how-do-i-find-images-with-a -similar-color-using-python-and-pil – ChristopheD

+0

Tak, ale nie ma dobrych odpowiedzi na to pytanie. :-) –

+0

Istnieje wiele podobnych dyskusji tutaj: http://stackoverflow.com/questions/1034900/near-duplicate-image-detection/1048723#1048723 – Paul

Odpowiedz

10

Utwórz histogram kolorów dla każdego obrazu. Następnie, gdy chcesz dopasować obraz do kolekcji, po prostu uporządkuj listę, jak blisko histogram jest do histogramu wybranego obrazu.

Liczba wiaderek zależy od tego, jak dokładnie chcesz być. Typ danych połączonych w celu utworzenia segmentu definiuje sposób ustalania priorytetów wyszukiwania.

Na przykład, jeśli jesteś najbardziej zainteresowany w Hue, to można określić, które wiadro swój każdy pojedynczy piksel obrazu idzie w jak:

def bucket_from_pixel(r, g, b): 
    hue = hue_from_rgb(r, g, b) # [0, 360) 
    return (hue * NUM_BUCKETS)/360 

Jeśli chcesz także ogólny mechanizm dopasowywania, to można wybierz wiadro w oparciu o pełną wartość RGB.

Korzystając z PIL, można użyć wbudowanej funkcji histogram. Histogramy "bliskości" można obliczyć za pomocą dowolnej miary odległości. Na przykład, odległość L1 może być:

hist_sel = normalize(sel.histogram()) 
hist = normalize(o.histogram()) # These normalized histograms should be stored 

dist = sum([abs(x) for x in (hist_sel - hist)]) 

L2 będzie:

dist = sqrt(sum([x*x for x in (hist_sel - hist)])) 

Normalize tylko zmusza sumę histogramu równa jakąś stałą wartość (1,0 działa poprawnie). Jest to ważne, aby duże obrazy można było poprawnie porównać z małymi obrazami. Jeśli zamierzasz używać odległości L1, powinieneś użyć miary L1 w normalize. Jeśli L2, to L2.

+0

@Frank, dziękuję za poradę. Czy możesz podać mi przykładowy kod w Pythonie? Wbudowana funkcja histogramu() PIL zwraca listę, jak określić, jak blisko są dwa histogramy obrazów? – jack

+0

@Frank, wygląda na to, że wymaga 10 000 obliczeń odległości podczas wybierania zdjęć o podobnym histogramie na 10 000 kandydatów? czy możliwe jest powiązanie wartości numerycznych z każdym obrazem i zapisanie ich w bazie danych, więc porównanie można uprościć do niektórych zapytań sql? – jack

+0

@jack, 10,000 calcs nie jest tak drogie. Najlepszym sposobem na przyspieszenie kodu nie jest redukcja histogramów do liczb całkowitych (co nie może być wykonane tak, jak myślisz), ale po prostu ** buforowanie ** wyników. Buforuj kolejność sortowania (na obraz) w bazie danych lub buforuj ją w pamięci. Upewnij się, że przechowujesz histogram w bazie danych lub w pamięci, aby przebudowywanie pamięci podręcznej sortowania nie było drogie. –

Powiązane problemy