4. diel - Thresholding a analýza obrázkov v Pythone
V minulej lekcii, Práca s pixelmi a operácie s obrázkami v Pythone , sme si ukázali, ako pracovať s jednotlivými
pixely obrázkov v Pythone a vykonávať aritmetické operácie. V dnešnom
Python tutoriálu sa zameriame na funkciu threshold()
, ktorú sme v
minulej lekcii využili.
Pre ukážku budem ako vždy používať obrázok lietadla:
Thresholding
Thresholding je najzákladnejšia spôsob ako vytvoriť binárnu obrázok čiže masku. Maska nie je nič iné ako binárny obrázok (obrázok o 2 hodnotách), ktorý pomocou bitových operácií alebo funkcií aplikujeme na obrázok.
Najskôr si niečo povieme o funkciách threshold()
a
adaptiveThreshold()
v knižnici OpenCV. Threshold znamená anglicky
prah. Thresholding slúžia k zjednodušeniu vizuálnych dát tak, aby sa
lepšie analyzovala. Je predsa len jednoduchšie pracovať s 2 hodnotami než s
256. Thresholding dokáže previesť pixely buď na biele alebo čierne,
záleží na parametroch a typu funkcie, ktorú zvolíme. Jedným zo
základných parametrov tejto funkcie je prahová hodnota, ktorá pixely
rozdelí na 2 skupiny, a maximálna hodnota. Ak by prahová hodnota bola napr.
100
z 255
, všetky pixely pod hodnotou
100
by boli čierne a pixely nad hodnotou 100
budú
mať onú maximálnu hodnotu, v našom prípade budú biele. Pixely budú mať 2
hodnoty len vtedy, keď obrázok konvertujú na GRAYSCALE
. Ak
ponecháme obrázok farebný, bude sa jednať o farby a nie o čiernu a
bielu.
Typy thresholding funkcií, ktoré knižnica OpenCV ponúka, sú nasledujúce:
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV
THRESH_MASK
THRESH_OTSU
THRESH_TRIANGLE
Teraz si thresholding predvedieme na našom 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ázok si najskôr načítame a potom zmenšíme, aby sa nám zmestil na
obrazovku. Aplikujeme threshold THRESH_BINARY
počiatočnú hranicu
100
a maximálna 255
pomocou
cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
. Funkcia vracia
okrem obrázku tiež hodnotu ret
. Ak použijeme
cv.THRESH_OTSU
, funkcia cez ret
vracia optimálnu
prahovú hodnotu, inak vracia prahovú hodnotu, ktorú sme zadali.
Môžeme sa uistiť, že obrázok je naozaj stále farebný:
Teraz aplikujeme threshold THRESH_BINARY
počiatočnú hranicu
150
a maximálny 255
na GRAYSCALE
obrázok:
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á už len 2 farby a to čiernu a bielu:
AdaptiveThreshold
Funkcia cv.adaptiveThreshold()
robí to isté ako funkcia
threshold()
, ale prahovú hodnotu si zistí podľa algoritmu,
ktorý zvolíme. Parametre funkcie sú nasledovné:
- obrázok
- Maximálna hodnota
- Algoritmus - algoritmus, ktorý použijeme pre výpočet optimálnej prahové hodnoty
- typ
- Veľkosť bloku - x * x pixelov, ktoré algoritmus analyzuje
- Konštanta - konštanta sa odpočíta od výsledkov algoritmu
Na výber tu máme zo 2 algoritmov:
ADAPTIVE_THRESH_MEAN_C
- Prahová hodnota priemer blokuADAPTIVE_THRESH_GAUSSIAN_C
- Prahová hodnota vážený súčet bloku
Samotnú funkcii si teraz ukážeme na našom 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ázok si načítame, zmenšíme a prevedieme na GRAYSCALE
.
Následne aplikujeme funkciu adaptiveThreshold()
s algoritmom
ADAPTIVE_THRESH_GAUSSIAN_C
, typom THRESH_BINARY
,
veľkosťou bloku 15
a konštantou 1
. Obrázok
zobrazíme:
Teraz už vieme, ako a na čo slúži thresholding
Zdrojový kód nájdete na stiahnutie v prílohe článku. V budúcej lekcii, Bitové operácie a filtrovanie farieb obrázkov v Pythone , sa pozrieme odfiltrovanie farieb z obrázka a binárne operácie, ktoré sme použili v predchádzajúcich lekciách.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 30x (383.73 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python