OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Adaptacyjne progowanie OpenCV w Pythonie z cv2.adaptiveThreshold()

Wprowadzenie

Progowanie to prosta i wydajna technika wykonywania podstawowej segmentacji obrazu i jego binaryzacji (przekształcenia go w obraz binarny), gdzie piksele są albo 0 or 1 (lub 255 jeśli używasz liczb całkowitych do ich reprezentowania).

Zazwyczaj możesz użyć progowania, aby wykonać prostą segmentację tła i pierwszego planu na obrazie, a sprowadza się to do wariantów prostej techniki dla każdego piksela:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Proste progowanie ma rażące problemy i wymaga dość nieskazitelnych danych wejściowych, co sprawia, że ​​nie jest tak praktyczne w wielu przypadkach użycia. Głównym sprawcą jest globalny próg, który jest stosowany do całego obrazu, podczas gdy obrazy rzadko są wystarczająco jednolite, aby zadziałały ogólne progi, chyba że są sztuczne.

Ogólny próg sprawdziłby się dobrze przy oddzielaniu znaków w czarno-białej książce na zeskanowanych stronach. Globalny próg najprawdopodobniej zawiedzie na zdjęciu telefonu tej samej strony, ponieważ warunki oświetlenia mogą się zmieniać w różnych częściach strony, przez co globalny punkt odcięcia jest zbyt wrażliwy na rzeczywiste dane.

Do walki z tym – możemy zatrudnić miejscowy progi, przy użyciu techniki znanej jako progowanie adaptacyjne. Zamiast traktować wszystkie części obrazu tą samą regułą, możemy zmienić próg dla każdej z nich Obszar lokalny to wydaje się do tego pasować. To sprawia, że ​​progowanie jest częściowo niezmienne w stosunku do zmian oświetlenia, hałasu i innych czynników. Chociaż progowanie jest o wiele bardziej przydatne niż globalne progowanie, samo progowanie jest ograniczoną, sztywną techniką i najlepiej nadaje się do pomocy przy wstępnym przetwarzaniu obrazu (szczególnie jeśli chodzi o identyfikację obrazów do odrzucenia), a nie segmentacji.

W przypadku bardziej delikatnych aplikacji, które wymagają kontekstu, lepiej jest zastosować bardziej zaawansowane techniki, w tym głębokie uczenie, które napędza ostatnie postępy w zakresie widzenia komputerowego.

Adaptacyjne określanie progów z OpenCV

Załadujmy obraz o zmiennych warunkach oświetleniowych, gdzie jedna część obrazu jest bardziej zogniskowana niż inna, a zdjęcie jest robione pod kątem. Zdjęcie, które zrobiłem Haroldowi McGee „O jedzeniu i gotowaniu” będzie świetnie służyć!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Teraz, używając zwykłego progowania, możemy spróbować oddzielić litery od tła, ponieważ jest między nimi wyraźna różnica kolorów. Wszystkie kolory papieru będą traktowane jako tło. Ponieważ tak naprawdę nie wiemy, jaki powinien być próg – zastosujmy metodę Otsu, aby znaleźć dobrą wartość, przewidując, że obraz jest nieco bimodalny (przeważnie zdominowany przez dwa kolory):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

Rzućmy okiem na wynik:

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Auć. Lewa część tekstu jest głównie wyblakła, cień wokół rynny całkowicie zjadł część obrazu, a tekst jest zbyt nasycony! Jest to obraz „na wolności”, a ogólne zasady, takie jak globalne progi, nie działają dobrze. Jaki powinien być próg? To zależy od części obrazu!

Połączenia cv2.adaptiveThreshold() metoda pozwala nam zrobić dokładnie to:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

Połączenia adaptive_method może być cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Gdzie C jest ostatnim ustawionym argumentem. Obie te metody obliczają próg zgodnie z sąsiadami danego piksela, gdzie block_size dyktuje liczbę sąsiadów, których należy wziąć pod uwagę (powierzchnia sąsiedztwa).

ADAPTIVE_THRESH_MEAN_C bierze średnią sąsiadów i potrąca C, podczas ADAPTIVE_THRESH_GAUSSIAN_C bierze ważoną gaussowo sumę sąsiadów i odlicza C.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Pozwala również na ustalenie strategii binaryzacji, ale ogranicza się do: THRESH_BINARY i THRESH_BINARY_INV, a przełączanie się między nimi skutecznie zmieni to, co jest „tłem” i tym, co jest „pierwszym planem”.

Metoda zwraca tylko maskę obrazu – nie kod powrotu i maskę. Spróbujmy podzielić postacie na tym samym obrazie, co poprzednio, używając progowania adaptacyjnego:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Daje to znacznie wyraźniejszy obraz:

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Uwaga: Połączenia block_size argument musi być liczbą nieparzystą.

W podobny sposób możemy zastosować progowanie gaussowskie:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Co również daje w końcu całkiem satysfakcjonujący obraz:

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Zarówno rozmiar bloku (obszar sąsiedni), jak i C są hiperparametry do dostrojenia tutaj. Wypróbuj różne wartości i wybierz tę, która najlepiej pasuje do Twojego obrazu. Ogólnie rzecz biorąc, próg gaussowski jest mniej czuły na szum i da nieco ciemniejszy, czystszy obraz, ale to się różni i zależy od danych wejściowych.

Ograniczenia adaptacyjnego progowania

