Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Filtru pentru cresterea calitatii si detectarea fronturilor

Film


Universitatea "Politehnica" Timisoara



PRELUCRAREA SI RECUNOASTEREA IMAGINILOR

PROIECT

"Filtru pentru cresterea calitatii si detectarea fronturilor.

Filtre Roberts, Sobel si Prewitt."

Nume:

Tudor Bastea, an V C, H2, gr.1.1

Cosmin Belei, an V C, H2, gr 1.1

1. Analiza

Extragerea contururilor este o etapa necesara pentru a realiza caracterizarea regiunilor din imagine īn vederea identificarii obiectelor din lumea reala. Īn plus aceasta operatie faciliteaza o reducere importanta a volumului de informatie de la sute de mii sau milioane de pixeli la mii de puncte de contur. Vom privi contururile ca pe granitele regiunilor care alcatuiesc imaginile obiectelor. Segmentarea este operatia prin care se pun īn evidenta regiunile din imagine. Daca suprafetele din scena ar primi lumina numai direct de la sursa de lumina, atunci muchiile ar corespunde la variatii ale intensitatii luminoase de tip treapta, impuls, scara, rampa, sau creasta. Daca se ia īn considerare faptul ca pe de o parte, suprafe&# 14514h720o 355;ele reflecta lumina unele spre altele (reflexii), iar pe de alta parte aceasta reflexie se poate face īntr-o directie unica sau īn toate directiile, atunci pentru muchii pot apare profile de variatie de tipuri mult diferite de cele ideale.

Detectarea conturului unei imagini se poate face calculand gradientul in fiecare punct al imaginii. Aceasta metoda se bazeaza pe presupunerea ca punctele din contur au gradient mare.

 

In figura de mai sus, este prezentat un punct de pe contur si vectorul gradientului corespunzator. In acel punct, intensitatea culorii se schimba de la 0 la 255 in directia gradientului. Daca se calculeaza gradientul in zone uniform colorate, vom avea un vector nul, care inseamna cu nu avem puncte de pe contur.  Intensitatea conturului este egala cu marimea gradientului, care se calculeaza folosind cele 2 derivate (pe orizontala si pe verticala).
Pentru functiile discrete, gradientul nu poate fi folosit. In acest caz, sunt folositi operatori, cum ar fi: Roberts, Sobel si Prewitt.
Aceste metode folosesc convolutia. Convolutia este o operatie matematica prin care se "inmultesc" doua siruri de numere. Se utilizeaza doua matrice, pentru a detecta schimbarea intensitatii luminii pe verticala, respectiv pe orizontala. Aceste matrice pot avea dimensiuni diferite, de exemplu 2 (Roberts) sau 3 (Sobel, Prewitt).

Notam valorile intensitatii in punctele alaturate cu a0..a7, ca in figura de mai jos:

Matricele si formulele de calcul ale derivatelor sunt:

  • pentru Roberts:

  • pentru Sobel

unde c=2

  • pentru Prewitt

unde c=1

Gradientul se va calcula dupa formula:

Vom calcula valoare lui G pentru fiecare punct al imaginii, iar aceste valori obtinute vor fi alcatui tocmai imaginea de iesire, adica imaginea dupa aplicarea respectivului filtru.

Imagine originala

Dupa aplicarea filtrului Roberts

Dupa aplicarea filtrului Sobel

Dupa aplicarea filtrului Prewitt

2. Proiectarea

Pentru a implementa cele 3 filtre, vom folosit Delphi 5, iar imaginile manipulate vor fi in format PGM. Am ales acest format din cauza simplitatii sale, si anume:

P5
# Copyright notice


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 3 3 3 0 0 7 7 7 7 0 0 200 11 11 11 0 0 15 15 15 15 0
3 0 0 0 0 0 7 0 0 0 0 0 200 0 0 0 0 0 15 0 0 15 0
3 3 3 0 0 0 7 7 7 0 0 0 11 11 255 0 0 0 15 44 23 15 0
3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
3 0 0 0 0 0 7 7 7 7 0 0 11 11 69 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Prima linie reprezinta formatul PGM, a doua reprezinta informatii despre aplicatia ce l-a generat, a treia linie contine numarul de pixeli pe orizontala, respectiv verticala, a patra linie contine intensitatea maxima a culorii, iar apoi este informatia propriu-zisa, in codul ASCII (in exemplul de mai sus sunt trecute codurile ASCII corespunzatoare, si nu caracterul propriu-zis). Antetul este citit inainte de a incepe calculul efectiv, pentru a sti dimensiunile imaginii. Imaginea de iesire va contine acelasi header ca si imaginea originala. Dimensiunea maxima a fisierului de intrare este 500 / 500 pixeli, fiindca in program am folosit un array cu aceste dimensiuni.

Fiecare filtru va avea dedicata o procedura in cadrul programului. Sobel si Prewitt folosesc pentru calculul gradientului valoarea pixelilor alaturati, deci nu se poate calcula pe marginile imaginii si am cosiderat gradienul egal cu 0. In continuare vom folosi 2 cicluri "for" prin care vom calcula valoarea derivatelor si a gradientului. La terminarea aplicarii gradientului pe o linie vom scrie linia respectiva in fisierul de iesire.

3. Implementare

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button3: TButton;
Button2: TButton;
Edit1: TEdit;
od: TOpenDialog;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation


var fi,fo:file;
f:text;
ch:char;
NumRead, NumWritten: integer;
Buf: array[1..2048] of Char;
data:array[1..500,1..500] of byte;
ampl:array[1..500] of byte;
col, lin:integer;
coloana, linia: integer;
gx,gy:integer;

