Universitatea Politehnica
Facultatea de automatica si calculatoare
Procesarea si recunoasterea imaginilor
ENUNTUL TEMEI.
Procesarea unei imagini digitale folosind urmatorul set de filtre:
Filtre in domeniu spatial pentru netezire. Filtre liniare: filtre uniforme, filtre Gauss.
Filtre in domeniul spatial pentru netezire. Filtre neliniare: filtru median.
Filtre pentru cresterea imaginilor. Filtre trece-sus spatiale.
Filtre pentru detectarea fronturilor. Filtre Prewitt, Roberts, Sobel.
Filtre in domeniu frecventa. Filtre trece-sus si trece-jos.
Filtre in domeniu frecventa. Filtre trece-banda.
FILTRE LINIARE
Aplicarea filtrelor asupra imaginilor digitale ne permite sa obtinem diferite efecte.
Filtrele liniare se aplica prin operatia de convolutie (operatie liniara) cu un nucleu de convolutie. Convolutia este o operatie matematica care inlocuieste fiecare pixel prin suma ponderata a vecinilor. Matricea care defineste vecinatatea pixelului contine ponderile atribuite fiecarui pixel.
Un filtru T : A → B este liniar daca oricare ar fi x,y apartine la A si oricare ar fi a,b apartine la B
T ⋅x+ ⋅y)= ⋅T(x)+ ⋅T(y)
Daca spectrul semnalului si spectrul zgomotului nu se suprapun filtrele liniare ofera rezultate excelente. Exista situatii in care aceasta conditie nu este indeplinita, de exemplu la imagini, unde contururile se intind pe o banda foarte larga din spectru. In acest caz trebuie folosite filtre neliniare. Raspunsul la impuls al unui filtru liniar determina in totalitate proprietatile acestuia. Un filtru liniar cu oarecare utilitate nu are raspunsul la impuls zero. Din aceasta cauza, un filtru liniar nu poate elimina complet zgomotul de impulsuri. Se impune gasirea altor tipuri de filtre, mai eficiente, pentru eliminarea zgomotului de impulsuri.
Convolutia
Convolutia
Este un proces matematic care permite combinarea celor doua intrari
setul de pixeli din imaginea sursa;
matricea nucleu;
pentru obtinerea valoarii unui pixel din imaginea destinatie.
Astfel, putem spune ca pixelul rezultat este o combinatie liniara a setului de pixeli sursa.
Convolutia liniara aplicata unei matrici x cu nucleul hMxM:
Principala problema in aplicarea convolutiei este numarul mare de calcule care trebuie efectuate pentru aplicarea unui filtru. De exemplu, pentru o imagine de 320x200 careia i se aplica un filtru de convolutie de 9x9, vom avea aproximativ 5000000 de inmultiri si adunari (320x200x9x9).
Exista diferite tipuri de filtre:
Filtre uniforme
Acest filtru estompeaza muchiile prin medierea pixelilor din jurul acestora.Prin utilizarea unei matrici 9x9 se va obtine un efect de blur mai puternic.Imaginea rezultata se bazeaza pe o medie locala a filtrului de intrare unde toate valorile din suportul de filtru au aceeasi pondere. In domeniul continuu (x,y) functia de transfer are forma de mai jos, in cazul rectangular, respectiv circular. In domeniul discret [m,n] valorile filtrului sunt esantioane ale cazului domeniu continuu.
Filtru rectangular (J=K=5)
Inaintea aplicarii filtrului :
Iar dupa aplicarea filtrului :
Filtrul Gaussian
Este folosit cu precadere in aplicatii grafice pentru reducerea zgomotului si a detaliilor. Efectul vizual este unul de ceata asemanator cu vizualizarea unei imagini printr-un ecran translucid. Este folosit in analiza automata a imaginilor in etapa de preprocesare.
Din moment ce transformata Fourier a unui Gaussian este tot un Gaussian, filtrul reduce componentele de frecventa inalta, fiind astfel un filtru trece-jos.
Ecuatia Gaussiana in 2 dimensiuni este:
Unde - x este distanta de la origine pe axa orizontala
y este distanta de la origine pe axa verticala
este deviatia standard a distributiei Gauss
Aceasta formula produce o suprafata a carei contururi sunt cercuri concentrice cu o distributie Gauss pornind din centru.
Cu aceste valori se realizeaza o matrice de convolutie care se aplica imaginii originale. Valoarea fiecarui pixel este data de media ponderata a valorilor pixelilor vecini. Pixelul initial are cea mai mare valoare si pe masura ce creste distanta fata de el pixelii vecini primesc valori tot mai mici. Rezulta o ceata care respecta marginile mai bine decat alte filtre mai unifome.
In mod normal, este suficient ca un program de procesare de imagini sa calculeze o matrice de 6 x 6 pentru a obtine un rezultat destul de apropiat de distributia Gaussiana.
Filtrul poate fi aplicat la imaginile 2D prin 2 calcule independente 1D (separabilitate liniara).
Aplicarea succesiva a filtrului asupra unei imagini are acelasi efect ca si aplicarea unui filtru mai mare a carui raza este radical din suma patratelor razelor filtrelor aplicate.
Acest filtru este folosit pentru reducerea dimensiunii imaginilor.
Avantaje:
sau
Algoritmul este:
Pentru fiecare pixel (i,j):
Se va folosi o matrice intermediara in care se vor retine rezultatele dupa aplicarea primei etape de convolutie si asupra careia se va aplica etapa a doua de convolutie (inmultirea cu vectorul vertical).
Masca pe care am folosit-o noi in rpogramul sursa este:
Masca Gaussiana=(1/150)*
FILTRE NELINIARE
Filtrele neliniare (ordonate) sunt bazate pe un tip specific de statistica a imaginilor numita statistica ordonata. Ele se numesc neliniare pentru ca nu se pot aplica printr-un operator liniar (cum este cazul operatorului de convolutie). Aceste filtre inlocuiesc valoarea pixelului central. (similar cu procesul de convolutie). Statistica ordonata este o tehnica care aranjeaza toti pixelii intr-o ordine secventiala, bazata pe valoarea nivelelor de grii. Pozitia unui element in cadru acestei multimi ordonate va fi caracterizata de un rang.
Filtru median
Este un filtru trece-jos si selecteaza valoarea de mijloc a unui pixel dintr-o multime ordonata si il inlocuieste in pozitia corespunzatoarea din imaginea destinatie. Acest filtru nu reduce totusi contururile obiectelor (Pij este media in seria Pmn).
Filtrul median unidimensional de lungime N=2k+1 este definit de relatia:
y(i)=MED unde operatorul MED retine valoarea centrala dupa ordonare. Figura urmatoare ilustreaza modul de aplicare al unui filtru median unidimensional cu fereastra de lungime 9.
Efectul filtrarii mediane depinde atat de zgomotul suprapus peste semnalul original cat si de semnalul original. In Figura 1.6 se pot observa: semnalul original, semnalul original filtrat median (Figura 1.6.b) si diferenta dintre cele doua.
Filtrul median nu afecteaza semnalul constant si nici semnalul treapta. Semnalul liniar crescator isi pastreaza panta. Singurul efect al filtrarii mediane este faptul ca varful semnalului triunghiular este trunchiat pe o lungime de k +1 esantioane. Identic se intampla si la semnalul sinusoidal. Filtrul median este un filtru neliniar, adica nu este posibil sa aplicam operatia de filtrare separat pentru semnal si pentru zgomot.
Trebuie analizata atenuarea zgomotului pentru fiecare semnal separat. Performantele acestui tip de filtre pot fi analizate statistic. Rezultatele obtinute in urma acestei analize sunt aplicabile in majoritatea cazurilor. Daca, in urma unei astfel de analize, un filtru neliniar este considerat performant, trebuie retinut ca exista cazuri in care acesta ofera rezultate nesatisfacatoare.
Filtrul median atenueaza bine zgomotul gaussian (aproape la fel de bine ca filtrul de mediere). In cazul semnalului rampa filtrul median are
tendinta de a forma un model in trepte.
Inaintea aplicarii filtrului :
Dupa aplicarea filtruluii :
FILTRE PENTRU IMBUNATATIREA CALITATII IMAGINILOR
Filtrul trece sus spatial
Filtrarea spatiala a imaginilor digitale este o operatie care se aplica local la nivelul fiecarui pixel din imagine, inlocuind valoarea intesitatii/culorii pixelului curent cu o valoare ce depinde de valorile de intensitate/culoare ale pixelilor vecini (de aici si denumirea lor de filtre spatiale - se considera o vecinatate spatiala in sistemnul de coordonate asociat imaginii). Numarul de vecini luati in considerare va determina dimensiune filtrului (in general cu cat dimensiunea va fi mai mare efectul de filtrare va fi mai puternic. Filtrele spatiale pot fi folosite efectiv pentru o inlatura anumite tipuri de zgomote din imaginile digitale.
Filtru "trece sus". Filtru spatial care imbunatateste selectiv variatiile de contrast dintr-o imagine cu frecvente spatiale inalte. Imbunatateste contrastul imaginii si este o metoda de evidentiere a limitelor.
Sharpen =(1/3)*
Inaintea aplicarii filtrului :
Dupa aplicarea filtrului :
FILTRE PENTRU DETECTAREA FRONTURILOR
Filtrul Prewit neliniar
Este un filtru trece-sus care extrage contururile exterioare ale obiectelor. Evidentiaza variatiile de intensitate dupa axele verticala si orizontala.
Sunt folosite pentru a detecta marginile imaginilor prin aplicarea unui filtru vertical si orizontal. Practice se creaza o imagine unde marginile, portiunile mai mai clare-sharp sunt schimbare in nivele de gri. Ambele filter sunt aplicate pe imagine si apoi insumate pentru a forma rezultatul final. Cele doua filtre sunt de fapt filtre de convolutie de forma:
Filtru Orizontal |
Filtru Vertical |
||||||||||||||||||
|
|
De exemplu daca se foloseste o fereastra de 3x3
p1 |
p2 |
p3 |
p4 |
p5 |
p6 |
p7 |
p8 |
p9 |
unde filtrul este centrat in p5 iar p4 este pixelul[x-1][y] si p6 fiind pixelul[x+1][y], etc. apoi formula pentru a calcula pixelul p5 care rezulta este urmatoarea:
pixel = (p1+p2+p3-p7-p8-p9)+(p3+p6+p9-p1-p4-p7)
care este apoi redus la raza de 0-255.
Se observa ca formula de calcul foloseste componentele vertical si orizontala in forma finala.
pixel = SQRT((X*X)+(Y*Y))
unde X = (p1+p2+p3-p7-p8-p9) si Y = (p3+p6+p9-p1-p4-p7)
Detectarea muchiilor folosind filtrul Prewitt are la baza o matrice de 3x3 care poate fi ori verticala ori orizontala.
-1 0 1 1 1 1Considerand urmatoarele imagini de 3x3:
+---------+unde
a1 .. a8 sunt nivelele de gri ale fiecarui pixelOperatorul Prewitt
Operatorul Prewitt este asemanator cu operatorul Sobel, dar difera coeficientii folositi de masti:
masca orizontala masca verticala
Urmeaza convolutia imaginii cu cele doua masti. Pentru fiecare pixel al imaginii se cunosc doua numere: p1, corespunzand rezultatului mastii orizontale si p2, corespunzand rezultatului mastii verticale. Aceste doua numere se folosesc pentru a calcula doua metrice, magnitudinea muchiei si directia muchiei, definite astfel:
magnitudinea:
directia:
La fel cu operatorul Sobel, directia este perpendiculara pe directia aparenta a muchiei.
Rezultatul aplicarii filtrului:
Filtrul Sobel neliniar
Este de asemenea un filtru trece-sus care extrage contururile exterioare ale obiectelor. Evidentiaza variatiile de intensitate dupa axele verticala si orizontala. Spre deosebire de filtrul Prewitt sunt atribuite ponderi mai mari vecinilor de pe verticala si orizontala. Diferenta este sesizabila atunci cand se urmaresc pixeli izolati.
Filtrelele Sobel sunt asemanatoare cu filtrele Prewitt dar scot in evidenta usoare variatii ale intensitatii dupa o directie particulara careia i se atribuie o pondere mai mare:
Operatorul Sobel
Masca de detectie folosita de Sobel cauta muchii in ambele directii, orizontala si verticala, si apoi combina aceste informatii intr-o singura metrica. Cele doua masti, orizontala si verticala, sunt:
masca orizontala masca verticala
Urmeaza convolutia imaginii cu cele doua masti. Pentru fiecare pixel al imaginii se cunosc doua numere: s1, corespunzand rezultatului mastii orizontale si s2, corespunzand rezultatului mastii verticale. Aceste doua numere se folosesc pentru a calcula doua metrice, magnitudinea muchiei si directia muchiei, definite astfel:
magnitudinea:
directia:
Directia muchiei este perpendiculara pe muchia insasi, deoarece directia specificata este directia gradientului in lungul caruia nivelul de gri se schimba.
Rezultatul aplicarii filtrului:
FILTRE IN DOMENIUL FRECVENTA
Filtrele in domeniul frecventa se bazeaza pe transformata Fourier. Se ia o imagine si o functie de filtrare in domeniul Fourier. Imaginea este apoi multiplicata pixel cu pixel folosind acea functie.
Filtrele de frecventa prelucreza o imagine in domeniul de frecventelor. Imaginea este transformata Fourier, inmultita cu functia filtrului si dupa aceea retransformata in domeniul real. Atenuand frecventele inalte rezultata o imagine neteda in domeniul real,iar atenuand frecventele joase se accentueaza muchiile.
Toate filtrele in domeniul frecventelor pot fi de asemenea sa fie puse in aplicare in domeniul spatial si, daca acolo exista o masca simpla pentru efectul de filtru dorit, el este computational mult mai ieftin pentru a fi executat in domeniul real. Filtrele in domeniul frecventelor sunt recomandate daca o simpla masca nu poate fi gasita in domeniul spatial.
Multiplicarea in domeniul Fourier este indentica cu convolutia in domeniul spatialm astfel toate filtrele putand fi teoretic implementate ca si filtre spatiale.
Se disting astfel 3 tipuri de filtre: trece-jos, trece-sus si trece-banda.
Un filtru trece-jos atenueaza frecventele inalte si retine frecventele joase neschimbate.
Un filtru trece-sus pe de alta parte controleaza detectarea si imbunatatirea marginilor in domeniul spatial deoarece marginile imaginilor contin multiple frecvente inalte. Zonele cu nivele constante de gri constau in general frecvente joase si din acest motiv sunt eliminate.
Un filtru trece-banda atenueaza frecvente foarte joase si foarte inalte, si retine frecventele medii. Ele pot fi folosite pentru a imbunatatii marginile imaginilor (eliminand frecventele joase) in acelasi timp reducand si zgomotul (atenuand frecventele inalte). Practic filtrul trece banda este o combinatie intre filtrele trece-sus si trece-jos.Atenueaza toate frecventele care nu se afla intr-un anumit interval de frecventa.
Transformata Fourier
Transformata Fourier este o piesa foarte importanta in procesarea imaginilor care este folosita in descompunerea imaginii in compnentele sin si cos. Rezultatul transformarii reprezinta imaginea in domeniul Fourier sau domeniul frecventelor, in timp ce imaginea de intrare este in domeniul spatial echivalent. In domeniul Fourier fiecare punct al imaginii reprezinta o frecventa particulara continuta in domeniul real al imaginii.
Transformata Fourier este folosita intr-o mare varietate de aplicatii, precum analiza imaginilor, filtrarea imaginilor, reconstructia si compresia imaginilor. Ne intereseaza doar imaginile digitale asa ca ne vom rezuma numai la Transformata Fourier Discreta (TFD).
TDF este
definita ca:
Si inversa:
Pentru o imagine patrata de dimensiune NxN, transformata bidimensionala TFD este data de formula:
unde f(i,j) este functia asociata imaginii in domeniul spatial si exponentul lui e este functia de baza care corespunde fiecarui punct F(k,l) in domeniul Fourier. Ecuatia poate fi intrepretata ca: valoarea fiecarui punct F(k,l) este obtinuta prin inmultirea imaginii reale cu functia de baza corespunzatoare si adunand rezultatele.
Intr-un mod similar, imaginea in domeniul Fourier poate fi transformata inapoi in domeniul spatial aplicand functia inversa data de ecuatia:
Cum functioneaza
Filtrarea in domeniul frecventelor se bazeaza pe transformata Fourier. Operatorul primeste de obicei o imagine si o functie de filtrare in domeniul Fourier. Imaginea de intrare este apoi inmultita cu functia de filtrare pixel cu pixel:
unde F(k,l) este imaginea de intrare in domeniul Fourier , H(k,l) este functia de filtrare si G(k,l) este imaginea filtrata. Pentru a obtine imaginea rezultata in domeniul spatial, G(k,l), trebuie sa fie transformata inapoi folosind inversa transformatei Fourier.
Forma functiei de filtrare determina efectul operatorului. In general sunt 3 feluri de filtre diferite: trace jos, trece sus si trece banda. Un filtru trece jos atenueaza frecventele inalta si mentine frecventele joase intacte. Rezultatul in domeniul spatial este echivalent cu un filtru-mistrie, de inlaturare a zgomotelor, deoarece frecventele inalte bocate corespund unor schimbari exacte ale intensitatii.
Un filtru trece sus accentueaza marginile in domeniul spatial, deoarece marginile contin multe frecvente inalte. Zone de gri constante sunt alcatuite in principal de frecvente inalte si de aceea sunt atenuate.
Un filtru trece banda atenueaza frecventele foarte joase si foarte inalte dar mentine neschimbate frecventele intr-o anumita banda. Acest filtru este folosit pentru conturarea marginilor dar si reducerea zgomotelor in acelasi timp datorita eliminarii frecventelor extreme.
Cel mai simplu filtru trece jos este filtru trece jos ideal. Acesta elimina toate frecventele mai mari decat frecventa de taiere D0 si lasa frecventele mai mici neschimbate:
In majoritatea aplicatiilor, D0 este dat ca o fractie a celei mai mari frecvente din imaginea in domeniul Fourier.
Programarea transformatei Fourier (C/C++)
Am folosit pachetul de bibloteci Simple DirectMedia Layer: detalii Anexa 1.
Incepem cu declararea variabilelor si a functiilor. N si M sunt latimea si inaltimea imaginii in pixeli. Vom avea nevoie de vectori tridimensionali: doua dimensiuni pentru latime si inaltime si o dimensiune pentru componentele RGB ale culorii imagini. Acest lucru este datorat nevoii unei acutarateti superioare la reprezentarea imaginiilor: index 0 reprezinta rosu (Red), index 1 reprezinta verde (Green) si index 2 reprezinta albastru (Blue).
Matrice3D fRe(m_width,m_height,3);
Matrice3D fIm(m_width,m_height,3);//partea reala, partea imaginara si amplitudinea imaginii
Matrice3D FRe(m_width,m_height,3);
Matrice3D FIm(m_width,m_height,3);//partea reala, partea imaginara si amplitudinea transformatei Fourier
Matrice3D fRe2(m_width,m_height,3);
Matrice3D fIm2(m_width,m_height,3);//functia rezultata dupa prelucrarea in domeniul Fourier
Matrice3D FRe2(m_width,m_height,3);
Matrice3D FIm2(m_width,m_height,3);
Matrice3D FAmp2(m_width,m_height,3);//transformata Fourier dupa prelucrare
double pi = 3.1415926535897932384626433832795;
void draw(Matrice3D g) /deseneaza imaginea asociata unei functii
void TFD(int n, int m, bool inverse, Matrice3D gRe, Matrice3D gIm, Matrice3D &GRe, Matrice3D &GIm) /calculeaza transformata Fourier
void calculateAmp(int n, int m, Matrice3D &rezultat,Matrice3D gRe,Matrice3D gIm) / calculeaza amplitudinea unei functii complexe
Implementare TFD
Deoarece transformata Fourier este separabila poate fi scrisa sub forma:
unde
Functia TFD primeste ca parametrii 4 vectori: *gRe si *gIm din care citeste si *GRe si *GIm in care scrie rezultatele (acestea fiind transformata Fourier asociata imaginii). Ambele intrari si iesiri sunt numere complexe, datorita acestui fapt sunt folosite 2 vectori si nu unul. n si m sunt dimensiunile imaginii si din ele se obtine nr de pixeli ale imaginii. Parametrul inverse este folosit pentru a calcula inversa transformatei Fourier.
Pentru o calculare mai usoara a transformatei Fourier imaginea este perceputa ca o compunere intre doua functii unidimensionale una calculata pe linie iar cea de a doua calculata pe coloana.
Prima bucla din prelucrarea functiei unidimensionale este de la 0 la n parcurge toate liniile, a doua bucla de la 0 la m calculeaza fiecare pixel de pe linie, iar a treia bucla de la 0 la m face suma rezultatelor. Functia exponentiala este schimbata cu ajutorul formulei e^ix = cos(x) + i * sin(x), si partea imaginara si cea reala sunt calculate separat. In final totul este impartit la m in asa fel incat valorile obtinute sa fie destul de mici pentru a putea fi reprezentate.
Pentru a calcula inversa transformatei Fourier trebuie ca parametrul invers sa fie "true" iar rezulatatul obtinut dupa parcurgerea celor doua bucle sa fie impartit la n.Functia calculeaza transforamata Fouriere pentru fiecare linie si coloana, si se repetata de doua ori, separat pentru fiecara componenta a culorii. Functia draw deseneaza functiile in imaginii reprezentate in 24-bit RGB cu coltul stanga sus fiind xpos si xPos.
Filtrul trece jos, trece sus
Filtrele trece-sus, trece-jos lasa sa treaca frecventele inalte/joase
FTJ -pentru eliminarea zgomotelor
FTS -accentuarea contururilor
Pentru a imbunatati imaginile in domeniul frecventelor trebuie calculata mai intai transformata fourier a imaginii ce urmeaza a fi imbunatatita apoi rezultatul obtinut se multiplica cu o functie filtru, dupa care se face calculul transformatei fourier inverse pentru a obtine imaginea imbunatatita.
Filtrul trece jos ideal
Figura 1. Raspunsul in frecventa al unui filtru trece jos ideal.
Spectrul din domeniul (w wc) este neafectat de acest filtru dar componentele spectrale cu frecvente din exteriorul acestei benzi sunt anulate. Valoarea wc, ce separa benzile de trecere si de blocare, este numita frecventa de taiere. Se obisnuieste sa se introduca o marime, numita atenuare, definita ca inversul modulului raspunsului in frecventa. Pentru cazul din figura 1.1.1.1 atenuarea in banda de trecere este 1 iar in banda de oprire este infinita. Raspunsul la impuls al filtrului trece jos ideal este infinita. Raspunsul la impuls al filtrului trece jos ideal este:
Se constata ca acest raspuns la impuls este nenul si la momente negative. De
aceea filtrul trece jos ideal este un sistem nerealizabil. In consecinta caracteristica de frecventa din figura 1.1.1.1. poate fi doar aproximata prin caracteristici de frecventa ale unor filtre realizabile.
Inaintea aplicarii filtrului :
Dupa aplicarea filtruluii :
Filtrul trece sus ideal
Figura 2. Raspunsul in frecventa al unui fitru trece sus ideal.
Raspunsul la impuls al acestui sistem este:
Nici acest sistem nu este cauzal si deci nici realizabil. De aceea si filtrele trece
sus ideale pot fi doar aproximate in practica.
Inaintea aplicarii filtrului :
Dupa aplicarea filtruluii :
Filtrul trece banda
Atenueaza frecvente foarte joase si foarte inalte, si retine frecventele medii. Ele pot fi folosite pentru a imbunatatii marginile imaginilor (eliminand frecventele joase) in acelasi timp reducand si zgomotul (atenuand frecventele inalte). Practic filtrul trece banda este o combinatie intre filtrele trece-sus si trece-jos.Atenueaza toate frecventele care nu se afla intr-un anumit interval de frecventa.
Inaintea aplicarii filtrului :
Dupa aplicarea filtruluii :
SURSA PROGRAMULUI :
Filtrul Gauss
#include 'StdAfx.h'
#include 'CpriEdge.h'
#include <math.h>
CpriEdge::CpriEdge(CString var_path)
else AfxMessageBox(L'Selectati o imagine!');
}
CpriEdge::~CpriEdge(void)
void CpriEdge::OnDraw(CDC* pDC)
CSize sizeTotal;
sizeTotal.cx = imagine.GetWidth();
sizeTotal.cy = imagine.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
dc.DrawState(CPoint(0,0),0,imagine.Detach(),0,0);
}
void CpriEdge::ImageProcessing()
}
newPixelR/=150;
newPixelG/=150;
newPixelB/=150;
culoare=RGB((BYTE)newPixelR,(BYTE)newPixelG,(BYTE)newPixelB);
m_img_final.SetPixel(col,row,culoare);
}
m_img_final.Save(L'rezultat_gauss.bmp');
LPCTSTR CpriEdge::ExportImageName()
Filtrul uniform
// priUniform.cpp : implementation file
#include 'stdafx.h'
#include 'priUniform.h'
#include <math.h>
// CpriUniform
CpriUniform::CpriUniform(CString var_path)
else AfxMessageBox(L'Selectati o imagine!');
}
}
CpriUniform::~CpriUniform()
void CpriUniform::OnDraw(CDC* pDC)
CSize sizeTotal;
sizeTotal.cx = imagine.GetWidth();
sizeTotal.cy = imagine.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
dc.DrawState(CPoint(0,0),0,imagine.Detach(),0,0);
}
// CpriUniform message handlers
void CpriUniform::ImageProcessing()
}
newPixelR/=25;
newPixelG/=25;
newPixelB/=25;
if(newPixelR<0) newPixelR =0;
if(newPixelG<0) newPixelG =0;
if(newPixelB<0) newPixelB =0;
if(newPixelR>255) newPixelR =255;
if(newPixelG>255) newPixelG =255;
if(newPixelB>255) newPixelB =255;
culoare=RGB((BYTE)newPixelR,(BYTE)newPixelG,(BYTE)newPixelB);
m_img_final.SetPixel(col,row,culoare);
}
m_img_final.Save(L'rezultat_uniform.bmp');
LPCTSTR CpriUniform
::ExportImageName()
Filtrul Trece-Sus Spatial
#include 'stdafx.h'
#include 'CpriTSspatial.h'
#include <math.h>
CpriTSspatial::CpriTSspatial(CString var_path)
else AfxMessageBox(L'Selectati o imagine!');
}
}
CpriTSspatial::~CpriTSspatial()
void CpriTSspatial::OnDraw(CDC* pDC)
CSize sizeTotal;
sizeTotal.cx = imagine.GetWidth();
sizeTotal.cy = imagine.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
dc.DrawState(CPoint(0,0),0,imagine.Detach(),0,0);
}
void CpriTSspatial::ImageProcessing()
}
newPixelR/=3;
newPixelG/=3;
newPixelB/=3;
if(newPixelR<0) newPixelR =0;
if(newPixelG<0) newPixelG =0;
if(newPixelB<0) newPixelB =0;
if(newPixelR>255) newPixelR =255;
if(newPixelG>255) newPixelG =255;
if(newPixelB>255) newPixelB =255;
culoare=RGB((BYTE)newPixelR,(BYTE)newPixelG,(BYTE)newPixelB);
m_img_final.SetPixel(col,row,culoare);
}
m_img_final.Save(L'rezultat_ts_spatial.bmp');
LPCTSTR CpriTSspatial::ExportImageName()
Filtrul pentru detectia muchiilor (Sobell si Prewitt)
#include 'StdAfx.h'
#include 'CpriSobel.h'
#include <math.h>
CpriSobel::CpriSobel(CString var_path)
else AfxMessageBox(L'Selectati o imagine!');
}
CpriSobel::~CpriSobel(void)
void CpriSobel::OnDraw(CDC* pDC)
CSize sizeTotal;
sizeTotal.cx = imagine.GetWidth();
sizeTotal.cy = imagine.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
dc.DrawState(CPoint(0,0),0,imagine.Detach(),0,0);
}
void CpriSobel::ImageProcessing(int flag)
}
newPixelR/=150;
newPixelG/=150;
newPixelB/=150;
if(newPixelR<0) newPixelR =0;
if(newPixelG<0) newPixelG =0;
if(newPixelB<0) newPixelB =0;
if(newPixelR>255) newPixelR =255;
if(newPixelG>255) newPixelG =255;
if(newPixelB>255) newPixelB =255;
culoare=RGB((BYTE)newPixelR,(BYTE)newPixelG,(BYTE)newPixelB);
imagine.SetPixel(col,row,culoare);
}
/* Masca Sobel */
if(flag==1)
/* Masca Prewit */
else if(flag==2)
for (row = 1; row <H-1 ; row++)
}
if(newPixelR<0) newPixelR =0;
if(newPixelG<0) newPixelG =0;
if(newPixelB<0) newPixelB =0;
if(newPixelR>255) newPixelR =255;
if(newPixelG>255) newPixelG =255;
if(newPixelB>255) newPixelB =255;
culoare=RGB((BYTE)newPixelR,(BYTE)newPixelG,(BYTE)newPixelB);
m_img_final.SetPixel(col,row,culoare);
}
if(flag==1)
m_img_final.Save(L'rezultat_sobel.bmp');
else if(flag==2)
m_img_final.Save(L'rezultat_prewit.bmp');
LPCTSTR CpriSobel::ExportImageName(int flag)
Filtrul median
void CpriDlg::OnFiltru_Median()
CString s_Dimension;
//m_dimension.GetWindowText(s_Dimension); //trebuie citita valoarea
if (s_Dimension.IsEmpty())
//verifica daca numarul este impar
int i_fer=_ttoi(s_Dimension);
if (i_fer>25)
if (i_fer%2 == 0)
m_img_final.Destroy();
m_img_final.Load(m_filename);
/*** implementarea filtrului ***/
int i_height, i_width;
//preluam Height-ul si Width-ul imaginii
i_width=m_image.GetWidth();
i_height=m_image.GetHeight();
//Dimensiunea ferestrei i_fer --> se citeste
//offset se fol pt identific matricei definita de vecinii pixelului in cauza
int i_offset =(int)((i_fer-1)/2);
int sortat; //boolean
//parcurgem matricea pixel cu pixel
//COLORREF pixels[9];
COLORREF pixels[625];
int i,j,m,n,dim,k;
for (i=i_offset; i<i_width-i_offset; i++)
}//end while
m_img_final.SetPixel(i,j,pixels[(dim-1)/2]);
}
}
//salveaza fisierul cu extensia gif si se adauga un nr la sfarshit
char c[2];
itoa(i_Contor,c,10);
//CString s_filename = m_filename.Left(m_filename.Find('.')) + '_' + '.gif' ;
CString s_filename = m_filename.Left(m_filename.Find('.')) + CString('_') + CString(c) + CString('.gif') ;
//strcat(
i_Contor++;
m_after_pic.SetBitmap((HBITMAP)m_img_final);
m_after_pic.Invalidate();
m_img_final.Save(s_filename);
Filtre in domeniul frecventa
#include 'StdAfx.h'
#include 'CpriFrecventa.h'
CpriFrecventa::CpriFrecventa(CString var_path)
else AfxMessageBox(L'Selectati o imagine!');
}
CpriFrecventa::~CpriFrecventa(void)
void CpriFrecventa::OnDraw(CDC* pDC)
CSize sizeTotal;
sizeTotal.cx = imagine.GetWidth();
sizeTotal.cy = imagine.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
dc.DrawState(CPoint(0,0),0,imagine.Detach(),0,0);
}
// TODO: add draw code for native data here
void CpriFrecventa::OnSetFilter(int min,int max)
COLORREF ref;
Matrice3D fRe(m_width,m_height,3);
Matrice3D fIm(m_width,m_height,3);
Matrice3D FRe(m_width,m_height,3);
Matrice3D FIm(m_width,m_height,3);
Matrice3D fRe2(m_width,m_height,3);
Matrice3D fIm2(m_width,m_height,3);
Matrice3D FRe2(m_width,m_height,3);
Matrice3D FIm2(m_width,m_height,3);
Matrice3D FAmp2(m_width,m_height,3);
for(int x = 0; x < m_width; x++)
}
TFD(m_width, m_height, 0, fRe2, fIm2, FRe, FIm);
filtruBanda(min,max,FRe ,FIm,FRe2,FIm2);
TFD(m_width, m_height, 1, FRe2, FIm2, fRe, fIm);
calculateAmp(m_width, m_height,FAmp2, FRe2, FIm2);
draw(fRe);//(FAmp2);
//Invalidate();
void CpriFrecventa::TFD(int n, int m, bool inverse, Matrice3D gRe,Matrice3D gIm, Matrice3D &GRe, Matrice3D &GIm)
}
}
}
//calc transformata fourier pe linii
for(int y = 0; y < m; y++)
if(inverse)
else
}
}
}
void CpriFrecventa::filtruBanda(int fSus, int fJos, Matrice3D FRe ,Matrice3D FIm,Matrice3D &FRe2, Matrice3D &FIm2)
else
void CpriFrecventa::calculateAmp(int n, int m, Matrice3D &gAmp,Matrice3D gRe,Matrice3D gIm)
}
}
void CpriFrecventa::draw(Matrice3D g) //g este imaginea ce trebuie desenata
}
imagine.Save(L'rezultat_frecv.bmp');
LPCTSTR CpriFrecventa::ExportImageName()
CONCLUZII :
Filtre liniare:
Filtre uniforme:
Acest filtru estompeaza muchiile prin medierea pixelilor din jurul acestora.In cazul programului nostru am folosit o matrice de 5x5. Prin utilizarea unei matrici de dimensiune 9x9 se va obtine un efect de blur mai puternic.
Filtre gauss:
Filtrele Gauss (Blur) localizeaza tranzitii semnificative de culori intr-o imagine, iar pe urma creaza culori intermediare pentru a netezii marginile.
Valoarea din mijloc e cea care se poate altera cu acest filtru si se poate observa ca valorile implicite in mod special vor crea un efect circular, pixelii vor avea o pondere tot mai mica cu cat se departeaza de mijloc.
Un astfel de filtru va genera o imagine asemenea unor imagini nefocusate.
Filtre neliniare:
Filtrul median:
In procesarea imaginilor un pas important este inlaturarea zgomotului dintr-o imagine inaintea aplicarii unor procesari mai avansate.
Filtrul median este deseori folosit pentru inlaturarea zgomotului sau a altor semnale nedorite dintr-o imagine.
Filtre pe imbunatatirea calitatii imaginilor
Filtrul Trece-Sus spatial :
Daca acest filtru este comparat cu cel Gaussian se observa ca este aproape opusul filtrului gauss.
Mareste calitatea imaginii prin sporirea diferentei intre pixeli. Cu cat diferenta e mai mare intre pixelii cu pondere negativa si pixel care este modificat, cu atat e mai mare schimbarea valorii pixelui principal.
Gradul de marire a calitatii poate fi ajustat prin schimbarea valorii centrale.
Pentru ca efectul sa se vada mai bine, am probat filtrul pe o imagine asupra careia s-a aplicat anterior filtrul Gauss pentru uniformizare.
Filtre pentru detectarea fronturilor
Se folosesc 2 masti diferite de convolutie pentru a detecta marginile imaginii, Sobell si Prewitt. In primul caz vom aplica un filtru cu parcurgere orizontala in timp ce in al 2-lea caz va fi cu parcurgere verticala.
|
|
Pentru a detecta marginile intr-o imagine se cauta zonele de contrast. Astfel se aplica o masca cu pondere negativa pe o parte si pozitiva pe cealalta parte, avand efectul sa tinda la zero daca valorile pixelilor in imagine sunt apropiate sau sa mareasca contrastul daca acesta exista. Pentru rezultate mai bune, inainte de a aplica filtrul pentru detectarea muchiilor, se aplica un filtru Gauss de uniformizare a imaginii cu scopul de inlatura zgomotul de imagine si deci zonele de contrast in plus.
Filtre in domeniul frecventa
Daca calculam direct cu functia de transformare Fourier pentru a reveni din domeniul frecventelor in domeniul real am fi obtinut imaginea rotita la 180 de grade.
Ambele componente reala si imaginara sunt folosite pentru a reconstrui imaginea din domeniul Fourier desi imaginea in domeniul real nu are parte imaginara.
Desi imaginea este in domeniul 24-bit color, care inseamna ca fiecare pixel are o culoare pe 8 biti, sau 256 de valori pentru o culoare, transformata Fourier are nevoie de o precizie mult mai mare si pentru componenta reala si pentru cea imaginara si este nevoie de numere reale care pot lua valori de la -infinit la +infinit (de aceea am folosit tipul double). Altfel am fi pierdut multa informatie si la transformarea inversa a imaginii aceasta ar fi parut foarte deformata. Oricum imaginea afisata pe ecran nu contine toate informatiile deoarece am convertit numerele reale inapoi in numere intregi cu 256 de valori.
Pastrand amplitudinea imaginii in domeniul Fourier, nu se obtine imaginea completa la transformarea inversa deoarece este nevoie de o precizie foarte mare pentru ambele componente ale spectrului si nu de amplitudine.
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |