OpenCV - základní operace

V tomto článku si ukážeme základní prostorové a jasové transformace pomocí Pythonu a knihovny OpenCV. V příkladech využijeme obrázek Lenny (wiki), který se běžně používá ve zpracování obrazu pro demonstraci různých algoritmů a srovnání výsledků. Jako zobrazovací platformu využijeme knihovnu matplotlib v prostředí Jupyter notebooku.

Načtení obrázku a převod barevných modelů

from matplotlib import pyplot as plt
import numpy as np
import cv2

img_gray = cv2.imread("lena.png", cv2.IMREAD_GRAYSCALE)

img = cv2.imread("lena.png", cv2.IMREAD_COLOR)
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, na což je potřeba dávat si u některých operací pozor. V příkladu výše jej pomocí funkce cvtColor převedeme z BGR na RGB. Celou tabulku kódů pro konverzi naleznete v dokumentaci.

Výřezy a přístup k pixelům

  • Souřadnicový systém začíná v levém horním rohu. Konkrétní souřadnice má koordináty [y,x] případně [y,x,c]
  • Výběr podoblasti (ROI) nad obrázkem provádíme pomocí ořezu nad img[y1:y2, x1:x2]
roi = img[200:300,200:300]
full_width = img[200:300,:]
only_red_channel = img[:,:,0]
one_pixel = img_gray[20,30]

plt.imshow(only_red_channel, cmap="gray")

Pomocí indexů a slicingu můžeme nad obrázkem dělat celkem zajímavé věci:

  • V proměnné roi je 100x100px výřez od souřadnic x=200, y=200 po souřadnice x=300, y=300.
  • V proměnné full_width máme 100px výřez od souřadnice y=200 přes celou šířku obrázku.
  • Proměnná only_red_channel obsahuje pouze červený kanál původního obrázku.
  • one_pixel pak konkrétní jasovou hodnotu černobílého obrázku na souřadnicích x=20, y=30.

Manipulace s pixely a základní transformace

Zjištění rozměru obrázku

print(img_gray.shape)
# (512, 512)

print(img.shape)
# (512, 512, 3)

Převod hodnot jasu z rozsahu 0-255 na 0-1

U spousty algoritmů nám nestačí diskrétní hodnoty jasu 0,1,..255, ale hodí se spíše reálná škála, ideálně normalizovaná mezi 0-1. Díky tomu, že OpenCV vnitřně pracuje s datovou strukturou numpy.array, jsme schopni snadno dělat aritmetické operace nad celou maticí reprezentující náš obraz.

img_gray = img_gray/255.0

Úprava jasu pixelu

img_gray[300,300] = 1
img_gray[100:150,100:150] = 1

Pokud chceme upravit jas pixelu na konkrétních souřadnicích, můžeme opět použít slicing a nastavit tak jas pro celou oblast.

Změna velikosti obrázku

img_gray_smaller = cv2.resize(img_gray, (width, height))
Soubory
Úroveň znalostí
Začátečník