Mostra notizie nelle discussioni
Avatar
☺
Scritto da
il 2010-11-15 20:56:00.0 alle 2010-11-15 20:56:00.0
Trollate totali: 4459
per sessuofono
il compito era una merda e lo sapevi già, però ho provato a farlo "bene", anche se c'erano pochi margini. A dire il vero potevo usare una variabile in meno nello scorrere l'array, ma ho privilegiato la leggibilità.
Tutto sommato però mi sembra sempre una merda.
Tu cosa ne pensi?

Testo della traccia:
Esercizio:
State lavorando al progetto di un applicativo per la gestione di immagini e, in particolare, per la
creazione di filtri che distorcano immagini memorizzate mediante la codifica bitmap con una
profondità di colore di 16 bit.
La codifica bitmap prevede che ogni pixel venga rappresentato da un valore intero (in questo caso
da 0 a 65.535) che rappresenta la sfumatura di colore.
Vi viene richiesto di realizzare una funzione, in linguaggio C++, che realizzi il filtraggio. Tale
funzione riceve in ingresso una matrice di NxM numeri interi e crea una nuova matrice modificando
i valori secondo il seguente criterio: il valore di coordinate (i,j) viene sostituito con la media dei
valori della sottomatrice con elemento superiore sinistro di coordinate (i-2, j-2) ed elemento
inferiore destro di coordinate (i+2, j+2). Chiaramente si deve considerare solo la somma degli
elementi esistenti e quindi vanno considerati con attenzione i casi in cui i e j identifichino degli
elementi vicini al contorno della matrice.
Si realizzi anche un semplice main() per testare il corretto funzionamento della funzione prodotta.


#include <iostream>
#include <iomanip>
using namespace std;

// Dichiarazione delle costanti
const int RIG = 14; //righe matrice
const int COL = 7; //colonne matrice

int stampaMat(int mat[][COL], int rig);
int filtro(int img_in[][COL], int img_out[][COL], int rig);

int main()
{
    int image[RIG][COL]={
        {11900, 11987, 11934, 11999, 12036, 12087, 12100},
        {11992, 12003, 11953, 12015, 12098, 12107, 12110},
        {12000, 12008, 12023, 12111, 12120, 12128, 12120},
        {12066, 12025, 12099, 12145, 12135, 12099, 12099},
        {12059, 12087, 12089, 12136, 12130, 12110, 12101},
        {12050, 12100, 12098, 12150, 12155, 12123, 12097},
        {1255, 12306, 12287, 12256, 12244, 12249, 12200},
        {11900, 11987, 11934, 11999, 12036, 12087, 12100},
        {11992, 12003, 11953, 12015, 12098, 12107, 12110},
        {12000, 12008, 12023, 12111, 12120, 12128, 12120},
        {12066, 12025, 12099, 12145, 12135, 12099, 12099},
        {12059, 12087, 12089, 12136, 12130, 12110, 12101},
        {12050, 12100, 12098, 12150, 12155, 12123, 12097},
        {1255, 12306, 12287, 12256, 12244, 12249, 12200},
    };
    int img_new[RIG][COL];
    stampaMat(image,RIG);
    cout << "\n";
    filtro(image,img_new,RIG);
    stampaMat(img_new,RIG);
    cout << "\n";
    return 0;
}

int stampaMat(int mat[][COL], int rig)
{
    for(int i=0;i<rig;i++)
    {        
        for(int j=0;j<COL;j++)
            cout << setw(6) << mat[i][j];
        cout << "\n";
    }
    return 0;
}

int filtro(int img_in[][COL], int img_out[][COL], int rig)
{
    for(int i=0;i<rig;i++)
    {     
        int lim_inf_r, lim_sup_r;
        //calcolo dell'indice delle righe della sottomatrice
        if (i-2<0)               //se l'elemento è "troppo in alto" 
        {
            lim_inf_r=0;
            lim_sup_r=i+2;
        }
        else if (i+2>=rig)       //se l'elemento è "troppo in basso"
        {
            lim_sup_r=rig-1;
            lim_inf_r=i-2;
        }
        else                     //se l'elemento è al centro
        {
            lim_inf_r=i-2;
            lim_sup_r=i+2;
        }
     
        for(int j=0;j<COL;j++)
        {
            int lim_inf_c, lim_sup_c;
            long subtotale=0; //per sommare dei numeri grandi, ci vuole una variabile grande
            int n_elementi;
            
            //calcolo dell'indice delle colonne della sottomatrice
            if (j-2<0)               //elemento di estrema destra
            {
                lim_inf_c=0;
                lim_sup_c=j+2;
            }
            else if (j+2>=COL )      //elemento di estrema sinistra
            {
                lim_sup_c=COL-1;
                lim_inf_c=j-2;
            }
            else                     //elemento di estremo centro<IMG SRC="images/emo/1.gif" border="0" height="20" alt="Sorride" title="Sorride">)
            {
                lim_inf_c=j-2;
                lim_sup_c=j+2;
            }
            
            //Ora che si sono calcolati gli estremi, si calcola la media della sottomatrice
            for (int sub_r=lim_inf_r; sub_r<=lim_sup_r; sub_r++)
                for (int sub_c=lim_inf_c; sub_c<=lim_sup_c; sub_c++)
                    subtotale+=img_in[sub_r][sub_c];

            n_elementi=(lim_sup_r-lim_inf_r+1)*(lim_sup_c-lim_inf_c+1);
            img_out[i][j]=subtotale/n_elementi;
        }        
    }
    return 0;
}

Pagina generata in 117 millisecondi

Utenti attivi: 11 nell'ultimo minuto, 26 negli ultimi cinque minuti, 49 negli ultimi 15 minuti