procedure roberts;
var i:integer;
g:byte;
begin
assign(fi,form1.edit1.text);
reset(fi,1);
assign(fo,'roberts.pgm');
rewrite(fo,1);
i:=0;
Blockread(fi,data[1],59);
BlockWrite(fo, data[1], 59, Numwritten);
repeat
i:=i+1;
BlockRead(fi, data[i], col, NumRead);
until (NumRead = 0);
Close(fi);
//----- ----- ----gata citirea------------

for linia:=1 to lin do
begin
for coloana:=1 to col do
begin
if (linia=lin) OR (linia=1) then
ampl[coloana]:=0
else
begin
gx:=data[linia][coloana+1]-data[linia][coloana];
gy:=data[linia+1][coloana]-data[linia][coloana];
g:=round(sqrt(gx*gx+gy*gy));

if (g>255) then g:=255;
ampl[coloana]:=g;
end
end;
ampl[coloana]:=0;
BlockWrite(fo, ampl, col, Numwritten);
end;

//----- ----- ----gata scrierea-------------
Close(fo);
end;

procedure sobel;
var i:integer;
g:byte;
begin
assign(fi,form1.edit1.text);
reset(fi,1);
assign(fo,'sobel.pgm');
rewrite(fo,1);
i:=0;
Blockread(fi,data[1],59);
BlockWrite(fo, data[1], 59, Numwritten);
repeat
i:=i+1;
BlockRead(fi, data[i], col, NumRead);
until (NumRead = 0);
Close(fi);
//----- ----- ----gata citirea------------

for linia:=1 to lin do
begin
for coloana:=1 to col do
begin
if (linia=lin) OR (linia=1) then
ampl[coloana]:=0
else if (coloana=0) OR (coloana=col) then
ampl[linia]:=0
else
begin
gx:=round(
- (data[linia-1][coloana-1] + 2*data[linia][coloana-1] + data[linia+1][coloana-1])
+ (data[linia-1][coloana+1] + 2*data[linia][coloana+1] + data[linia+1][coloana+1]));

gy:=round(
- (data[linia-1][coloana-1] + 2*data[linia-1][coloana] + data[linia-1][coloana+1])
+ (data[linia+1][coloana-1] + 2*data[linia+1][coloana] + data[linia+1][coloana+1]));


g:=round(sqrt(gx*gx+gy*gy));
if (g>255) then g:=255;
ampl[coloana]:=g;
end
end;
BlockWrite(fo, ampl, col, Numwritten);
end;

//----- ----- ----gata scrierea-------------
Close(fo);
end;

procedure prewitt;
var i:integer;
g:byte;
begin
assign(fi,form1.edit1.text);
reset(fi,1);
assign(fo,'prewitt.pgm');
rewrite(fo,1);
i:=0;
Blockread(fi,data[1],59);
BlockWrite(fo, data[1], 59, Numwritten);
repeat
i:=i+1;
BlockRead(fi, data[i], col, NumRead);
until (NumRead = 0);
Close(fi);
//----- ----- ----gata citirea------------

for linia:=1 to lin do
begin
for coloana:=1 to col do
begin
if (linia=lin) OR (linia=1) then
ampl[coloana]:=0
else if (coloana=0) OR (coloana=col) then
ampl[linia]:=0
else
begin
gx:=round(
- (data[linia-1][coloana-1] + data[linia][coloana-1] + data[linia+1][coloana-1])
+ (data[linia-1][coloana+1] + data[linia][coloana+1] + data[linia+1][coloana+1]));

gy:=round(
- (data[linia-1][coloana-1] + data[linia-1][coloana] + data[linia-1][coloana+1])
+ (data[linia+1][coloana-1] + data[linia+1][coloana] + data[linia+1][coloana+1]));

g:=round(sqrt(gx*gx+gy*gy));
if (g>255) then g:=255;
ampl[coloana]:=g;
end
end;
BlockWrite(fo, ampl, col, Numwritten);
end;

//----- ----- ----gata scrierea-------------
Close(fo);
end;

procedure citesteheader;
var header:integer;
c:char;
s,s1:string;
i,err:integer;
f:text;
begin
header:=0;
assignfile(f,form1.edit1.text);
reset(f);
for i:=1 to 47 do //sarim peste copyright
read(f,c);
s:='';
while (c<>' ') do
begin
read(f,c);
s:=s+c;
end;
delete(s,length(s),1); val(s,col,err);

s:=''; read(f,c); s:=s+c; read(f,c); s:=s+c; read(f,c); s:=s+c;
val(s,lin,err);

closefile(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
citesteheader
roberts
end

procedure TForm1.Button2Click(Sender: TObject);
begin
citesteheader
prewitt
end

procedure TForm1.Button3Click(Sender: TObject);
begin
citesteheader
sobel
end

procedure TForm1.Button4Click(Sender: TObject);
begin
if od.execute then edit1.text:=od.filename;
end

end

4. Concluzii

Rezultatele obtinute in urma celor 3 filtre permit tragerea unor concluzii despre operatorii de detectie a contururilor.

Filtrul Roberts produce contururi mai fine si mai bine localizate, deoarece este un filtru diferential de talie minima (2*2). Este preferata si pentru ca are o implementare foarte simpla si eficienta. Principalul dezavantaj este sensibilitatea la zgomot si eficacitatea scazuta in cazul contururilor mai putin pronuntate. Aceste dezavantaje recomanda acest filtru pentru prelucrearea imaginilor naturale, unde contururile sunt bine definite si fara zgomot.

Filtrele Sobel si Prewitt produc contururi mai "imprastiate", dar nu sunt atat de sensibile la zgomot ca si Roberts. Prewitt elimina mai putin bine zgomotele ca Sobel. Filtrul Prewitt produce imagini mai clare decat Sobel.



Document Info


Accesari: 1830
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )