IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - Bitové operácie a filtrovanie farieb obrázkov v Pythone

V minulej lekcii, Thresholding a analýza obrázkov v Pythone , sme si ukázali, ako funguje thresholding a na čo je vlastne dobrý. V dnešnom Python tutoriálu sa pozrieme na bitové operácie, ktoré sme načal v predošlých lekciách. Ukážeme si ako fungujú masky a odfiltruje si farby z obrázku v OpenCV.

Bitové operácie

Bitové operácie, ako sme sa už dozvedeli v 3. lekcii, sa používajú na oddelenie nejakej časti obrázku od zvyšku, v prípade 3. lekcie k oddeleniu pozadie od loga.

Tieto operácie v knižnici OpenCV môžeme použiť napríklad pre vloženie obrázku, odfiltrovanie pozadie / farby, pre obrátenie hodnôt masky a oveľa viac. Ukážeme si, ako fungujú na nasledujúcich 2 obrázkoch jednoduchých tvarov:

Ukážkové obrázky tvarov pre bitové operácie s obrázkami v Pythone - Analýza obrazu a videa v Pythone

Začnime rovno našej ukážkovú aplikácií:

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árame 2 numpy pole np.zeros((300, 300), dtype=np.uint8), ktorá obsahujú iba hodnoty 0, s rozmermi 300x300px a dátového typu np.uint8. Potom do každého vložíme tvar ako na obrázku.

Teraz aplikujeme všetky bitové operácie z knižnice OpenCV na tieto 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ýsledok jednotlivých operácií vidíme na obrázku nižšie:

Výsledok bitových operácií na obrázkoch v Pythone - Analýza obrazu a videa v Pythone

Odfiltrovanie farieb

Ukážeme si, ako využiť bitové operácie pre odfiltrovanie farieb. Ako vždy budem používať obrázok lietadla:

Ukážkový obrázok lietadla - Analýza obrazu a videa v Pythone

Najskôr si vytvoríme 2 numpy polia, ktoré budú obsahovať rozsah farieb, ktoré sa budú nachádzať v maske. Najskôr si ukážeme, ako vyzerá naše maska, a potom aplikujeme bitovú operáciu:

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

Ako vždy si načítame obrázok img = cv2.imread("letadlo.jpg"). Vytvoríme 2 numpy polia, ktorá použijeme pri tvorbe masky, čo je rozsah farieb, ktoré chceme ponechať. Vytvoríme samotnú masku, ktorá bude obsahovať čierna miesta (obsahujúci naše vybrané farby) a biela (ostatné) maska = cv2.inRange(img, barva_od, barva_do).

Maska lietadlá teda vyzerá takto:

Maska pre odfiltrovanie farieb v Pythone - Analýza obrazu a videa v Pythone

Teraz masku aplikujeme a využijeme bitovú operáciu bitwise_and() s našou 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ýsledok:

Bitová operácia and na obrázkoch v Pythone - Analýza obrazu a videa v Pythone

Čierna miesta teraz vyplníme obrázkom s mač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ýsledok:

Analýza obrazu a videa v Pythone

Najprv aplikujeme bitovú operáciu NOT na našu masku maska_inv = cv2.bitwise_not(maska). Potom použijeme masku pre výber regiónu z obrázku mačky img2_selected = cv2.bitwise_and(img2, img2, mask = maska_inv). Vybraný región a odfiltrovanie obrázok lietadlá spojíme celek = cv2.add(img, img2_selected).

Zdrojový kód ukážkové aplikácie nájdete na stiahnutie v prílohe článku. V budúcej lekcii, Rozostrenie a vyhladzovanie obrázkov v Pythone , sa pozrieme na rozostřování a vyhladzovanie obrázkov pomocou filtrov.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 21x (518.66 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Thresholding a analýza obrázkov v Pythone
Všetky články v sekcii
Analýza obrazu a videa v Pythone
Preskočiť článok
(neodporúčame)
Rozostrenie a vyhladzovanie obrázkov v Pythone
Článok pre vás napísal MQ .
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity