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
:

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:

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

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:

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:

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:

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