Triko zdarma Triko zdarma
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Lekce 5 - Bitové operace a filtrování barev obrázků v Pythonu

Python Analýza obrazu a videa Bitové operace a filtrování barev obrázků v Pythonu

Unicorn College ONEbit hosting 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, Thresholding a analýza obrázků v Pythonu, jsme si ukázali, jak funguje thresholding a k čemu je vlastně dobrý. V dnešním Python tutoriálu se podíváme na bitové operace, které jsme načali v předešlých lekcích. Ukážeme si jak fungují masky a odfiltrujeme si barvy z obrázku v OpenCV.

Bitové operace

Bitové operace, jak jsme se již dozvěděli ve 3. lekci, se používají k oddělení nějaké části obrázku od zbytku, v případě 3. lekce k oddělení pozadí od loga.

Tyto operace v knihovně OpenCV můžeme použít například pro vložení obrázku, odfiltrování pozadí/barvy, pro obrácení hodnot masky a mnohem více. Ukážeme si, jak fungují na následujících 2 obrázcích jednoduchých tvarů:

Ukázkové obrázky tvarů pro bitové operace s obrázky v Pythonu

Začněme rovnou naší ukázkovou aplikací:

import cv2
import numpy as np

img1 = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(img1, (0, 0), (200, 200), (255, 255, 255), -1)
img2 = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(img2, (100, 100), (300, 200), (255, 255), -1)

Vytváříme 2 numpy pole np.zeros((300, 300), dtype=np.uint8), která obsahují pouze hodnoty 0, o rozměrech 300x300px a datového typu np.uint8. Poté do každého vložíme tvar jako na obrázku.

Nyní aplikujeme všechny bitové operace z knihovny OpenCV na tyto 2 obrázky:

import cv2
import numpy as np

img1 = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(img1, (0, 0), (200, 200), (255, 255, 255), -1)
img2 = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(img2, (100, 100), (300, 200), (255, 255), -1)
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)

vystup = np.zeros((300,300), dtype=np.uint8)

cv2.bitwise_and(img1, img2, vystup)
cv2.imshow("and", vystup)

cv2.bitwise_not(img1, vystup)
cv2.imshow("not", vystup)

cv2.bitwise_or(img1, img2, vystup)
cv2.imshow("or", vystup)

cv2.bitwise_xor(img1, img2, vystup)
cv2.imshow("xor", vystup)

cv2.waitKey()
cv2.destroyAllWindows()

Výsledek jednotlivých operací vidíme na obrázku níže:

Výsledek bitových operací na obrázcích v Pythonu

Odfiltrování barev

Ukážeme si, jak využít bitové operace pro odfiltrování barev. Jako vždy budu používat obrázek letadla:

Ukázkový obrázek letadla

Nejdříve si vytvoříme 2 numpy pole, která budou obsahovat rozsah barev, které se budou nacházet v masce. Nejdříve si ukážeme, jak vypadá naše maska, a poté aplikujeme bitovou operaci:

import cv2
import numpy as np

img = cv2.imread("letadlo.jpg")
barva_od = np.array([100, 50, 50])
barva_do = np.array([200, 200, 200])
maska = cv2.inRange(img, barva_od, barva_do)

cv2.imshow("obrazek", img)
cv2.waitKey()
cv2.destroyAllWindows()

Jako vždy si načteme obrázek img = cv2.imread("letadlo.jpg"). Vytvoříme 2 numpy pole, která použijeme při tvorbě masky, což je rozmezí barev, které chceme ponechat. Vytvoříme samotnou masku, která bude obsahovat černá místa (obsahující naše vybrané barvy) a bílá (ostatní) maska = cv2.inRange(img, barva_od, barva_do).

Maska letadla tedy vypadá takto:

Maska pro odfiltrování barev v Pythonu

Nyní masku aplikujeme a využijeme bitovou operaci bitwise_and() s naší maskou:

import cv2
import numpy as np

img = cv2.imread("letadlo.jpg")
barva_od = np.array([100, 50, 50])
barva_do = np.array([200, 200, 200])
maska = cv2.inRange(img, barva_od, barva_do)
img = cv2.bitwise_and(img, img, mask = maska)

cv2.imshow("obrazek", img)
cv2.waitKey()
cv2.destroyAllWindows()

Výsledek:

Bitová operace and na obrázcích v Pythonu

Černá místa nyní vyplníme obrázkem s kočkou:

import cv2
import numpy as np

img = cv2.imread("letadlo.jpg")
img2 = cv2.imread("kocka.jpg")
img2 = img2[:img.shape[0], :img.shape[1]]
barva_od = np.array([100, 50, 50])
barva_do = np.array([200, 200, 200])
maska = cv2.inRange(img, barva_od, barva_do)
img = cv2.bitwise_and(img, img, mask = maska)
maska_inv = cv2.bitwise_not(maska)
img2_selected = cv2.bitwise_and(img2, img2, mask = maska_inv)
celek = cv2.add(img, img2_selected)

cv2.imshow("obrazek", celek)
cv2.waitKey()
cv2.destroyAllWindows()

Výsledek:

Nejprve aplikujeme bitovou operaci NOT na naši masku maska_inv = cv2.bitwise_not(maska). Poté použijeme masku pro výběr regionu z obrázku kočky img2_selected = cv2.bitwise_and(img2, img2, mask = maska_inv). Vybraný region a odfiltrovaný obrázek letadla spojíme celek = cv2.add(img, img2_selected).

Zdrojový kód ukázkové aplikace najdete ke stažení v příloze článku. V příští lekci, Rozostření a vyhlazování obrázků v Pythonu, se podíváme na rozostřování a vyhlazování obrázků pomocí filtrů.


 

Stáhnout

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

 

 

Článek pro vás napsal MQ .
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor je srdcem Pythonista.
Aktivity (5)

 

 

Komentáře

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.

Zatím nikdo nevložil komentář - buď první!