Lekce 4 - Thresholding a analýza obrázků v Pythonu
V předchozí lekci, Práce s pixely a operace s obrázky v Pythonu, jsme si ukázali práci s jednotlivými pixely a aritmetické operace s obrázky v knihovně OpenCV v Pythonu.
V dnešním Python tutoriálu se zaměříme na funkci
threshold()
, kterou jsme v minulé lekci využili.
Pro ukázku budu jako vždy používat obrázek letadla:
Thresholding
Thresholding je nejzákladnější způsob jak vytvořit binární obrázek neboli masku. Maska není nic jiného než binární obrázek(obrázek o 2 hodnotách), který pomocí bitových operací nebo funkcí aplikujeme na obrázek.
Nejdříve si něco povíme o funkcích threshold()
a
adaptiveThreshold()
v knihovně OpenCV. Threshold znamená anglicky
práh. Thresholding slouží ke zjednodušení vizuálních dat tak, aby se
lépe analyzovala. Je přeci jen jednodušší pracovat se 2 hodnotami než s
256. Thresholding dokáže převést pixely buď na bílé nebo černé,
záleží na parametrech a typu funkce, kterou zvolíme. Jedním ze základních
parametrů této funkce je prahová hodnota, která pixely rozdělí na 2
skupiny, a maximální hodnota. Pokud by prahová hodnota byla např.
100
z 255
, všechny pixely pod hodnotou
100
by byly černé a pixely nad hodnotou 100
budou
mít onu maximální hodnotu, v našem případě budou bílé. Pixely budou
mít 2 hodnoty pouze tehdy, když obrázek konvertujeme na
GRAYSCALE
. Pokud ponecháme obrázek barevný, bude se jednat o
barvy a ne o černou a bílou.
Typy thresholding funkcí, které knihovna OpenCV nabízí, jsou následující:
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV
THRESH_MASK
THRESH_OTSU
THRESH_TRIANGLE
Nyní si thresholding předvedeme na našem obrázku:
import cv2 import numpy as np import os img = cv2.imread("letadlo.jpg") img = cv2.resize(img, (640, 480)) cv2.imshow("pred", img) ret, img = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY) cv2.imshow("po", img) cv2.waitKey() cv2.destroyAllWindows()
Obrázek si nejdříve načteme a poté zmenšíme, aby se nám vešel na
obrazovku. Aplikujeme threshold THRESH_BINARY
s prahovou hodnotou
100
a maximální 255
pomocí
cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
. Funkce vrací
kromě obrázku také hodnotu ret
. Pokud použijeme
cv.THRESH_OTSU
, funkce přes ret
vrací optimální
prahovou hodnotu, jinak vrací prahovou hodnotu, kterou jsme zadali.
Můžeme se ujistit, že obrázek je opravdu stále barevný:
Nyní aplikujeme threshold THRESH_BINARY
s prahovou hodnotou
150
a maximální 255
na GRAYSCALE
obrázek:
img = cv2.imread("letadlo.jpg") img = cv2.resize(img, (640, 480)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, img = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY) cv2.imshow("obrazek", img) cv2.waitKey() cv2.destroyAllWindows()
Obázek má již jen 2 barvy a to černou a bílou:
AdaptiveThreshold
Funkce cv.adaptiveThreshold()
dělá to samé jako funkce
threshold()
, ale prahovou hodnotu si zjistí podle algoritmu,
který zvolíme. Parametry funkce jsou následující:
- Obrázek
- Maximální hodnota
- Algoritmus - Algoritmus, který použijeme pro vypočtení optimální prahové hodnoty
- Typ
- Velikost bloku - x*x pixelů, které algoritmus analyzuje
- Konstanta - Konstanta se odečítá od výsledků algoritmu
Na výběr zde máme ze 2 algoritmů:
ADAPTIVE_THRESH_MEAN_C
- Prahová hodnota je průměr blokuADAPTIVE_THRESH_GAUSSIAN_C
- Prahová hodnota je vážený součet bloku
Samotnou funkci si nyní ukážeme na našem obrázku:
img = cv2.imread("letadlo.jpg") img = cv2.resize(img, (640, 480)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 1) cv2.imshow("obrazek", img) cv2.waitKey() cv2.destroyAllWindows()
Obrázek si načteme, zmenšíme a převedeme na GRAYSCALE
.
Následně aplikujeme funkci adaptiveThreshold()
s algoritmem
ADAPTIVE_THRESH_GAUSSIAN_C
, typem THRESH_BINARY
,
velikostí bloku 15
a konstantou 1
. Obrázek
zobrazíme:
Nyní již víme, jak a k čemu slouží thresholding
Zdrojový kód najdete ke stažení v příloze článku.
V další lekci, Bitové operace a filtrování barev obrázků v Pythonu, se zaměříme na bitové operace. Ukážeme si jak odfiltrovat barvy z obrázku v knihovně OpenCV.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 30x (383.73 kB)
Aplikace je včetně zdrojových kódů v jazyce Python