Zastanawiałem się, czy istnieje sposób, aby ustalić, czy obraz jest rozmyty, czy nie, analizując dane obrazu.
203
Zastanawiałem się, czy istnieje sposób, aby ustalić, czy obraz jest rozmyty, czy nie, analizując dane obrazu.
Odpowiedzi:
Tak to jest. Oblicz szybką transformatę Fouriera i przeanalizuj wynik. Transformacja Fouriera informuje, jakie częstotliwości występują na obrazie. Jeśli występuje duża liczba wysokich częstotliwości, wówczas obraz jest rozmazany.
Zdefiniowanie terminów „niski” i „wysoki” zależy od Ciebie.
Edytuj :
Jak stwierdzono w komentarzach, jeśli chcesz pojedynczego elementu zmiennoprzecinkowego reprezentującego rozmycie danego obrazu, musisz opracować odpowiednią metrykę.
Odpowiedź nikie dostarcza takiej miary. Przekształć obraz w jądro Laplaciana:
I użyj solidnej maksymalnej metryki na wyjściu, aby uzyskać liczbę, której możesz użyć do progowania. Staraj się unikać nadmiernego wygładzania obrazów przed obliczeniem Laplaciana, ponieważ dowiesz się tylko, że wygładzony obraz jest rzeczywiście rozmazany :-).
źródło
Innym bardzo prostym sposobem oszacowania ostrości obrazu jest użycie filtra Laplace'a (lub LoG) i po prostu wybranie maksymalnej wartości. Zastosowanie solidnej miary, takiej jak kwantyl 99,9%, jest prawdopodobnie lepsze, jeśli spodziewasz się szumu (tj. Wybranie N-tego najwyższego kontrastu zamiast najwyższego kontrastu.) Jeśli spodziewasz się różnej jasności obrazu, powinieneś również dołączyć etap wstępnego przetwarzania w celu normalizacji jasności obrazu / kontrast (np. wyrównanie histogramu).
Zaimplementowałem sugestię Simona i tę w Mathematica i wypróbowałem ją na kilku obrazach testowych:
Pierwszy test rozmywa obrazy testowe przy użyciu filtra Gaussa o różnej wielkości jądra, a następnie oblicza FFT zamazanego obrazu i przyjmuje średnią z 90% najwyższych częstotliwości:
Wynik w logarytmicznym wykresie:
5 linii reprezentuje 5 obrazów testowych, oś X reprezentuje promień filtra Gaussa. Wykresy maleją, więc FFT jest dobrym miernikiem ostrości.
Oto kod estymatora rozmycia „najwyższego LoG”: Po prostu stosuje filtr LoG i zwraca najjaśniejszy piksel w wyniku filtru:
Wynik w logarytmicznym wykresie:
Rozpiętość dla niewyraźnych obrazów jest tutaj nieco lepsza (2,5 vs 3,3), głównie dlatego, że ta metoda wykorzystuje tylko najsilniejszy kontrast na obrazie, podczas gdy FFT jest zasadniczo wartością średnią dla całego obrazu. Funkcje również maleją szybciej, dlatego łatwiej ustawić próg „rozmycia”.
źródło
Podczas pracy z obiektywem z automatyczną regulacją ostrości natknąłem się na bardzo przydatny zestaw algorytmów do wykrywania ostrości obrazu . Jest zaimplementowany w MATLAB, ale większość funkcji jest dość łatwa do przeniesienia do OpenCV za pomocą filter2D .
Jest to w zasadzie implementacja ankietowa wielu algorytmów pomiaru ostrości. Jeśli chcesz przeczytać oryginalne artykuły, w kodzie znajdują się odniesienia do autorów algorytmów. Artykuł z 2012 r. Autorstwa Pertuza i in. Analiza operatorów miary ostrości dla kształtu z ogniska (SFF) daje świetny przegląd wszystkich tych miar, a także ich wydajności (zarówno pod względem szybkości, jak i dokładności w odniesieniu do SFF).
EDYCJA: Dodano kod MATLAB na wypadek śmierci łącza.
Kilka przykładów wersji OpenCV:
Nie ma gwarancji, czy te środki są najlepszym wyborem dla twojego problemu, ale jeśli wyśledzisz dokumenty związane z tymi środkami, mogą dać ci więcej wglądu. Mam nadzieję, że kod Ci się przyda! Wiem, że tak.
źródło
Opierając się na odpowiedzi Nike. Zaimplementowanie metody opartej na laplacianach przy pomocy opencv jest proste:
Zwróci krótki wskazujący maksymalną wykrytą ostrość, która w oparciu o moje testy na próbkach ze świata rzeczywistego jest całkiem dobrym wskaźnikiem tego, czy aparat jest ostry, czy nie. Nic dziwnego, że normalne wartości są zależne od sceny, ale znacznie mniej niż metoda FFT, która musi być zbyt wysoka na poziomie fałszywie dodatnim, aby była użyteczna w mojej aplikacji.
źródło
Wymyśliłem zupełnie inne rozwiązanie. Musiałem przeanalizować nieruchome klatki wideo, aby znaleźć najostrzejszą z każdej (X) klatki. W ten sposób wykryłbym rozmycie ruchu i / lub nieostre obrazy.
Skończyło się na wykrywaniu Canny Edge i uzyskałem BARDZO dobre wyniki z prawie każdym rodzajem wideo (metodą Nikie miałem problemy ze zdigitalizowanymi filmami VHS i ciężkimi filmami z przeplotem).
Zoptymalizowałem wydajność, ustawiając obszar zainteresowania (ROI) na oryginalnym obrazie.
Za pomocą EmguCV:
źródło
Dzięki nikie za wspaniałą sugestię Laplace'a. Dokumenty OpenCV skierowały mnie w tym samym kierunku: używając Pythona, CV2 (OpenCv 2.4.10) i Numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
wynik jest między 0-255. Odkryłem, że wszystko powyżej 200ish jest bardzo ostre, a po 100 jest wyraźnie rozmyte. maksimum nigdy nie osiąga dużo poniżej 20, nawet jeśli jest całkowicie rozmyte.
źródło
Jeden ze sposobów, którego obecnie używam, mierzy rozkład krawędzi na obrazie. Poszukaj tego papieru:
Zwykle jest za zaporą, ale widziałem kilka darmowych kopii. Zasadniczo lokalizują pionowe krawędzie obrazu, a następnie mierzą szerokość tych krawędzi. Uśrednienie szerokości daje końcowy wynik oceny rozmycia obrazu. Szersze krawędzie odpowiadają rozmytym obrazom i odwrotnie.
Ten problem należy do dziedziny oceny jakości obrazu bez odniesienia . Jeśli spojrzysz na to w Google Scholar, otrzymasz mnóstwo przydatnych referencji.
EDYTOWAĆ
Oto wykres oszacowań rozmycia uzyskanych dla 5 zdjęć w poście nikie. Wyższe wartości odpowiadają większemu rozmyciu. Użyłem filtru Gaussa 11 x 11 o stałym rozmiarze i zmieniłem standardowe odchylenie (używając
convert
polecenia imagemagick do uzyskania rozmytych obrazów).Jeśli porównujesz obrazy o różnych rozmiarach, nie zapomnij o normalizacji według szerokości obrazu, ponieważ większe obrazy będą miały szersze krawędzie.
Wreszcie znaczącym problemem jest rozróżnienie między rozmyciem artystycznym a niepożądanym rozmyciem (spowodowanym brakiem ostrości, kompresją, względnym ruchem obiektu do aparatu), ale wykracza to poza proste podejścia, takie jak ten. Na przykład artystyczne rozmycie, spójrz na obraz Lenny: odbicie Lenny w lustrze jest rozmyte, ale jej twarz jest idealnie skupiona. Przyczynia się to do większego oszacowania rozmycia obrazu Lenna.
źródło
Wypróbowałem rozwiązanie oparte na filtrze Laplaciana z tego postu. To mi nie pomogło. Więc wypróbowałem rozwiązanie z tego postu i było dobre dla mojej sprawy (ale jest powolne):
Mniej zamazany obraz ma maksymalną
sum
wartość!Możesz także dostroić prędkość i dokładność, zmieniając krok, np
ta część
możesz zastąpić tym
źródło
Powyższe odpowiedzi wyjaśniły wiele rzeczy, ale myślę, że użyteczne jest rozróżnienie pojęciowe.
Co zrobić, jeśli zrobisz idealnie rozogniskowane zdjęcie zamazanego obrazu?
Problem wykrywania rozmycia jest dobrze postawiony tylko wtedy, gdy masz referencję . Jeśli potrzebujesz zaprojektować np. System automatycznego ustawiania ostrości, porównujesz sekwencję zdjęć wykonanych przy różnym stopniu rozmycia lub wygładzenia i próbujesz znaleźć punkt minimalnego rozmycia w tym zestawie. Innymi słowy, musisz odnieść się do różnych obrazów przy użyciu jednej z technik zilustrowanych powyżej (w zasadzie - z różnymi możliwymi poziomami udoskonalenia w podejściu - szukając jednego obrazu o najwyższej zawartości wysokiej częstotliwości).
źródło
Kod Matlaba dwóch metod opublikowanych w bardzo cenionych czasopismach (Transakcje IEEE dotyczące przetwarzania obrazu) jest dostępny tutaj: https://ivulab.asu.edu/software
sprawdź algorytmy CPBDM i JNBM. Jeśli sprawdzisz kod, przeniesienie go nie będzie trudne, a przy okazji bazuje na metodzie Marzialiano jako podstawowej funkcji.
źródło
zaimplementowałem to użyj fft w Matlabie i sprawdź histogram średniej obliczeniowej FFT i STD, ale można również wykonać funkcję dopasowania
źródło
Tak robię w Opencv, aby wykryć jakość ogniskowania w regionie:
źródło