Vajíčková mánie Vajíčková mánie
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Lekce 4 - Thresholding a analýza obrázků v Pythonu

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Práce s pixely a operace s obrázky v Pythonu, jsme si ukázali, jak pracovat s jednotlivými pixely obrázků v Pythonu a provádět aritmetické operace. 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:

Ukázkový 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ý:

Thresholding na obrázku v Pythonu

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:

Černobílý thresholding na obrázku v Pythonu

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 bloku
  • ADAPTIVE_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:

Obrázek s adaptivní thresholdem v Pythonu

Nyní již víme, jak a k čemu slouží thresholding :)

Zdrojový kód najdete ke stažení v příloze článku. V příští lekci, Bitové operace a filtrování barev obrázků v Pythonu, se podíváme odfiltrování barev z obrázku a binární operace, které jsme použili v předchozích lekcích.


 

Stáhnout

Staženo 6x (383.73 kB)
Aplikace je včetně zdrojových kódů v jazyce Python

 

 

Aktivity (7)

 

 

Komentáře

Avatar
Lako
Člen
Avatar
Lako:15.10.2018 20:19

Čau, zajímavé články.
Kam až máš naplánované s nimi pokračovat, dostaneš se k buzzwordům jako deep learning, konvoluční neuronky a tak?

 
Odpovědět 15.10.2018 20:19
Avatar
MQ .
Překladatel
Avatar
Odpovídá na Lako
MQ .:15.10.2018 22:02

Ahoj, určitě bych chtěl pokračovat tímto směrem, ale je potřeba toho ještě hodně napsat o souvisejících knihovnách než se k tomu dostanu.

Odpovědět 15.10.2018 22:02
Programovácí jazyk zítřka bude vysokoúrovňový, bez ";", prostý a v neposlední řadě čitelný.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.