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:
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:
Odfiltrovanie farieb
Ukážeme si, ako využiť bitové operácie pre odfiltrovanie farieb. Ako vždy budem používať obrázok lietadla:
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:
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:
Č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:
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