#include <stdio.h>
#define lun 512 //dimensione in pixel della lunghezza dell'immagine
#define lar 512 //dimensione in pixel della larghezza dell'immagine
#define lMask 3 //dimensione in pixel del lato della maschera utilizzata per il filtro
#define lunOrl lun+(lMask-1) //dimensione in pixel della lunghezza dell'immagine con l'orlatura
#define larOrl lar+(lMask-1) //dimensione in pixel della larghezza dell'immagine con l'orlatura
#define rangoMin 0 //rango minimo
#define rangoMed (lMask*lMask)/2 //rango mediano
#define rangoMax (lMask*lMask)-1 //rango massimo
//dichiarazione funzioni
void input();
void orlatura();
void rango();
unsigned char* sort(unsigned char[]);
void output();
//dichiarazione buffer vari
unsigned char img[lun][lar];
unsigned char imgOrl[lunOrl][larOrl];
unsigned char minRank[lun][lar];
unsigned char medRank[lun][lar];
unsigned char maxRank[lun][lar];
unsigned char midpointRank[lun][lar];
unsigned char rangeRank[lun][lar];
unsigned char alphaRank[lun][lar];
main()
{
input();
orlatura();
rango();
output();
}
void input()
{
//legge l'immagine raw e la inserisce in una matrice di caratteri
FILE *fi;
if (!(fi=fopen("lena.raw","r")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fread(img, sizeof(unsigned char), lun*lar, fi);
fclose(fi);
}
void orlatura()
{
//copia la matrice dell'immagine in una matrice comprensiva di orlatura
//per prima cosa inseriamo l'immagine senza orlatura al centro della matrice
//con l'orlatura
int i, j, dist;
for(i=0;i<lun;i++)
for(j=0;j<lar;j++)
imgOrl[i + lMask/2][j + lMask/2] = img[i][j];
//dopodichè assegnamo i valori ai pixel dell'orlatura
for(i=0;i<lunOrl;i++)
for(j=0;j<larOrl;j++)
{
if(j<lMask/2 && i>=lMask/2 && i<lunOrl-lMask/2)
{
dist=lMask/2-j;
imgOrl[i][j]=imgOrl[i][j+(dist*2)-1];
}
if(j>=larOrl-lMask/2 && i>=lMask/2 && i<lunOrl-lMask/2)
{
dist=j-((larOrl-lMask/2)-1);
imgOrl[i][j]=imgOrl[i][j-(dist*2)+1];
}
if(i<lMask/2 && j>=lMask/2 && j<larOrl-lMask/2)
{
dist=lMask/2-i;
imgOrl[i][j]=imgOrl[i+(dist*2)-1][j];
}
if(i>=lunOrl-lMask/2 && j>=lMask/2 && j<larOrl-lMask/2)
{
dist=i-((lunOrl-lMask/2)-1);
imgOrl[i][j]=imgOrl[i-(dist*2)+1][j];
}
if(i<lMask/2 && j<lMask/2)
{
imgOrl[i][j]=img[0][0];
}
if(i<lMask/2 && j>=larOrl-lMask/2)
{
imgOrl[i][j]=img[0][lar-1];
}
if(i>=lunOrl-lMask/2 && j>=larOrl-lMask/2)
{
imgOrl[i][j]=img[lun-1][lar-1];
}
if(i>=lunOrl-lMask/2 && j<lMask/2)
{
imgOrl[i][j]=img[lun-1][0];
}
}
}
void rango()
{
//applica il filtro utilizzando tre parametri diversi e creando tre nuove matrici
int i, j, x, y, z, n, temp;
unsigned char mask[lMask*lMask];
unsigned char*punt;
//sfogliamo l'immagine e per ogni punto carichiamo i valori della maschera
//in un vettore
for(i=0;i<lunOrl-(lMask-1);i++)
for(j=0;j<larOrl-(lMask-1);j++) {
z=0;
for(x=i;x<i+lMask;x++)
for(y=j;y<j+lMask;y++) {
mask[z]=imgOrl[x][y];
z++;
}
//richiamiamo la funzione che ordina il vettore
punt = sort(mask);
//assegnamo ai kernel il giusto valore
minRank[i][j]=mask[rangoMin];
medRank[i][j]=mask[rangoMed];
maxRank[i][j]=mask[rangoMax];
midpointRank[i][j]=(mask[rangoMax] + mask[rangoMin])/2;
temp=0;
for(n=rangoMed/2;n<=(rangoMed/2)*3;n++)
temp+=mask[n];
alphaRank[i][j]=temp/(n+1);
rangeRank[i][j]=mask[rangoMax]-mask[rangoMin];
}
}
unsigned char* sort(unsigned char mask[])
{
//ordina un vettore
int i, j, pos;
unsigned char min;
for(i=0;i<lMask*lMask-1;i++)
{
min=mask[i]; pos=i;
for(j=i+1;j<lMask*lMask;j++)
if(mask[j]<min)
{
min=mask[j];
pos=j;
}
if(pos!=i)
{
mask[pos]=mask[i];
mask[i]=min;
}
}
return(mask);
}
void output()
{
//scrive le tre matrici ottenute su sei nuovi file raw
FILE *nuovo1, *nuovo2, *nuovo3, *nuovo4, *nuovo5, *nuovo6;
if (!(nuovo1=fopen("Min Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(minRank, sizeof(unsigned char), lun*lar, nuovo1);
fclose(nuovo1);
if (!(nuovo2=fopen("Median Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(medRank, sizeof(unsigned char), lun*lar, nuovo2);
fclose(nuovo2);
if (!(nuovo3=fopen("Max Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(maxRank, sizeof(unsigned char), lun*lar, nuovo3);
fclose(nuovo3);
if (!(nuovo4=fopen("Midpoint Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(midpointRank, sizeof(unsigned char), lun*lar, nuovo4);
fclose(nuovo4);
if (!(nuovo5=fopen("Range Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(rangeRank, sizeof(unsigned char), lun*lar, nuovo5);
fclose(nuovo5);
if (!(nuovo6=fopen("Alpha Filter.raw","w")))
{
printf("Errore nell'apertura del file!");
exit(1);
}
fwrite(alphaRank, sizeof(unsigned char), lun*lar, nuovo6);
fclose(nuovo6);
}