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))