2010-08-16 16 views
14

Chciałbym poradzić sobie z prostą analizą obrazu w Pythonie. Muszę obliczyć wartość "jasności" obrazu. Wiem, że PIL jest biblioteką goto do robienia czegoś takiego. Jest wbudowana funkcja histogramu.Jakie są metody analizy jasności obrazu za pomocą języka Python?

Potrzebuję wartości "perceived brightness" Mogę zdecydować, czy konieczne są dalsze korekty obrazu. Więc jakie są podstawowe techniki, które będą działać w tej sytuacji? Czy powinienem po prostu pracować z wartościami RGB, czy histogram da mi wystarczająco blisko?

Jednym z możliwych rozwiązań może być połączenie tych dwóch wartości i wygenerowanie średnich wartości R, G i B za pomocą histogramu, a następnie zastosowanie formuły "postrzegana jasność".

+0

Co uniemożliwia wdrożenie algorytmu, z którym łączyłeś się w Pythonie z PIL? Pytasz o alternatywny algorytm, o tym, jak korzystać z PIL, czy co? –

+0

Chcę się tylko upewnić, że nie brakuje mi jakiegoś oczywistego elementu/modułu, który już to robi. Wygląda na to, że tego typu rzeczy już powinny istnieć. – cmcginty

+0

Wykreślenie postrzeganej jasności na obrazie * różni się radykalnie od znalezienia prostego koloru. Widz może bardziej interesować się jasnością obiektu, ale zazwyczaj jest więcej pikseli tła niż pikseli obiektu. –

Odpowiedz

30

Korzystając z technik wymienionych w pytaniu, wymyśliłem kilka różnych wersji.

Każda metoda zwraca wartość bliską, ale nie identyczną jak pozostałe. Ponadto wszystkie metody działają z tą samą prędkością, z wyjątkiem ostatniej, która jest znacznie wolniejsza w zależności od rozmiaru obrazu.

  1. Konwersja obrazu do skali szarości, powrót do średniej jasności pikseli.

    def brightness(im_file): 
        im = Image.open(im_file).convert('L') 
        stat = ImageStat.Stat(im) 
        return stat.mean[0] 
    
  2. Konwertuj obraz na odcienie szarości, zwracaj jasność RMS pikseli.

    def brightness(im_file): 
        im = Image.open(im_file).convert('L') 
        stat = ImageStat.Stat(im) 
        return stat.rms[0] 
    
  3. Średnia pikseli, a następnie przekształcana na "postrzeganą jasność".

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        r,g,b = stat.mean 
        return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
    
  4. RMS pikseli, a następnie przekształcenie w "postrzeganą jasność".

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        r,g,b = stat.rms 
        return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
    
  5. Oblicz "postrzeganą jasność" pikseli, a następnie zwróć średnią.

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        gs = (math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
         for r,g,b in im.getdata()) 
        return sum(gs)/stat.count[0] 
    

testu Aktualizacja Wyniki Pobiegłem symulacji przed 200 obrazów. Odkryłem, że metody # 2, # 4 dały prawie identyczne wyniki. Również metody # 3, # 5 były prawie identyczne. Metoda nr 1 ściśle przestrzegała # 3, # 5 (z kilkoma wyjątkami).

+1

Wystarczy, aby wypowiedzieć się na temat szybkości: W moich testach, biorąc je tak jak są, metody # 2, # 3 i # 4 były prawie równomiernie szybkie (wykonanie ~ 140ms w celu przetworzenia 20 obrazów o różnych rozmiarach), metoda nr 1 była tylko nieznacznie wolniejsza (~ 180 ms), a metoda nr 5 jest bardzo powolna (~ 3505ms). Można się spodziewać, ale raczej należy trzymać się # 3, jeśli wybierzesz między # 1, # 3 i # 5. –

2

Biorąc pod uwagę, że szukasz tylko średniej na całym obrazie, a nie wartości jasności na piksel, uśrednianie histogramu PIL i zastosowanie funkcji jasności do wydruku wydaje się najlepszym podejściem do tej biblioteki.

przypadku korzystania ImageMagick (z PythonMagick wiązań), chciałbym zaproponować za pomocą komendy identify z „gadatliwym” zestawu opcji. Pozwoli to uzyskać średnią wartość dla każdego kanału, oszczędzając potrzebę sumowania i uśredniania histogramu. Można wtedy pomnożyć każdy kanał bezpośrednio.

+1

Jako osoba próbująca zachować PythonMagick i dostarczoną wersję 0.9.1, nie polecałbym jej używać w obecnym stanie. Ostatnie zmiany w ImageMagick złamały wiele kodu PythonMagick. Oryginalny autor pakietu wymyślił kolejne wiązania Pythona dla ImageMagick, http://public.procoders.net/PythonMagickWand/docs/html/index.html, jest to preferowane w porównaniu z obecnym PythonMagick –

1

Myślę, że najlepszy wynik będzie pochodzić z konwersji RGB do skali szarości za pomocą ulubionej formuły, a następnie biorąc histogram tego wyniku. Nie jestem pewien, czy średnia lub mediana histogramu byłaby bardziej odpowiednia, ale na większości obrazów są prawdopodobnie podobne.

Nie jestem pewien, jak wykonać konwersję do skali szarości w pliku PIL za pomocą dowolnej formuły, ale domyślam się, że jest to możliwe.

+0

Brzmi jak dobry pomysł. Spróbuję też. – cmcginty

Powiązane problemy