OpenCV Threshold ( Python , C++ )
On 4 stycznia, 2022 by adminCo 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.
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.
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.
Zmiana wartości thresh na 127 usuwa wszystkie liczby mniejsze lub równe 127.
Zmiana maxValue na 128 ustawia wartość progowanych regionów 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.
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.
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
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.
Pobierz kod i przykładowy obraz
.
Dodaj komentarz