2015-06-17 19 views
6

myślę zajmie trochę wyjaśniając, więc proszę nosić ze mną ...Jak grupować obrazy według "zdjęć seryjnych?"

I schwytany 2000 + obrazy w sub-sekundowych seriach 4-6 naraz. Wszyscy zostali porzuceni w tym samym miejscu, więc muszę je posortować. Muszę je sortować według serii, ale dane EXIF ​​oferują tylko jednominutową rozdzielczość. Wybuchy powinny być prawie dokładnie tym samym, a różne wybuchy mają być znacząco różne.

Muszę przyjrzeć się każdemu obrazowi, porównać go z następnym i sprawdzić, czy jest podobny. Jeśli jest zbyt różny, musi pochodzić z innej serii, musi przejść do nowego folderu, wraz z dowolnym z poniższych obrazów, które są do niego podobne i tak dalej.

Moja myśl polega na dodaniu bezwzględnej wartości różnicy między każdym pikselem bieżącego obrazu, a następnym. Gdy suma ta osiągnie próg, musi to oznaczać, że pochodzą one z różnych serii (mogę wykonać pewne testy, aby ustalić, jaki jest dobry próg).

Największym problemem jest jak? Czy PIL/Pillow obsługuje coś takiego? Czy istnieje lepszy sposób sprawdzenia, czy jeden obraz jest "w większości" taki sam jak inny?

Jestem bardziej zainteresowany sortowaniem ich szybciej niż za pomocą jakiejś konkretnej techniki, więc inne podejścia są mile widziane.

... a to właściwie musi być Python.

EDIT: Oto parę przykładowych zdjęć, które powinny oboje w tym samym folderze: 001 002

Są dwa obrazy z poniższej serii, i powinny iść w innym folderze: 003 004

+0

Jaka jest rozdzielczość na znacznikach czasu w danych EXIF? O wiele prostszym sposobem może być identyfikacja zdjęć zrobionych jako seria w oparciu o niewielką różnicę w sygnaturach czasowych. Metoda podobieństwa wizualnego powinna osiągnąć podobny rezultat, nieprawdaż? Rozdzielczość czasu zależy od aparatu. – jozzas

+0

Porównanie datowników to za mało? Najprawdopodobniej najłatwiej byłoby sprawdzić, czy zdjęcia zostały zrobione w niewielkiej odległości od siebie, niż faktycznie porównać same zdjęcia. – erdekhayser

+0

