Prelucrarea si recunoasterea imaginilor

Jan 10

1. Tema proiectului

Sa se implementeze un filtru trece banda in domeniul frecventa folosit pentru prelucrarea imaginilor.

Ca medii de programare se va folosi Visual C++, Visual C#, Java sau PHP.

2. Studiul problemei

Pentru realizarea îmbunătăţirii si restaurarii imaginilor în domeniul frecvenţelor se utilizeaza filtrele. Din categoria filtrelor liniare cele mai intalnite sunt: filtrele trece-jos, filtrele trece-sus si filtrele trece-banda.

Al treilea tip de filtre numite filtre trece-bandă, lasa sa treaca zone ale frecvenţelor situate între frecvenţele înalte şi frecvenţele joase. Aceste filtre se pot realize si prin combinarea unui filtru trece-jos cu un filtru trece-sus.

Aceste filtre sunt utilizate în restaurarea imaginilor fiind foarte rar utilizate în îmbunătăţirea imaginilor.

In figure urmatoare este redata o sectiune printr-un filtru trece-banda in domeniul frecventelor:

fL si fH sunt frecventele de taiere iar B=[fL, fH] reprezinta banda de trecere.

Pentru realizarea îmbunătăţirii si a restaurarii imaginilor în domeniul frecvenţelor trebuie calculată mai întâi transformata Fourier a imaginii ce urmează a fi îmbunătăţită, multiplicarea rezultatului cu o funcţie filtru, după care se face calculul transformatei Fourier inverse pentru a obţine imaginea îmbunătăţită.

Fiind data functia continua f(x) de o variabila reala x, transformata Fourier notata cu F{f(x)} este definita prin ecuatia:

unde j = Ö-1.

Fiind dat F(u), f(x) poate fi obtinut prin utilizarea transformatei Fourier inverse:

Ca şi în cazul îmbunătăţirii imaginilor, scopul final al tehnicilor de restaurare constă în îmbunătăţirea calităţii imaginilor într-un anumit sens. Pentru diferenţiere considerăm restaurarea ca fiind procesul care urmăreşte să reconstruiască sau să recupereze o imagine care a fost degradată, utilizând cunoştinţe apriori despre fenomenul ce a realizat degradarea. Astfel, tehnicile de restaurare sunt orientate în direcţia modelării fenomenului ce a realizat degradarea şi a aplicării fenomenului invers în scopul recuperării imaginii originale.

Pentru a implementa acest filtru, am ales ca mediu de programare Visual C#.

Am folosit bibliotecile:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Drawing.Imaging;

using System.Text;

using System.Windows.Forms;

Pe imaginea aleasa am aplicat un filtru trece jos,si imaginea rezultata am folosit-o ca si intrare pentru filtrul trece sus.

Pentru interfata cu utilizatorul am creat un form :in care apare imaginea initiala,apoi imaginea Gray-Scale si imaginea rezultata in urma aplicarii filtrului trece banda.

Claritatea si intensitatea pot fi alese de utilizator;

Pt claritate:intre 3 si 29,valori impare

Pt intensitate:intre 1 si 1000.

//Filtru trece-jos

int LowpassSize =(int)val1.Value;//insert an odd size: 3, 5, 7, …, 29.

int MidWeight = (int)val2.Value; //set a positive mid weight: 1, 2, 3, …, 1000.

int hh=poza_gri.Size.Height;

int ww=poza_gri.Size.Width;

int i1,j1,i2,j2,sum,ggri;

int d = LowpassSize / 2;

float divisor = (2 * d + 1) * (2 * d + 1) + MidWeight – 1;//MidWeight == 1 means no weight

Bitmap Lowpass;

Byte[,] gg_array;

Lowpass = new Bitmap(ww, hh, PixelFormat.Format24bppRgb);

gg_array = new Byte[ww, hh];

for (j1 = 0; j1< hh; j1++)

for (i1 = 0; i1 < ww; i1++)

{

color = poza_gri.GetPixel(i1, j1);

ggri = (color.R + color.G + color.B) / 3;

gg_array[i1, j1] = (Byte)ggri;

}

for (j1 = d; j1 < hh – d; j1++)

for (i1= d; i1 < ww – d; i1++)

{

sum = (MidWeight – 1) * gg_array[i1, j1];

for (j2 = -d; j2 <= d; j2++)

for (i2 = -d; i2 <= d; i2++)

sum += gg_array[i1 + i2, j1 + j2];

ggri = Convert.ToByte((float)sum / divisor);

Lowpass.SetPixel(i1, j1, Color.FromArgb(ggri, ggri, ggri));

}

//Filtru trece-sus

HighHorizontal = new Bitmap(w, h, PixelFormat.Format16bppRgb555);

HighVertical = new Bitmap(w, h, PixelFormat.Format16bppRgb555);

HighGradient = new Bitmap(w, h, PixelFormat.Format16bppRgb555);

g_array = new Byte[w, h];

for (j = 0; j < h; j++)

{

for (i = 0; i < w; i++)

{

col = Lowpass.GetPixel(i, j);

gri = (col.R + col.G + col.B) / 3;

g_array[i, j] = (Byte)gri;

}

}

for (j = 1; j < h – 1; j++)

for (i = 1; i < w – 1; i++)

{

sum_st = g_array[i – 1, j] + g_array[i – 1, j – 1] + g_array[i – 1, j + 1];

sum_dr = g_array[i + 1, j] + g_array[i + 1, j – 1] + g_array[i + 1, j + 1];

sum_sus = g_array[i, j – 1] + g_array[i – 1, j – 1] + g_array[i + 1, j – 1];

sum_jos = g_array[i, j + 1] + g_array[i – 1, j + 1] + g_array[i + 1, j + 1];

diff = Math.Abs(sum_st – sum_dr);

if (diff > 255)

HighHorizontal.SetPixel(i, j, Color.FromArgb(255, 255, 255));

else

HighHorizontal.SetPixel(i, j, Color.FromArgb(diff, diff, diff));

diff = sum_sus – sum_jos;

if (diff < 0)

diff *= -1;

if (diff > 255)

HighVertical.SetPixel(i, j, Color.FromArgb(255, 255, 255));

else

HighVertical.SetPixel(i, j, Color.FromArgb(diff, diff, diff));

Double diff_h = sum_st – sum_dr;

Double diff_v = sum_sus – sum_jos;

diff = Convert.ToInt32(Math.Sqrt(diff_h * diff_h + diff_v * diff_v));

if (diff > 255)

HighGradient.SetPixel(i, j, Color.FromArgb(255, 255, 255));

else

HighGradient.SetPixel(i, j, Color.FromArgb(diff, diff, diff));

}

Autor: Emanuela Dragos

Comentarii

Lasa un comentariu.





Valid XHTML 1.0 Transitional