Skip to content

Archives

  • styczeń 2022
  • grudzień 2021
  • listopad 2021
  • październik 2021
  • wrzesień 2021

Categories

  • Brak kategorii
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On 4 stycznia, 2022 by admin
  • Co to jest progowanie obrazu?
  • Przykłady progowania: C++ i Python
  • Obraz wejściowy
  • Progowanie binarne ( type = THRESH_BINARY )
  • Odwrócone progowanie binarne ( type = THRESH_BINARY_INV )
  • Progowanie przycinające ( type = THRESH_TRUNC )
  • Progowanie do zera ( type = THRESH_TOZERO )
  • Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
  • Pobierz kod i przykładowy obraz

Co to jest progowanie obrazu?

Przyglądaj się uważnie poniższej animacji (Rysunek 1). Jak wiele liczb widzisz? Większość z Was zobaczy liczby: 32 (o tak, patrz uważnie), 64, 100, 128, 180, 200 i 255. Ale w obrazie jest więcej niż to, co widać na pierwszy rzut oka.

Za chwilę możesz zobaczyć progowaną wersję oryginalnego obrazu. Zauważysz, że wszystkie liczby wyglądają na całkowicie białe (tzn. mają wartość 255 w skali szarości) i jest dodatkowa liczba 5. Nie zauważyłeś liczby 5 w oryginalnym obrazie, ponieważ jej wartość w skali szarości wynosiła, no cóż, 5. W rzeczywistości wszystkie liczby w oryginalnym obrazie mają wartość skali szarości równą liczbie. Dlatego 255 jest najjaśniejszy i 5 jest najciemniejszy.

Czytanie liczb w progowanym obrazie jest o wiele łatwiejsze niż czytanie liczb w oryginalnym obrazie. Nie dziwi więc fakt, że algorytm rozpoznający tekst znajdzie progowany obraz w naszym przykładzie znacznie łatwiejszym do przetworzenia niż obraz oryginalny.

Ten post został przetestowany na OpenCV 4.4.

W wizji komputerowej, gdy ułatwiasz zadanie człowiekowi, zazwyczaj ułatwiasz je również algorytmom komputerowym.

Wszystkie algorytmy progowania przyjmują obraz źródłowy (src) i wartość progową (thresh) jako dane wejściowe i wytwarzają obraz wyjściowy (dst) przez porównanie wartości pikseli w pikselu źródłowym ( x , y ) do progu. Jeśli src ( x , y ) > thresh , to dst ( x , y ) jest przypisywana pewna wartość. W przeciwnym razie dst ( x , y ) przypisywana jest jakaś inna wartość.

Najprostsza forma progowania nazywana jest progowaniem binarnym (Binary Thresholding). Oprócz obrazu źródłowego (src) i wartości progowej (thresh) przyjmuje ona jeszcze jeden parametr wejściowy zwany wartością maksymalną ( maxValue ). W każdym miejscu piksela (x,y) porównuje wartość piksela src ( x , y ) z wartością thresh. Jeśli src ( x , y ) jest większa niż thresh, ustawia wartość piksela obrazu docelowego dst ( x , y ) na maxValue. W przeciwnym razie ustawia ją na zero. Oto, jak wygląda pseudokod.

# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Więcej ogólnie, istnieje wiele rodzajów progowania opartych na różnych regułach progowania stosowanych do src ( x , y ), aby uzyskać dst ( x , y ). Przyjrzyjmy się różnym typom progowania dostępnym w OpenCV.

Przykłady progowania: C++ i Python

Jeśli się spieszysz, przeskocz do sekcji pobierania, aby uzyskać kod i przykładowy obraz.

Obraz wejściowy

W poniższych przykładach użyjemy tego obrazu jako obrazu wejściowego. Kliknij na rysunek 2, aby pobrać obraz w formacie PNG. Obrazek wejściowy zawiera liczby zapisane z intensywnością (wartością w skali szarości) równą samej liczbie. Np. wartość piksela liczby 200 wynosi 200, a wartość piksela liczby 32 wynosi 32. Dlatego liczba 32 jest znacznie ciemniejsza niż liczba 200 na obrazie.

Rysunek 2: Obraz wejściowy. Kliknij, aby otworzyć obraz PNG w wysokiej rozdzielczości w innym oknie

