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

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

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

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

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é ako sigmaX

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

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

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

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

 

Predchádzajúci článok
Bitové operácie a filtrovanie farieb obrázkov v Pythone
Všetky články v sekcii
Analýza obrazu a videa v Pythone
Preskočiť článok
(neodporúčame)
Detekcia objektu v obrázku podľa farby a detekcie okrajov
Č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