Vyhlazování(Filtrace)
Filtrace obrazu slouží ke zvýraznění určité informace. Můžeme potlačit šum, vyhladit obraz, zvýraznit kontrast, nebo detekovat hrany. Předzpracování obrazu pomocí filtrace je lokální nikoli bodová operace. Pracujeme s intenzitou bodu, který je vázán na své okolí. Toto okolí může mít různé tvary, nejčasteji se jedná o čtvercové okolí. Filtry dělíme na lineární a nelineární. Lineární filtry jsou takové, které hodnotu výsledného bodu počítají jako sumu součinu intenzit s příslušnými váhami filtru v daném okolí bodu.
Oproti tomu nelineární filtry nevytvářejí novou intenzitu, ale výslednou intenzitu vybírají z okolí upravovaného bodu. Filtr typu medián vybere prostřední člen z uspořádané posloupnosti v daném okolí.
průměrování přes více snímků
celkem 12 snímků, v každém snímku se korálky vyskytovali na jiném místě
výsledek po průměrování
lokální průměrování
Konvoluce
Python:
import numpy as np
np.convolve([3, 10, 10, 1, 2, 2], [1, -2, 1])
array([ 3, 4, -7, -9, 10, -1, -2, 2])
Matlab:
conv ([3 10 10 1 2 2],[1 -2 1])
3 4 -7 -9 10 -1 -2 2
Konvoluce 2D
Matlab:
imfilter(obraz,[1 1 1;1 1 1;1 1 1]/9);
Python:
import scipy
from scipy import ndimage
import matplotlib.pyplot as plt
lena = scipy.misc.lena()
local_mean = ndimage.uniform_filter(lena, size=11)
blurred_lena = ndimage.gaussian_filter(lena, sigma=3)
very_blurred = ndimage.gaussian_filter(lena, sigma=5)
zašumněný obraz odstranění šumu
detail
výběrové kvantily (medián)
Python:
med_denoised = ndimage.median_filter(noisy, 3)
Další kvantilové filtry
ndimage.maximum_filter, ndimage.percentile_filter
Nelineární filtry
scipy.signal.wiener
Matlab:
medfilt2(obraz,[3 3]);
zašumněný obraz odstranění šumu
detail
Gradientní operátory
zkušební obrazy
aproximace derivací diferencemi
Python
import matplotlib.pyplot as plt from skimage.data import camera from skimage.filter import roberts, sobel image = camera() edge_roberts = roberts(image)
Matlab
edge(obraz,'roberts');
srovnání s parametrickým modelem hran
Python pomocí scipy
sx=ndimage.sobel(im,axis=0,mode='constant')
sy=ndimage.sobel(im,axis=1,mode='constant')
sob=np.hypot(sx,sy)
Python pomocí scikits-image
from skimage import data, io, filter image = data.coins() # or any NumPy array! edges = filter.sobel(image) io.imshow(edges)
Matlab
edge(obraz,'sobel');
průchody nulou
edge(obraz,'zerocros');
Cannyho detektor
edge(obraz,'canny');
Python
edges2 = skimage.filter.canny(im, sigma=3)
detekce čáry mfile cary
detekce bodu mfile body
Další využití filtrace
Odstranění vlivu nerovnoměrného osvětlen. Tuto operaci lze provádět pouze pro případy, kdy pozadí zabírá velkou část obrazu a je možné odstranit objekty pomocí filtrace. Příklad:
vlevo nahoře – šedotónový obraz se světelným přechodem, vpravo nahoře naprahovaný obraz pomocí prahu 150 (struktura není znatelná na celém obraze), vlevo dole – původní obraz po odstranění objektů, vpravo dole – výsledek prahování po odstranění vlivu pozadí (odečtení od původního obrazu)
Matlab- funkce
fspecial ....funkce vytvoří masku pro filtrování a hledání hran
Pokud chcete získat hrany v obraze, pak můžete udělat mimo příkaz edge take filtraci příslušnou maskou, ktera aproximuje derivaci.
H=fspecial('sobel') ; imH=imfilter(im,H);
Tip:zkuste si navrhnout svou masku na hledání hran, nezapomeňte že součet prvků masky musi byt roven nule.
V testu očekávejte otázky typu: Co je to hrana? Jaké typy nelinearni filtrace znáte? Nakreslete transformační funkci pro zesvětlení obrazu apod.
Pro zajímavost: Alan Turing
úkoly:
1) definujte co je to hrana v obraze
2) vyzkoušejte jak funguje třetí parametr (práh) u funkce edge
3) naprogramujte výpočet diferencí v ose x a y z daného šedotónového obrazu, z těchto hodnot vypočítejte velikost hrany a její směr pro každý bod obrazu, zobrazte velikost hran pomocí imshow, proveďte naprahování velikostí hran na nějakou hodnotu (stejny vysledek jako edge), vykreslete si velikost a směr hran pomocí funkce quiver (dx(diference v x),dy(diference v y))
4) vyzkoušejte odstranění vlivu osvětlení na obraze mince.jpg, (nejprve je nutné do obrazu osvětlení přidat)