Tak, ten konkretny aparat oferuje jedną rozdzielczość MINUTE :-(Masz rację, to byłaby o wiele lepsza opcja ...gdybym miał dane. – Matt

Odpowiedz

2

Niestety, okazuje się, że dane EXIF ​​były właściwą drogą. Wygląda na to, że pomiędzy seriami jest dobre 10-15 sekund, więc powinno być naprawdę łatwo powiedzieć, kiedy jeden się kończy, a drugi zaczyna.

PIL/Poduszka posiada wystarczające narzędzia do oglądania tej dacie utworzenia przy użyciu:

from PIL.ExifTags import TAGS 

def get_exif(fn): 
    ret = {} 
    i = Image.open(fn) 
    info = i._getexif() 
    for tag, value in info.items(): 
     decoded = TAGS.get(tag, tag) 
     ret[decoded] = value 
    return ret 

... lub coś w tym kierunku.

+1

Właściwie, według mojej analizy w mojej odpowiedzi, minimalny czas między seriami wynosi 5 sekund, a maksymalny czas to 10 sekund. Użycie progu 10 sekund spowoduje umieszczenie wszystkiego w tym samym folderze. – Sandman

3

Biblioteka OpenCV jest dobrym wyborem, jeśli chcesz dopasować treści w przeciwieństwie do sortowania opartego na sygnaturze czasowej sugerowanego przez dobrych ludzi powyżej. Sprawdź ten post na temat korzystania z biblioteki OpenCV dla różnych technik dopasowania podobieństwa obrazu: Checking images for similarity with OpenCV

Istnieje mnóstwo pytań SO na ten sam temat, więc czytanie przez nie da ci lepszy pomysł.

oparciu o ideę czasu powyżej, kiedy wykreślić tylko czasy, że zdjęcia zostały zrobione, jest to działka uzyskać:

Clusters

Różne kolory reprezentują różne foldery (powinien być stosowany inna mapa kolorów dla lepszej widoczności, ale no cóż ...).

Opierając się na tych czasach, wygląda na to, że czas między klastrami jest wyraźnie wyraźniejszy niż czas wewnątrz klastra.

ja również obliczony kilka wewnątrz- i między klastrami metryk w poniższej wyjścia:

folder: ImageBurstsDataset/001 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/002 
Total image files in folder: 7 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.142857142857 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/003 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/004 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/005 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/006 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/007 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/008 
Total image files in folder: 5 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.4 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/009 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/010 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 


Inter-cluster times: [10.0, 8.0, 7.0, 5.0, 6.0, 6.0, 5.0, 10.0, 6.0] 

Zastrzeżenie: Napisałem ten skrypt w pośpiechu, tylko trzeba wrócić i upewnić się, że wszystkie przypadki krawędziowe są poprawne. Ale inaczej...wniosek, że rysuję od zbioru danych, który wysłał to:

  1. ramach klastra, jeden obraz nigdy nie jest więcej niż 1 sekunda, niezależnie od poprzedniej.

  2. Pierwsze zdjęcie z następnego klastra oddalone jest o co najmniej 5 sekund od ostatniego obrazu z poprzedniego klastra.

+1

@ mHurley- Tutaj możesz: [kod] (https://github.com/sandeepklr/so-imageburst/blob/master /main.py) – Sandman

1

Jak podobne są dwa zdjęcia to otwarte pytanie badawcze. Jednak biorąc pod uwagę, że twoje zdjęcia zostały zrobione szybko, użycie różnic absolutnych jest uzasadnione. Inną możliwością jest użycie korelacji, np. Pomnożenie wartości pikseli i zaakceptowanie wyników powyżej progu.

Problemem będzie szybkość. W zależności od wymagań co do dokładności możesz dość znacząco pospapiać obrazy. Możliwe, że porównanie wartości 100 lub 1000 równomiernie rozmieszczonych pikseli - tych samych pikseli w każdym obrazie - dałoby statystykę wystarczająco dokładną dla twoich celów.

+0

Mnożenie jest opcją, której wcześniej nie rozważałem. Głównym pytaniem będzie, jak uzyskać te dane? Nie jestem dobry z niezliczonymi tablicami ... – Matt

+0

Hmmm. Wygląda na to, że twoje obrazy z różnych serii są wciąż bardzo podobne. Możesz pomyśleć o czymś w rodzaju maksymalnej różnicy. Jednak, aby metoda była mniej wrażliwa na hałas, można histogramować różnice i zadeklarować różnicę, gdy pewien procent (np. 10-20%) pikseli w próbce różni się o więcej niż próg. – Darrell

1

PIL może podawać dane RGB obrazu, które teoretycznie można wykorzystać do porównania obrazów. Aby zmierzyć, jak blisko są dwa obrazy, prawdopodobnie trzeba obliczyć różnicę dwóch obrazów lub jeszcze więcej błędów przy obliczaniu metod statystycznych. Można uzyskać dane RGB używając

import Image 
pic = Image.open('/path/to/file') 
rgbdata = pic.load() 
width, height = pic.size 

można przeglądać dane wyłącznie w kategoriach wartości RGB ijth piksela w rgbdata [i, j].

Mam nadzieję, że to pomoże.

[edycja] Ta metoda działa tylko przy założeniu, że wszystkie zdjęcia są robione w tej samej klatce ... Jeśli kamera się trochę przesunie, to nie zadziała.

Jeśli pochodzą od kamery na statywie (nieruchomy) i obiekty się poruszają, możemy nawet prześledzić ruch obiektu (gdzie różnica wartości w pikselach jest większa).

Albo trzeba zdefiniować punkty śledzenia jako wykonane w aplikacjach rozpoznawania twarzy. (Nie jestem ekspertem od przetwarzania obrazu, ale widziałem kilka aplikacji, które działają w ten sposób)

Innym sposobem porównywania dwóch obrazów jest domena Fouriera. Ale nie wiem, jak dobrze by to dla ciebie działało.

+0

Próbowałem wczytać pierwsze dwa obrazy i wydrukować dane pikseli. Istnieją dosłownie tysiące punktów danych. Musi istnieć kilka lepszych metod rozwiązania tego problemu, niż przeprowadzenie analizy różnicy siłowej. –

+0

LOL !!!! Tak, to są ogromne obrazy. Miałem nadzieję, że w przypadku obrazów, które nie mają większego podobieństwa, szybko uderzę w próg i przerwę, ale w przypadku obrazów bardzo podobnych, różnica abs będzie znacznie mniejsza. Może nie ... – Matt

+0

Ale określenie "progu" jest kluczem ... nie możemy po prostu wybrać jakiejś liczby losowej! –

Powiązane problemy