Python pro zpracování obrazu - OpenCV

OpenCV je multiplatformní svobodná (licence Apache 2) knihovna pro práci s obrazem. Samotná knihovna je z velké části napsána v C++, ale poskytuje Python wrapper, díky kterému ji můžeme používat i v tomto oblíbeném jazyce. OpenCV používají stovky velkých firem pro zpracování obrazu z kamer, rozpoznání psaného textu nebo obličejů. Běžně se s touto knihovnou můžeme potkat i v akademické sféře. Jelikož je OpenCV optimalizováno pro výkon, dokáže fungovat i na GPU, konkrétně na architektuře CUDA. Na Python úrovni pak pracuje s datovou strukturou numpy.ndarray.

Jak OpenCV nainstalovat?

Budeme předpokládat, že si pro následující úlohy vystačíme pouze s CPU a nebudeme potřebovat GPU. V tom případě stačí nainstalovat Python balíček opencv-python z pypi. V opačném případě je potřeba knihovnu zkompilovat pro konkrétní architekturu a operační systém. Pokud máte rádi Docker, doporučuji si vybrat nějaký z dostupných docker obrazů, které kromě OpenCV obsahují taky Jupyter notebook.

Načtení a zobrazení obrázku

Nejdříve si ukážeme, jakým způsobem se dá načíst a zobrazit obrázek ve standardním okně systému.

import cv2

image = cv2.imread("lena.jpg")

cv2.namedWindow("Display", cv2.WINDOW_AUTOSIZE)
cv2.imshow("Display", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Obrázek se načte pomocí cv2.imread() do datové struktury np.array. Vyrobí se okno, které je důležité nějakým způsobem pojmenovat, protože toto jméno pak slouží jako identifikátor okna. Program pomocí imshow() obrázek vykreslí a přes waitKey(0) počká na stisk klávesy. Po stisku klávesy se okno zavře. Všimněte si ne-příliš pythoního názvu funkcí a přístupu k objektům. Je to z toho důvodu, že OpenCV je původně C++ knihovna.

OpenCV v Dockeru - Jupyter Notebook

Abychom pro vykreslení okna nemuseli komunikovat mezi hostujícím desktopem a docker kontejnerem, je v tomto případě elegantnější použít Jupyter Notebook a knihovnu matplotlib.

from matplotlib import pyplot as plt
import cv2

img = cv2.imread("lena.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(img)
plt.show()

OpenCV používá z historických důvodů výchozí barevný model BGR místo RGB, což může být ze začátku dost neintuitivní a při určitých jasových operacích je na to potřeba dávat si pozor. Pomocí funkce cvtColor() však můžeme obrázek jednoduše převést do správného barevného modelu a pak jej zobrazit.

Úroveň znalostí
Začátečník