Dzięki adaptacyjnemu progowaniu udało nam się uniknąć nadrzędnego ograniczenia progowania, ale nadal jest ono stosunkowo sztywne i nie działa dobrze w przypadku kolorowych wejść. Na przykład, jeśli załadujemy obraz nożyczek i mały zestaw z różnymi kolorami, nawet progowanie adaptacyjne będzie miało problemy z prawidłowym segmentowaniem go, z zaznaczonymi pewnymi ciemnymi cechami, ale bez uwzględniania całych obiektów:

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Jeśli zmienimy rozmiar bloku i C, możemy sprawić, że większe łatki będą uważane za część tego samego obiektu, ale potem pojawią się problemy z określeniem rozmiarów sąsiednich zbyt globalny, powracając do tych samych nadrzędnych problemów z globalnym progowaniem:

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wnioski

W ostatnich latach segmentacja binarna (tak jak to zrobiliśmy tutaj) i segmentacja wieloetykietowa (gdzie można zakodować dowolną liczbę klas) z powodzeniem modelowano za pomocą sieci głębokiego uczenia, które są znacznie bardziej wydajne i elastyczne. Ponadto mogą kodować kontekst globalny i lokalny w obrazach, które segmentują. Minusem jest to, że do ich szkolenia potrzebne są dane, a także czas i doświadczenie.

Aby uzyskać proste progowanie w locie, możesz użyć OpenCV i walczyć z niektórymi ograniczeniami za pomocą progowania adaptacyjnego, a nie globalnych strategii progowania. Do dokładnej segmentacji na poziomie produkcyjnym warto użyć sieci neuronowych.

Idąc dalej – praktyczne uczenie głębokie dla wizji komputerowej

Twoja dociekliwość sprawia, że ​​chcesz iść dalej? Zalecamy sprawdzenie naszego Kurs: „Praktyczne uczenie głębokie dla widzenia komputerowego z Pythonem”.

OpenCV Adaptive Thresholding w Pythonie z cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Kolejny kurs na temat wizji komputerowej?

Nie będziemy robić klasyfikacji cyfr MNIST ani mody MNIST. Swoją rolę pełnili dawno temu. Zbyt wiele zasobów edukacyjnych koncentruje się na podstawowych zestawach danych i podstawowych architekturach, zanim zaawansowane architektury czarnoskrzynkowe poniosą ciężar wydajności.

Chcemy się skupić demistyfikacja, praktyczność, zrozumienie, intuicja i realne projekty. Chcieć się nauczyć w jaki sposób możesz zrobić różnicę? Zabierzemy Cię na przejażdżkę od sposobu, w jaki nasze mózgi przetwarzają obrazy, przez pisanie klasyfikatora głębokiego uczenia się na poziomie badań naukowych w zakresie raka piersi, do sieci głębokiego uczenia się, które „halucynują”, ucząc Cię zasad i teorii poprzez praktyczną pracę, wyposażając Cię w know-how i narzędzia, aby stać się ekspertem w stosowaniu uczenia głębokiego do rozwiązywania wizji komputerowych.

Co jest w środku?

  • Pierwsze zasady widzenia i jak nauczyć komputery „widzieć”
  • Różne zadania i zastosowania wizji komputerowej
  • Narzędzia handlu, które ułatwią Ci pracę
  • Znajdowanie, tworzenie i wykorzystywanie zbiorów danych do wizji komputerowej
  • Teoria i zastosowanie splotowych sieci neuronowych
  • Obsługa zmiany domeny, współwystępowania i innych błędów w zbiorach danych
  • Transfer uczenia się i wykorzystanie czasu szkolenia innych i zasobów obliczeniowych dla Twojej korzyści
  • Budowanie i szkolenie najnowocześniejszego klasyfikatora raka piersi
  • Jak zastosować zdrową dawkę sceptycyzmu do głównych idei i zrozumieć konsekwencje powszechnie stosowanych technik?
  • Wizualizacja „przestrzeni koncepcyjnej” ConvNet za pomocą t-SNE i PCA
  • Studia przypadków, w jaki sposób firmy wykorzystują techniki widzenia komputerowego do osiągania lepszych wyników
  • Właściwa ocena modelu, wizualizacja przestrzeni utajonej i identyfikacja uwagi modelu
  • Wykonywanie badań domenowych, przetwarzanie własnych zbiorów danych i tworzenie testów modelowych
  • Najnowocześniejsze architektury, progresja pomysłów, co czyni je wyjątkowymi i jak je wdrażać
  • KerasCV – biblioteka WIP do tworzenia najnowocześniejszych rurociągów i modeli
  • Jak analizować i czytać artykuły i samodzielnie je wdrażać
  • Wybór modeli w zależności od aplikacji
  • Tworzenie kompleksowego procesu uczenia maszynowego
  • Krajobraz i intuicja w wykrywaniu obiektów za pomocą szybszych sieci R-CNN, sieci RetinaNet, dysków SSD i YOLO
  • Segmentacja instancyjna i semantyczna
  • Rozpoznawanie obiektów w czasie rzeczywistym za pomocą YOLOv5
  • Szkolenie wykrywaczy obiektów YOLOv5
  • Praca z transformatorami przy użyciu KerasNLP (biblioteka przemysłowa WIP)
  • Integracja Transformers z ConvNets w celu generowania podpisów obrazów
  • DeepDream
  • Optymalizacja modelu Deep Learning dla wizji komputerowej

Znak czasu:

Więcej z Nadużycie stosu