6. diel - Rozostrenie a vyhladzovanie obrázkov v Pythone
V minulej lekcii, Bitové operácie a filtrovanie farieb obrázkov v Pythone , sme si detailnejšie predstavili bitové operácie v knižnici OpenCV a odfiltrovali farby. V dnešnom Python tutoriálu sa pozrieme na aplikáciu vyhladzovanie pomocou filtrov a rozostřování.
Filtrovanie
Pre ukážku použijem tento obrázok s nízkym rozlíšením, ktorý si
uložte k projektu ako súbor low_res.jpg
:
![Obrázok mačky s nízkym rolišením - Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/low_res.jpg)
Najskôr si vysvetlíme, ako fungujú 2D filtre. Filter aplikuje
kernel
s veľkosťou x * x pixelov, z ktorých sa spočíta
priemerná hodnota. Kernel je numpy pole, v našom prípade vyplnené číslom
1
. Následne použijeme funkciu cv2.filter2d()
pre
aplikáciu kernelu, táto funkcia má nasledovné parametre:
- obrázok
- hĺbka - hĺbka výsledného obrázku, ak je hodnota
-1
, zostáva rovnaká - kernel - numpy poľa veľkosti x * x, podľa ktorého sa obrázok rozdelí na jednotlivé bloky az tých sa následne spočíta priemerná hodnota
Kód našej aplikácie bude nasledujúci:
import cv2 import numpy as np img = cv2.imread("low_res.jpg") kernel = np.ones((4, 4), dtype=np.uint8) / (4 * 4) vyhlazeno = cv2.filter2D(img, -1, kernel) cv2.imshow("vyhlazeno", vyhlazeno) cv2.imshow("original", img) cv2.waitKey() cv2.destroyAllWindows()
Načítame si náš obrázok s nízkym rozlíšením, potom si vytvoríme
numpy poľa veľkosti 4x4, každý prvok následne vydelíme veľkosťou poľa
kernel = np.ones((4, 4), dtype=np.uint8) / (4 * 4)
. Aplikujeme 2D
filter s naším poľom
vyhlazeno = cv2.filter2D(img, -1, kernel)
.
výsledok:
![Aplikovanie filtra vyhladzovanie na obrázok v Pythone - Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/lekce7/1.jpg)
Rozostrenie a vyhladzovanie
Rozostrenie sa väčšinou používa na odstránenie nedostatkov a šumu z obrázkov. K rozostrenie / vyhladzovanie obrázkov sa používajú podobné filtre, ako sme použili na vyhladzovanie obrázku vyššie.
Urobme si ďalší príklad:
import cv2 import numpy as np img = cv2.imread("letadlo.jpg") img = cv2.resize(img , (640, 480)) #Přídáme šum noise = np.zeros((img.shape), dtype = np.uint8) noise = cv2.randn(noise, 0, 150) img = img + noise cv2.imshow("original", img) img = cv2.blur(img , (7, 7)) cv2.imshow("rozostreny", img) cv2.waitKey() cv2.destroyAllWindows()
Obrázok načítame a zmenšíme, potom vytvoríme šum, ktorý k obrázku
pridáme. Potom aplikujeme rozostrenie s kernelom s veľkosťou 7 * 7 ako
img = cv2.blur(img , (7, 7))
.
![Filter rozostrenie a šumu na obrázku v Pythone - Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/lekce7/2.jpg)
Gaussian Blur
Skúsime na obrázok aplikovať rôzne druhy rozostrenie / vyhladzovanie, ktoré OpenCV obsahuje. Tento typ požaduje okrem veľkosti kernelu (veľkosť musí byť nepárne) tieto parametre:
- Sigmax - odchýlka na osi X
- sigmaY - odchýlka na osi Y, ak je rovné
0
, veľkosť bude rovnaké akosigmaX
Kód ukážky:
import cv2 import numpy as np img = cv2.imread("letadlo.jpg") img = cv2.resize(img , (640, 480)) #Přídáme šum noise = np.zeros((img.shape), dtype = np.uint8) noise = cv2.randn(noise, 0, 150) img = img + noise cv2.imshow("original", img) img = cv2.GaussianBlur(img , (7, 7), 0) cv2.imshow("rozostreny", img) cv2.waitKey() cv2.destroyAllWindows()
A výsledok:
![Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/lekce7/3.jpg)
Median Blur
Tento typ použije medián všetkých pixelov v bloku / kerneli, veľkosť bloku / kernelu musí byť nepárne:
import cv2 import numpy as np img = cv2.imread("letadlo.jpg") img = cv2.resize(img , (640, 480)) #Přídáme šum noise = np.zeros((img.shape), dtype = np.uint8) noise = cv2.randn(noise, 0, 150) img = img + noise cv2.imshow("original", img) img = cv2.medianBlur(img, 7) cv2.imshow("rozostreny", img) cv2.waitKey() cv2.destroyAllWindows()
Osobne si myslím, že tento typ odstránil náš šum najlepšie, len sa pozrite na rozdiel medzi originálom a rozostreným obrázkom:
![Median Blur filter na obrázku v Pythone - Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/lekce7/4.jpg)
Bilateral Filter
Tento typ ponechá filtra pôvodnej hrany a najefektívnejšie odstráni šum. Má nasledovné parametre:
- obrázok
- sigmaColor - hodnota, ktoré určuje ako veľmi sa farby smixují
- sigmaSpace - hodnota, ktorá určuje ako veľmi sa budú ovplyvňovať vzdialenejšiu pixely
Náš kód bude nasledujúce:
import cv2 import numpy as np img = cv2.imread("letadlo.jpg") img = cv2.resize(img , (640, 480)) #Přídáme šum noise = np.zeros((img.shape), dtype = np.uint8) noise = cv2.randn(noise, 0, 150) img = img + noise cv2.imshow("original", img) img = cv2.bilateralFilter(img, 7, 70, 70) cv2.imshow("rozostreny", img) cv2.waitKey() cv2.destroyAllWindows()
A výsledok:
![Bilateral Filter na obrázku v Pythone - Analýza obrazu a videa v Pythone](images/35020/analyza_dat/obraz_video/lekce7/5.jpg)
Zdrojový kód nájdete na stiahnutie v prílohe článku. V budúcej lekcii, Detekcia objektu v obrázku podľa farby a detekcie okrajov , sa pozrieme na detekciu predmetu v obrázku podľa farby a detekciu okrajov.
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é 23x (640 B)
Aplikácia je vrátane zdrojových kódov v jazyku Python