Přejít na obsah

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ě

1234

5678

9101112

výsledek po průměrování

vys

 

lokální průměrování

Konvoluce

 

konvolucev 1D

 

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

dokumentace np.convolve 

 

Matlab:

conv ([3 10 10 1 2 2],[1 -2 1])

3 4 -7 -9 10 -1 -2 2

 

Konvoluce 2D

graficeké znázornění

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)

 

ukazka 

 

zašumněný obraz odstranění šumu

sumpcsumprc

detail

sumpsumpr

 

výběrové kvantily (medián)

 

Python:

med_denoised = ndimage.median_filter(noisy, 3)

ukázka

Další kvantilové filtry

ndimage.maximum_filterndimage.percentile_filter

Nelineární filtry

scipy.signal.wiener

 

Matlab:

medfilt2(obraz,[3 3]);


zašumněný obraz odstranění šumu

sumpcsummc

 

detail

sumpsummm

 

 

Gradientní operátory

zkušební obrazy

s1s2

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');

roberts1roberts2

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)

ukázka

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');

sobel1sobel2

průchody nulou

edge(obraz,'zerocros');

zerocros1zerocros2

Cannyho detektor

edge(obraz,'canny');

canny1canny2

Python 

edges2 = skimage.filter.canny(im, sigma=3)

ukázka

 

Canny hranovy detektor

 

detekce čáry mfile cary

 

carycary2

detekce bodu mfile body

body1cary2

 

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:

osvetleni

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)

příklady matlab , přiklady C

 

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)