W każdym przykładzie wyjaśnimy zasadę progowania za pomocą pseudokodu, podamy przykład w C++ i Pythonie oraz progowany obraz wyjściowy.

Progowanie binarne ( type = THRESH_BINARY )

Jest to najbardziej powszechny i najprostszy typ progowania.

Reguła progowania

# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Python

# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

C++

using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);

Wynik progowania binarnego

Rysunek 3 pokazuje wynik zastosowania progowania binarnego do obrazu wejściowego z thresh = 0 i maxValue = 255.

Figura 3 : Próg binarny ( thresh = 0 i maxValue = 255)

Zmiana wartości thresh na 127 usuwa wszystkie liczby mniejsze lub równe 127.

Figure 4 : Binary Threshold ( thresh = 127 and maxValue = 255)

Zmiana maxValue na 128 ustawia wartość progowanych regionów na 128.

Rysunek 5: Próg binarny z maxValue ustawioną na 128

Odwrócone progowanie binarne ( type = THRESH_BINARY_INV )

Odwrócone progowanie binarne jest przeciwieństwem progowania binarnego. Piksel docelowy jest ustawiony na zero, jeśli odpowiadający mu piksel źródłowy jest większy niż próg, i na maxValue, jeśli piksel źródłowy jest mniejszy niż próg.

Reguła progowania

# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);

Wynik odwrotnego progowania binarnego

Zauważ, że wynik odwrotnego progowania binarnego pokazany na rysunku 6 jest dokładnie odwrotnością rysunku 4.

Rysunek 6 : Odwrotne progowanie binarne ( thresh = 127, maxValue = 0 )

Progowanie przycinające ( type = THRESH_TRUNC )

W tym typie progowania piksel docelowy jest ustawiany na wartość progową ( thresh ), jeśli wartość piksela źródłowego jest większa niż wartość progowa. W przeciwnym razie jest on ustawiany na wartość piksela źródłowego. maxValue jest ignorowana.

Reguła progowania

# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)

C++

threshold(src,dst, thresh, maxValue, THRESH_TRUNC);

Wynik progowania przyciętego

Rysunek 7 pokazuje wynik zastosowania progowania przyciętego do obrazu wejściowego. Zauważ, że wszystkie wartości powyżej progu ( 127 ) są ustawione na 127, a wszystkie wartości mniejsze lub równe 127 są niezmienione. maxValue jest ignorowana.

Rysunek 7 : Progowanie przycinające (thresh = 127)

Progowanie do zera ( type = THRESH_TOZERO )

W tym rodzaju progowania, wartość piksela docelowego jest ustawiana na odpowiadającą mu wartość piksela źródłowego, jeśli wartość piksela źródłowego jest większa niż próg. W przeciwnym razie jest ustawiana na zero. maxValue jest ignorowana.

Reguła progowania

# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO);

Wynik działania funkcji Threshold to Zero

Rysunek 8: Threshold to Zero ( thresh = 127 )

Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)

W tym rodzaju progowania wartość piksela docelowego jest ustawiana na zero, jeśli wartość piksela źródłowego jest większa od progu. W przeciwnym razie jest ona ustawiana na wartość piksela źródłowego. maxValue jest ignorowana.

Reguła progowania

# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);

Wynik zastosowania Inverted Threshold to Zero

Rysunek 9 pokazuje wynik zastosowania Inverted Threshold to Zero do obrazu wejściowego. Liczby poniżej progu zachowują swoją wartość w skali szarości, a liczby powyżej progu mają wartość 0, z wyjątkiem granicy. Artefakty na granicy wynikają z faktu, że wartości pikseli na granicy przechodzą od 0 do wartości liczby na przestrzeni kilku pikseli. Tak więc niektóre z pikseli na granicy są poniżej progu.

Rysunek 9: Odwrócony próg do zera ( thresh = 127 )

Pobierz kod i przykładowy obraz

.

Dodaj komentarz Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Archiwa

  • styczeń 2022
  • grudzień 2021
  • listopad 2021
  • październik 2021
  • wrzesień 2021

Meta

  • Zaloguj się
  • Kanał wpisów
  • Kanał komentarzy
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress