Algoritmo per filtro gaussiano[cpp]
Inviato: giovedì 3 marzo 2016, 15:41
Salve a tutti, sto cercando di implementare uno script dove,data in ingresso un immagine PGM vi si applica un filtro.
In sostanza devo fare una convoluzione per righe e poi per colonne della matrice che contiene i dati del PGM con un kernel particolare ( 0.061 0.242 0.383 0.242 0.061).
Sto cercando di implementarlo ma trovo molte difficoltà nel gestire copie degli elementi e poi rimettere il tutto in un PGM.
finora ho scritto questo , ma credo che vada rifatto da 0.
Grazie per l'eventuale aiuto
In sostanza devo fare una convoluzione per righe e poi per colonne della matrice che contiene i dati del PGM con un kernel particolare ( 0.061 0.242 0.383 0.242 0.061).
Sto cercando di implementarlo ma trovo molte difficoltà nel gestire copie degli elementi e poi rimettere il tutto in un PGM.
finora ho scritto questo , ma credo che vada rifatto da 0.
Grazie per l'eventuale aiuto
Codice: Seleziona tutto
void PGMFile::gaussianFilter(){
Vec flt(5); //dichiaro Vettore
flt.setElement(0,0.061);
flt.setElement(1,0.242);
flt.setElement(2,0.383);
flt.setElement(3,0.242);
flt.setElement(4,0.061);
Vec tmp(320),conv(325);
int righe=(325);
int colonne=(245);
Mat Copia(righe,colonne); //invoco costruttore per Mat risultante, con dimensioni maggiorate a causa della conv
for(int r=0 ; r< rows_ ; r++){ //iterativamente copio le righe del file pgm in un vettore tmp,faccio la convoluzione
for (int c=0 ; c< cols_ ; c++){
tmp.data[c]=data_[r*c];
for (int i=0;i<cols_;i++)
double d=tmp[i];
for(int j=0;j<5;j++)
copia.dataRows[i+j]->data[c]+=d*flt[j]; }} //assegno il vettore convoluzione alla matrice copia
/*---porzione per stampare risultato--------*/
const char *filename="filterresult.pgm";
FILE *fd = fopen ( filename, "w" );
// Can't open the file
if ( fd == NULL )
return false;
// Write the header
fprintf(fd,"P2\n");
fprintf(fd,"# This is a comment\n");
fprintf(fd,"%d %d\n", cols_, rows_ );
fprintf(fd,"255\n");
// Write each pixel value
unsigned int data_size = rows_*cols_;
for( int i = 0; i < data_size; i++ )
fprintf(fd,"%d\n",data_[i]);
return Copia;}