Untitled
unknown
plain_text
2 months ago
2.3 kB
2
Indexable
/* Nell’ambito dell’elaborazione delle immagini, un filtro a media mobile è un’operazione che riceve in ingresso un array bidimensionale image di valori in virgola mobile e produce un array bidimensionale filtered di ugual dimensione come segue. Ciascun valore in posizione i, j di filtered è calcolato come la media dei valori della sotto-matrice 3x3 con centro i, j di image; nel caso la posizione i, j si trovi sul bordo, tutti gli elementi non esistenti vengono considerati valere 0. Realizzare un sottoprogramma che riceve in ingresso un array bidimensionale per l’immagine di partenza image, uno per l’immagine filtrata filtered (entrambe le matrici sono di valori in virgola mobile) e qualsiasi altro parametro ritenuto strettamente necessario. Il sottoprogramma applica all’immagine di partenza image il filtro a media mobile e trasmette il risultato al chiamante mediante filtered. Nel contesto di utilizzo del sottoprogramma, sono presenti le seguenti direttive/istruzioni riportate di seguito. */ #include <stdio.h> #define NR 100 #define NC 100 void filtroMediaMobile(float image[][NC], float filtered[][NC], int dimR, int dimC) { for(int i=0; i<dimR; i++) { for(int j=0; j<dimC; j++) { float somma = 0; int count = 0; for(int ki = -1; ki<= 1; ki++) // -1, 0, +1 per la riga { for(int kj = -1; kj <= 1; kj++) // -1, 0, +1 per la colonna { int newI = i + ki; // se i = 5 e k1 = -1, guardiamo la riga 4 int newJ = j + kj; // se j = 3 e kj = +1, guardiamo la colonna 4 if(newI >= 0 && newI < dimR && newJ >= 0 && newJ < dimC) { somma = somma + image[newI][newJ]; count++; }else{ somma = somma + 0; count++; } } } filtered[i][j] = somma / count; } } } int main(int argc, char *argv[]) { float img[NR][NC], filtered[NR][NC]; int dimR, dimC; printf("Inserisci numero di righe (max %d): ", NR); scanf("%d", &dimR); printf("Inserisci numero di colonne (max %d): ", NC); scanf("%d", &dimC); return 0; }
Editor is loading...
Leave a Comment