Prelucrarea si recunoasterea imaginilor

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 […]

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

Leave a Reply

Your email address will not be published. Required fields are marked *