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 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
Categorie: 
