Allora come mi hai suggerito ho provato a compilare usando -Wall..
Io ora non sono un genio del C, cosa vuole dire con tutte quelle "multimpe definition of [..] first define here"?
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#include "bmp.h"
#define DATA_DIM 256
#define XL 120
#define L 50 //LARGE
#define M 30 //MEDIUM
#define S 17
typedef struct {
int giorno, mese, anno;
} Data;
typedef struct {
char via[L];
int civico;
char comune[M];
char provincia[3];
char nazione[M];
} Residenza;
typedef struct{
char nome[L], cognome[L];
Data dataNascita;
char luogoNascita[M], sesso;
int num_immagini; //numero effettivo di immagini xke potrebe averne di meno del max
char percorso[M];
char cf[S];
int idMedico;
Residenza res;
int codice;
} Paziente;
void aggiungiPaziente(char *lista);
void recuperaPaziente(char *lista);
void visualizzaPazienti(char *lista);
void ricercaPaziente();
int contaPazienti(char *lista);
int cercaCodice();
int cercaNome();
void visualizzaImmagine();
void scegliImmagine();
void menuImmagine();
void menuAnalizza();
void inserisciImmagine(char *percorso);
int contaImmagini(char *lista);
void analisiGrigi(char *percorsoImmagine);
void istFreq(int * frequenze);
void saltariduzione();
void riduciGrigi();
void livella();
void ordina(int *arr);
void swap(int *a, int *b);
void contorno();
int main(int argc, char *argv[])
{
char op[2];
FILE *fp;
fp=fopen(argv[1],"r");
if( fp==NULL)
printf("ERRORE!! Impossibile trovare il file!\n");
fclose(fp);
printf("\n\nPROGETTO DI: INFORMATICA ED ELEMENTI DI INFORMATICA MEDICA\n\n");
printf("AA 2011 - 2012\n");
do{
printf("\n COMANDO\t\tOPERAZIONE\n");
printf("\n");
printf("\t1\tInserire dati nuovo paziente\n");
printf("\t2\tRecuperare dati paziente\n");
printf("\tq\tTermina programma\n");
scanf("%s",op);
getchar();
switch(op[0]){
case 'q' : printf("Programma terminato\n\n");
break;
case '1' : aggiungiPaziente(argv[1]);
break;
case '2' : recuperaPaziente(argv[1]);
break;
default: printf("\nCOMANDO NON RICONOSCIUTO!\n");
break;
}
}while (op[0]!='q');
return 0;
}
void aggiungiPaziente(char *lista){ /*devo mettere *lista xke argv[1] che mando nella funzione mi dà
la stringa che c'è nella mia funzione, la funzione deve ricevere appunto quella stringa,
se io mettessi solo lista passerei alla funzione l'indirizzo del puntatore lista(quindi argv)*/
Paziente paz;
FILE *fp;
int cont=0,posizione;
char scelta[1];
fp=fopen(lista,"a+");
printf("Nomi, Cognomi o Luoghi contenenti più di una parola vanno uniti come da esempio:\n");
printf("NOME : Carlo_Alberto\n\n");
printf("Inserire dati paziente: \n");
printf("NOME: ");
scanf("%s",paz.nome);
printf("COGNOME: ");
scanf("%s",paz.cognome);
printf("DATA DI NASCITA\n");
printf("MESE: ");
scanf("%d",&paz.dataNascita.mese);
if(paz.dataNascita.mese>12)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&paz.dataNascita.mese);
}while(!(paz.dataNascita.mese<=12));
printf("GIORNO: ");
scanf("%d",&paz.dataNascita.giorno);
if(paz.dataNascita.mese==11||paz.dataNascita.mese==4||paz.dataNascita.mese==6||paz.dataNascita.mese==9)
if(paz.dataNascita.giorno>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&paz.dataNascita.giorno);
}while(!(paz.dataNascita.giorno<=30));
if(paz.dataNascita.mese==2)
if(paz.dataNascita.giorno>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&paz.dataNascita.giorno);
}while(!(paz.dataNascita.giorno<=29));
if(paz.dataNascita.mese==1||paz.dataNascita.mese==3||paz.dataNascita.mese==5||paz.dataNascita.mese==7||paz.dataNascita.mese==8||paz.dataNascita.mese==10||paz.dataNascita.mese==12)
if(paz.dataNascita.giorno>31)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&paz.dataNascita.giorno);
}while(!(paz.dataNascita.giorno<=31));
printf("ANNO: ");
scanf("%d",&paz.dataNascita.anno);
if(paz.dataNascita.anno<1890 || paz.dataNascita.anno>2012)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("ANNO: ");
scanf("%d",&paz.dataNascita.anno);
}while(!(paz.dataNascita.anno>=1890 && paz.dataNascita.anno<=2012));
printf("LUOGO DI NASCITA: ");
scanf("%s",paz.luogoNascita);
getchar();
printf("SESSO: ");
scanf("%c",&paz.sesso);
printf("CODICE FISCALE (in minuscolo): ");
scanf("%s",paz.cf);
printf("ID MEDICO: ");
scanf("%d",&paz.idMedico);
printf("INDIRIZZO DI RESIDENZA\nVIA: ");
scanf("%s", paz.res.via);
printf("CIVICO: ");
scanf("%d", &paz.res.civico);
printf("COMUNE: ");
scanf("%s", paz.res.comune);
printf("PROVINCIA (es: MI): ");
scanf("%s", paz.res.provincia);
printf("STATO: ");
scanf("%s", paz.res.nazione);
cont=contaPazienti(lista); //ci spostiamo alla fine del file ogni apertura, così se apre ed è all inizio, la seek dà 0, e allora
//paz.codice=cont cioè 1, altrimenti facciamo cont+1
fseek(fp,SEEK_SET,SEEK_END);
posizione=ftell(fp);
if(posizione==0)
paz.codice=cont;
else
paz.codice=cont+1;
strcpy(paz.percorso,"Pazienti/paz");
fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s%d\t%d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.idMedico, paz.res.via, paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione, paz.percorso,paz.codice,paz.codice);
fclose(fp);
do{
printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
printf(" a\tInserisci immagine paziente\n");
printf(" b\tTorna al menù principale\n");
scanf("%s",scelta);
getchar();
if(scelta[0] !='a' && scelta[0] !='b')
printf("CARATTERE ERRATO!\n");
}while(!(scelta[0]=='a' || scelta[0]=='b'));
if(scelta[0]=='a')
printf("Inserire funzione immagine\n");// da togliere ovviamente
}
void recuperaPaziente(char *lista){
char scelta[1];
do{
printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
printf("\ta\tVisualizza lista pazienti\n");
printf("\tb\tRicerca paziente\n");
printf("\t0\tTorna al menù principale\n");
scanf("%s",scelta);
getchar();
if(scelta[0] !='a' && scelta[0] !='b' && scelta[0]!='0')
printf("CARATTERE ERRATO!\n");
}while(!(scelta[0]=='a' || scelta[0]=='b' || scelta[0]=='0'));
if(scelta[0]=='a')
visualizzaPazienti(lista);
if(scelta[0]=='b')
ricercaPaziente(lista);
}
void visualizzaPazienti(char *lista){ // è una castronata ma il file ci da problemi con testi oltre e meno di 7 caratteri
Paziente paz;
FILE *fp;
fp=fopen(lista,"r");
printf("CODICE\tNOME\t\t\tCOGNOME\t\t\tCODICE FISCALE\n\n");
do{
fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
if(strlen(paz.nome)<8){
if(strlen(paz.cognome)<8)
printf("%d\t%s\t\t\t%s\t\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
else
printf("%d\t%s\t\t\t%s\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
}
else
if(strlen(paz.cognome)<8)
printf("%d\t%s\t\t%s\t\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
else
printf("%d\t%s\t\t%s\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
}while(!feof(fp));
ricercaPaziente(lista);
fclose(fp);
}
int contaPazienti(char *lista){ //serve per poter associare il codice paziente ad un nuovo paziente,
//conta quanti pazienti sono presenti così poi vado a aggiungerne uno nuovo in cont+1.
int cont=0;
Paziente paz;
FILE *fp;
fp=fopen(lista,"r");
do{
fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
cont++;
}while(!feof(fp));
fclose(fp);
return cont;
}
void ricercaPaziente(char *lista){
char op[1];
do{
printf("\nEseguire ricerca per:\n\n");
printf("\ta\tCODICE PAZIENTE\n");
printf("\tb\tNOME COGNOME\n\n");
printf("\tq\tMenù principale\n");
scanf("%s", op);
getchar();
if(op[0] !='a' && op[0] !='b' && op[0]!='q')
printf("CARATTERE ERRATO!\n");
}while(!(op[0]=='a' || op[0]=='b' || op[0]=='q'));
if(op[0]=='a')
cercaCodice(lista);
else if(op[0]=='b')
cercaNome(lista);
}
int cercaCodice(char *lista){
Paziente paz;
FILE *fp;
int cod;
fp=fopen(lista,"r");
printf("INSERIRE CODICE: ");
scanf("%d",&cod);
do{
fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
if(cod==paz.codice) {
printf("\nNOME: %s\nCOGNOME: %s\nDATA DI NASCITA (gg/mm/aaaa): %d/%d/%d\nLUOGO DI NASCITA: %s\nSESSO: %c\nC.F: %s\nCODICE: %d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.codice);
break;
}
}while(!feof(fp));
if(!(paz.codice==cod)){
printf("\n\nERRORE CODICE NON TROVATO!\n"); /*Se alla fine del file non ho trovato nessuno con quel codice,
errore, altrimenti andrebbe avanti con l ultimo del file*/
cercaCodice(lista);
fclose(fp);
}
else{
fclose(fp);
menuImmagine(paz.percorso);
}
}
int cercaNome( char *lista){
Paziente paz;
FILE *fp;
char nom[L],cognom[L];
int compNom,compCogn,contComp=0,save;
fp=fopen(lista,"r");
printf("INSERIRE DATI:\n\n");
printf("NOME: ");
scanf("%s",nom);
printf("COGNOME: ");
scanf("%s",cognom);
//inizia, se trova nome e cognome li stampa e continua e se ne trova ancora stampa anche quelli, ad ogni stampa un contatore aumenta,
// alla fine if cont=......
do{
fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
compNom=strcmp(cognom,paz.cognome);
compCogn=strcmp(nom,paz.nome); //aggiungere anche il cognome e impara a fare doppio strcmp
if(compNom==0 && compCogn==0) { //NON È + CARINO IF !STRCMP ?? aggiungere particolari alla stampa a video
printf("\nNOME: %s\nCOGNOME: %s\nDATA DI NASCITA (gg/mm/aaaa): %d/%d/%d\nLUOGO DI NASCITA: %s\nSESSO: %c\nC.F: %s\nCODICE: %d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.codice);
save=paz.codice;
contComp++;
}
}while(!feof(fp));
printf("\nTrovati %d pazienti\n\n",contComp);
if (contComp>1)
cercaCodice(lista);
else if(contComp==0){
printf("PAZIENTE NON TROVATO!\n");
cercaNome(lista);
}
else
menuImmagine(paz.percorso);
fclose(fp);
}
void menuImmagine(char *percorso){
char op[2];
do{
printf("\nGESTIONE IMMAGINI:\n\n\ta\tINSERISCI\n\tb\tCERCA\n\n\tq\tMenù precedente\n");
scanf("%s", op);
getchar();
if(op[0] !='a' && op[0] !='b' && op[0]!='q')
printf("CARATTERE ERRATO!\n");
}while(!(op[0]=='a' || op[0]=='b' || op[0]=='q'));
if(op[0]=='a')
inserisciImmagine(percorso);
if(op[0]=='b')
visualizzaImmagine(percorso);
}
void inserisciImmagine(char *percorso){
char nomeImmagine[L],nomeImmagineDaCaricare[L],percorsoLegenda[L];
char tmp[L],legenda[L]; //legenda deve essere pure lei grande L perchè poi quando faccio
//il for mi puo dare casini
int i,contLen,contImm,codice,posizione;
Data data;
FILE *fp;
BMP_Image *pnt;
BMP_Image immagine;
pnt=&immagine;
printf("\nPERCORSO IMMAGINE DA CARICARE:\nes: home/Scrivania/nome-immagine\nPer spostarsi nella cartella superiore usare: ../ \n");
scanf("%s", nomeImmagineDaCaricare);
printf("\nNUOVO NOME IMMAGINE (preceduto da /): ");
scanf("%s",nomeImmagine);
printf("INSERIRE DATA ESAME\n");
printf("MESE: ");
scanf("%d",&data.mese);
if(data.mese>12)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&data.mese);
}while(!(data.mese<=12));
printf("GIORNO: ");
scanf("%d",&data.giorno);
if(data.mese==11||data.mese==4||data.mese==6||data.mese==9)
if(data.giorno>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&data.giorno);
}while(!(data.giorno<=30));
if(data.mese==2)
if(data.giorno>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&data.giorno);
}while(!(data.giorno<=29));
if(data.mese==1||data.mese==3||data.mese==5||data.mese==7||data.mese==8||data.mese==10||data.mese==12)
if(data.giorno>31)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&data.giorno);
}while(!(data.giorno<=31));
printf("ANNO: ");
scanf("%d",&data.anno);
if(data.anno<1890 || data.anno>2012)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("ANNO: ");
scanf("%d",&data.anno);
}while(!(data.anno>=1890 && data.anno<=2012));
/*noi passiamo percorso Pazienti/paz2 ,
copiamo questo su tmp, poi faccio il for per copiare anche
il nome del file in coda; percorso puo essere lungo
13 o 14 , allora contLen conta quanto è lungo e il for parte da
quella lunghezza, fina a un valore max di L*/
/*facciamo la stessa copia anche su percorsoLegenda e poi
gli attacchiamo anche /Legenda così abbiamo il percorso
del file Legenda che sta dentro ogni cartella paz*/
if(strlen(nomeImmagine)>L)
printf("\nERRORE INSERIRE UN NOME PIÙ CORTO!\n");
else {
strcpy(tmp,percorso);
strcpy(percorsoLegenda,percorso);
strcpy(legenda,"/Legenda");
contLen=strlen(percorso);
for ( i = contLen; i < L;i++){
tmp[i]=nomeImmagine[i-contLen];
percorsoLegenda[i]=legenda[i-contLen];
}
loadBMP(nomeImmagineDaCaricare ,pnt);
saveBMP(immagine, tmp);
}
/*facciamo la contapazienti che conta le righe nel file e associa a ogni
immagine il suo codice*/
fp=fopen(percorsoLegenda,"a+");
contImm=contaImmagini(percorsoLegenda); //ci spostiamo alla fine del file ogni apertura, così se apre ed è all inizio, la seek dà 0, e allora
//paz.codice=contPaz cioè 1, altrimenti facciamo contPaz+1
fseek(fp,SEEK_SET,SEEK_END);
posizione=ftell(fp);
if(posizione==0)
codice=contImm;
else
codice=contImm+1;
fprintf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,data.giorno,data.mese,data.anno,codice);
fclose(fp);
}
int contaImmagini(char *lista){ //serve per poter associare il codice paziente ad un nuovo paziente,
//conta quanti pazienti sono presenti così poi vado a aggiungerne uno nuovo in cont+1.
int cont=0,codice;
char nomeImmagine[L];
Data data;
FILE *fp;
fp=fopen(lista,"r");
do{
fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);
cont++;
}while(!feof(fp));
fclose(fp);
return cont;
}
void visualizzaImmagine( char *percorso){
int codice,contLen,i;
char nomeImmagine[L],legenda[L],percorsoLegenda[L];
Data data;
FILE *fp;
strcpy(percorsoLegenda,percorso);
strcpy(legenda,"/Legenda");
contLen=strlen(percorso);
for ( i = contLen; i < L;i++)
percorsoLegenda[i]=legenda[i-contLen];
printf("\nELENCO IMMAGINI PAZIENTE\n");
fp=fopen(percorsoLegenda,"r");
fseek(fp,SEEK_SET,SEEK_END);
if(ftell(fp)==0) /*se il file fosse vuoto e stmperei il cntenuto
stamperebbe numeri strani*/
printf("NESSUNA IMMAGINE TROVATA!\n");
else{
fseek(fp,SEEK_SET,SEEK_SET);
printf("\n CODICE\tDATA\t\tNOME IMMAGINE\n\n");
do{
fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);
printf("\t%d\t%d/%d/%d\t%s\n",codice,data.giorno,data.mese,data.anno,nomeImmagine);
}while(!feof(fp));
fclose(fp);
scegliImmagine(percorsoLegenda);
}
}
void scegliImmagine(char *percorsoLegenda){
int codiceSelez,codice,i,contLen;
char percorsoImmagine[L],nomeImmagine[L];
FILE *fp;
Data data;
printf("INDICARE IL CODICE DELL'IMMAGINE DESIDERATA:\n");
scanf("%d",&codiceSelez);
fp=fopen(percorsoLegenda,"r");
do{
fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);
if(codiceSelez==codice)
break;
}while(!feof(fp));
if(!(codice==codiceSelez)){
printf("\n\nERRORE CODICE NON TROVATO!\n"); /*Se alla fine del file non ho trovato nessuno con quel codice,
errore, altrimenti andrebbe avanti con l ultimo del file*/
scegliImmagine(percorsoLegenda);
fclose(fp);
}
else{
strcpy(percorsoImmagine,percorsoLegenda);
contLen=(strlen(percorsoLegenda)-8);
for ( i = contLen; i < L;i++)
percorsoImmagine[i]=nomeImmagine[i-contLen];
menuAnalizza(percorsoImmagine);
}
}
void menuAnalizza(char *percorsoImmagine){
char op[2];
do{
printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
printf("\ta\tANALISI E RIDUZIONE GRIGI\n");
printf("\tq\tTorna al menù principale\n");
scanf("%s", op);
getchar();
if(op[0] !='a' && op[0]!='q')
printf("CARATTERE ERRATO!\n");
}while(!(op[0]=='a' || op[0]=='q'));
if(op[0]=='a')
analisiGrigi(percorsoImmagine);
}
void analisiGrigi(char *percorsoImmagine){
int i,j,cont=0,frequenze[DATA_DIM];
char op[2];
BMP_Image *pnt;
BMP_Image immagine;
pnt=&immagine;
for (i=0; i<DATA_DIM; i++)
frequenze[i]=0;
loadBMP(percorsoImmagine,pnt);
printf("\n\tANALISI DEI GRIGI\n");
for (i=0; i<DATA_DIM; i++) /*popoliamo l'array di frequenze, ogni volta che
incontro un pixel cn un livello di grigio aumenta di uno
il valore della casella dell'array frequenze nella posizione
di quel livllo di grigio*/
for(j=0; j<DATA_DIM; j++){
frequenze[immagine.data[i][j].grey]++;
}
for (i = 0; i < DATA_DIM; i++){ /*conto i livelli di grigio, tutte le caselle dell'array 0 vengono saltate
e aumento il contatore ogni volta che ne trovo una !=0*/
if(frequenze[i]!=0)
cont++;
}
/*se sono 10 non f analisi e riduzione e passa avanti
altrimenti va ad analisi e riduzione*/
if(cont==10){
istFreq(frequenze);
printf("\n\nNell'immagine sono già presenti %d livelli di grigio\n\n",cont);
do{
printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
printf("\ta\tDEFINIRE PIXEL DI CONTORNO\n");
printf("\tq\tTorna al menù principale\n");
scanf("%s", op);
getchar();
if(op[0] !='a' && op[0]!='q')
printf("CARATTERE ERRATO!\n");
}while(!(op[0]=='a' || op[0]=='q'));
if(op[0]=='a')
saltariduzione(frequenze,percorsoImmagine);
}
// RIDUZIONE A 10 LIVELLI
else{
printf("\nNell'immagine sono presenti %d livelli di grigio\n\n",cont);
istFreq(frequenze);
riduciGrigi(frequenze,percorsoImmagine);
}
}
void istFreq(int * frequenze){
int i,j;
printf("\nDISTRIBUZIONE DEI LIVELLI DI GRIGIO\n\n");
printf("%s%13s%17s\n\n", "LIVELLO", "QUANTITA", "ISTOGRAMMA");
for(i=0; i<DATA_DIM; i++){
printf("%7d%13d ", i, frequenze[i]);
for(j=1; j<=frequenze[i]/10; j++)
printf("*");
printf("\n");
}
}
void saltariduzione(int *frequenze,char *percorsoImmagine){
int copia[DATA_DIM],massimi[DATA_DIM],livelli[9],massimipro[DATA_DIM];
int i,j,max=0,tmp=65536;
/* ordino tutti i 256 valori di freq in ordine di
"potenza", così da poter vedere quali sono
i grigi che predominano, il primo for
serve a fare 256 volte il giro dell'array
il secondo for fa il giro vero e trova il max
per ogni giro ricordando in tmp l'ultimo max trovato
*/
for( i = 0; i < DATA_DIM; i++)
copia[i]=frequenze[i];
for ( i = 0; i < DATA_DIM; i++){
massimi[i]=0;
}
for(i=0; i<DATA_DIM; i++){
max=0;
for (j = 0; j<DATA_DIM; j++){
if(copia[j]>max && copia[j]<tmp ){
max=copia[j];
massimi[i]=j;
}
}
tmp=max;
}
for(i=0;i<10;i++)
livelli[i]=massimipro[i];
contorno(livelli,percorsoImmagine);
}
void riduciGrigi(int frequenze[],char *percorsoImmagine){
int massimi[DATA_DIM],massimipro[DATA_DIM],max=0,copia[DATA_DIM],tmp=65536,livelli[9];
int i,j,cont,contapro,contloop,distanza=23,diff;
/* ordino tutti i 256 valori di freq in ordine di
"potenza", così da poter vedere quali sono
i grigi che predominano, il primo for
serve a fare 256 volte il giro dell'array
il secondo for fa il giro vero e trova il max
per ogni giro ricordando in tmp l'ultimo max trovato
*/
//TROVO I 256 GRIGI
for ( i = 0; i < DATA_DIM; i++)
copia[i]=frequenze[i];
for ( i = 0; i < DATA_DIM; i++){
massimi[i]=0;
massimipro[i]=0;
}
for(i=0; i<DATA_DIM; i++){
max=0;
for (j = 0; j<DATA_DIM; j++){
if(copia[j]>max && copia[j]<tmp ){
max=copia[j];
massimi[i]=j;
}
}
tmp=max;
}
//DISTANZE
do{
/*
controllo se il primo max è il nero, e lo associo a massimipro[0];
che è l array dove andranno i 10 grigi finali: Se si il for parte da
1, altrimenti comincia normalmente da 0; */
for ( i = 0; i < DATA_DIM; i++)
massimipro[i]=0;
if(massimi[0]==0){
massimipro[0]=0;
i=1;
}
else
i=0;
for(i; i<DATA_DIM; i++){
cont=0;
/*massimi[i] è in ordine di "potenza", lui li prende a uno a uno
e li mette in massimipro solo se distano almeno "distanza" da tutti
quello gia presenti in massimipro.*/
for(j=0; j<DATA_DIM ; j++){
diff=massimipro[j]-massimi[i];
if(diff<0)
diff=-diff;
if(diff<distanza)
cont++;
}
if (cont==0)
massimipro[i]=massimi[i];
else
massimipro[i]=300;
}
/*ordino massimipro in modo da avere i nostri grigi tutti nelle prime
posizioni, e conto quanti sono i grigi presenti( quelli diversi da 300)
e impongo le condizioni su quelli:
-se sono meno di dieci diminuisco "distanza" così ne trova di piu
-se sono di piu al contrario; */
ordina(massimipro);
contapro=0;
contloop=0;
for(i=0;i<DATA_DIM;i++){
if(massimipro[i]!=300)
contapro++;
}
/*All inizio era solo se <10 --, se >10 ++, solo che se saltava da 9 a 11
andava in loop(ecco contloop), ora, ogni volta che arrivo a 11, contloop++
cosi dico che sono gia passato di li una volta e agisco di conseguenza*/
if (contapro<10)
distanza--;
if(contapro>10 && contloop==0){
if(contapro==11){
distanza++;
contloop++;
}
else
distanza++;
}
/*se contloop=1 vuol dire che non riesco a trovare una distanza che mi
trova i 10 livelli e allora siamo costretti a approssimare e unire 2
livelli in 1 ( dalla parte dei bianchi prendiamo gli ultimi 2, e vince il piu alto
alla fine contapro=10 così esce dal ciclo*/
if(contloop==1){
contapro=10;
if(frequenze[massimipro[10]]>frequenze[massimipro[9]]){
massimipro[9]=massimipro[10];
massimipro[10]=300;
}
else
massimipro[10]=300;
}
}while(contapro!=10);
/*mettiamo i 10 grigi in un array da 10 così è
piu semplice lavorare*/
for(i=0;i<10;i++)
livelli[i]=massimipro[i];
printf("\nRIDUZIONE LIVELLI DI GRIGIO\n\n");
printf("I 10 livelli di grigio ora sono : \n\n");
for(i=0;i<10;i++)
printf("%d ",livelli[i]);
printf("\n");
livella(livelli,percorsoImmagine,distanza);
}
void livella(int *livelli,char *percorsoImmagine,int distanza){
/*per ogni punto della matrice originale,
controlla qual'è il grigio tra i 10 piu vicino e ci si
uniforma*/
BMP_Image *pnt;
BMP_Image immagine;
pnt=&immagine;
int i,j,k,diff,contLen;
int grigio;
char op[2],percorsoImmagineAnalisi[L],analisi[L]={"_analisi"};
loadBMP(percorsoImmagine,pnt);
for(i=0; i<DATA_DIM; i++)
for(j=0; j<DATA_DIM; j++){
for(k=0; k<10; k++){
diff=immagine.data[i][j].grey-livelli[k];
if(diff<0)
diff=-diff;
if(diff<distanza/2)
grigio=livelli[k];
}
immagine.data[i][j].grey=grigio;
}
strcpy(percorsoImmagineAnalisi,percorsoImmagine);
contLen=(strlen(percorsoImmagine));
for ( i = contLen; i < L;i++)
percorsoImmagineAnalisi[i]=analisi[i-contLen];
saveBMP(immagine,percorsoImmagineAnalisi);
do{
printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
printf("\ta\tDEFINIRE PIXEL DI CONTORNO\n");
printf("\tq\tTorna al menù principale\n");
scanf("%s", op);
getchar();
if(op[0] !='a' && op[0]!='q')
printf("CARATTERE ERRATO!\n");
}while(!(op[0]=='a' || op[0]=='q'));
if(op[0]=='a')
contorno(livelli,percorsoImmagine);
}
void ordina(int *arr){
int i,j;
for ( i = 1 ; i < DATA_DIM ; i++ )
for ( j = 0 ; j < DATA_DIM - i ; j++ )
{
if (arr[j] > arr[j + 1]) // per ogni coppia di elementi in posizioni consecutive
swap(&arr[j], &arr[j+1]); // se l'elemento più a sinistra è maggiore dell'elemento più a destra, scambio la loro posizione
}
}
void swap(int *a, int *b){
int tmp; /* Variabile di supporto per salvare uno dei due valori durante lo spostamento */
tmp=*a;
*a=*b;
*b=tmp;
}
void contorno(int *livelli,char *percorsoImmagine){
char analisi[L]={"_analisi"},contorni[L]={"_contorni"},percorsoImmagineAnalisi[L],percorsoImmagineAnalisiContorni[L];
int contLen,i,j;
BMP_Image *pnt;
BMP_Image immagine;
pnt=&immagine;
strcpy(percorsoImmagineAnalisi,percorsoImmagine);
contLen=(strlen(percorsoImmagine));
for ( i = contLen; i < L;i++)
percorsoImmagineAnalisi[i]=analisi[i-contLen];
loadBMP(percorsoImmagineAnalisi,pnt);
for(i=0; i<DATA_DIM; i++)
for(j=0; j<DATA_DIM; j++){
if(immagine.data[i][j].grey==livelli[0] || immagine.data[i][j].grey==livelli[1])
immagine.data[i][j].grey=0;
else
immagine.data[i][j].grey=255;
}
strcpy(percorsoImmagineAnalisiContorni,percorsoImmagineAnalisi);
contLen=(strlen(percorsoImmagineAnalisi));
for ( i = contLen; i < L;i++)
percorsoImmagineAnalisiContorni[i]=contorni[i-contLen];
saveBMP(immagine,percorsoImmagineAnalisiContorni);
}
Il programma serve per poter gestire ed eseguire alcune azioni su delle immagini..