Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
IMMAGINE
#ifdef DEBUGoutfilename = strdup(DEFAULT_OUTFILE); //per debugofd = fopen(outfilename, "w"); //salva in un file l'immagine acquisitaif(ofd == NULL) {perror(outfilename);exit(EXIT_FAILURE);}fprintf(ofd, "P5\n%d %d 255\n", win.width, win.height);#endiffor (i = 0; i < 19200; i++) { //salvo l'immagine acquisita nella matricey = *(buffer+1);buffer += 2;#ifdef DEBUGfputc(y&0xFF, ofd);#endifgray_mat_prod[i%indice1][i/indice1]=y;}#ifdef DEBUGfclose(ofd);#endifprintf("\n *** PRODUTTORE : acquisita immagine ***\n");for(i_ind=0;i_ind<160;i_ind++){ //copio l'immagine in grayscale nella sharedmemoryfor(j_ind=0;j_ind<120;j_ind++){*ptr=gray_mat_prod[i_ind][j_ind];ptr++;}}printf("\n *** PRODUTTORE : copiata immagine nella shared memory***\n"); 1#ifdef DEBUGfd=open("./gray_prod.doc",O_WRONLY|O_CREAT,0644); //per debugfor(i_ind=0;i_ind<160;i_ind++){ //salvo in un file doc l'immagine acquisita in un for-mato
compatibile col matlab
for(j_ind=0;j_ind<120;j_ind++){
y=gray_mat_prod[i_ind][j_ind];
int2char(y,num);
w1=write(fd,&num,3);
w1=write(fd,&virgola,1);
}
w1=write(fd,&newline,1);
close(fd);
#endif
}
void co(int ID_Sem,unsigned int * gray_inv,int fd1){
unsigned int i_ind,j_ind,k_ind,l_ind;
int fd = -1;
int y=0;
char num[4]="000\0";
char virgola=',';
char newline='\n';
ssize_t w1;
unsigned int gray_inv_cons[indice2][indice1];
unsigned int my_blurring[60-9][80-9];
unsigned int my_blurring_inv[80-9][60-9];
unsigned int mio_edge[indice2/2-9][indice1/2-9]; //crea matrice di tutti uni (tuttobianco)
unsigned int gray_mat[indice1][indice2];
unsigned int * ptr=gray_inv;
int app;
int J_ind,X_ind,Y_ind,I_ind,media_pixel;
int ind_ri,ind_co;
char pixel_corrente;
float tmp,cast;
int soglia=0;
const int PSF[2][2]={ //matrice gaussiana 10 x 10 usata come kernel per il blurringdell'immagine in toni di grigio
{0.2500,0.2500},
{0.2500,0.2500}
};
const unsigned int sqrt_vett[256]
={1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9 1,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
---");#ifdef DEBUGfd=open("./gray_cons.doc",O_WRONLY|O_CREAT,0644); //per debugfor(i_ind=0;i_ind<160;i_ind++){for(j_ind=0;j_ind<120;j_ind++){y=gray_mat[i_ind][j_ind];{ //salvo file doc l'immagine in un formato compatibile colmatlabint2char(y,num);w1=write(fd,&num,3);w1=write(fd,&virgola,1);}w1=write(fd,&newline,1);}close(fd);#endifind_ri=0;//indice riga matrice resizedind_co=0;//indice colonna matrice resizedi_ind=0;j_ind=0;//riduce della metà le dimensioni della matricefor (i_ind=0;i_ind<=120-2;i_ind+=2){ //per tutte le righefor (j_ind=0;j_ind<=160-2;j_ind+=2){ //per tutte le colonnemio_resize[ind_ri][ind_co]=(gray_inv_cons[i_ind][j_ind]+gray_inv_cons[i_ind][j_ind+1]+gray_inv_cons[i_ind+1][j_ind]+gray_inv_cons[i_ind+1][j_ind+1])/4; //calcola lamedia dei 4 pixel adiacenti per ottenere il pixel nuovoind_co=ind_co+1;}ind_co=0;ind_ri=ind_ri+1;}printf("\n--- C O N S U M A T O R E : effettuata riduzione dell'immagine
---");motore('f',fd1);#ifdef DEBUGfd=open("./gray_cons_rid.doc",O_WRONLY|O_CREAT,0644); //per debug 1for(i_ind=0;i_ind<60;i_ind++){ //salvo doc l'immagine ridotta in un formato compa-tibile col matlabfor(j_ind=0;j_ind<80;j_ind++){y=mio_resize[i_ind][j_ind];int2char(y,num);w1=write(fd,&num,3);w1=write(fd,&virgola,1);}w1=write(fd,&newline,1);}close(fd);#endif#ifdef DEBUGchar *outfilename;//per debugint i=0;FILE *ofd = NULL;outfilename = strdup(DEFAULT_OUTFILE2);ofd = fopen(outfilename, "w");if(ofd == NULL) {perror(outfilename);exit(EXIT_FAILURE);}fprintf(ofd, "P5\n%d %d 255\n", 160, 120);for (i = 0; i < 19200; i++) { //salva in un file l'immagine acquisitay = gray_mat[i%indice1][i/indice1];fputc(y&0xFF, ofd);}fclose(ofd);#endiffor(j_ind=1;j_ind<(80-8);j_ind++){ //effettua blurring con pr. di convoluzione traimmagine e kernel PSFfor(i_ind=1;i_ind<(60-8);i_ind++){app=0;for(k_ind =
0;k_ind<2;k_ind++){
for(l_ind=0;l_ind<2;l_ind++){
pixel_corrente=mio_resize[i_ind+k_ind][j_ind+l_ind];
app+=pixel_corrente/4; //la PSF ha per elementi tutti 0.25 ossia 1/4
}
//uso gli interi per andare più veloce , visto che l'ARM è senza FPU
my_blurring[i_ind][j_ind]=abs(app);
}
}
printf("\n--- C O N S U M A T O R E : blurring completato ---\n");
for(i_ind=0;i_ind<80-9;i_ind++){ //calcola matrice trasposta dell'immagine blurred
for(j_ind=0;j_ind<60-9;j_ind++){
my_blurring_inv[i_ind][j_ind]=my_blurring[j_ind][i_ind];
}
}
printf("\n--- C O N S U M A T O R E : calcolata la trasposta dell'immagine blurred ---\n");
#ifdef DEBUG
fd=open("./gray_inv.doc",O_WRONLY|O_CREAT,0644); //per debug
for(i_ind=0;i_ind<120;i_ind++){
for(j_ind=0;j_ind<160;j_ind++){
y=gray_inv_cons[i_ind][j_ind];//salvo in file doc l'immagine trasp. in un formatocompatibile col
}
}
```html
<matlabint2char(y,num);w1=write(fd,&num,3);w1=write(fd,&virgola,1);}>
w1=write(fd,&newline,1);}>
close(fd);#endif#ifdef DEBUGfd=open("./blur.doc",O_WRONLY|O_CREAT,0644);//per debugfor(i_ind=0;i_ind<(60-9);i_ind++){ //azzera matrice mio_edgefor(j_ind=0;j_ind<(80-9);j_ind++){y=my_blurring[i_ind][j_ind]; //salvo doc l'immagine blurred in un formato compati-bile col matlabint2char(y,num);w1=write(fd,&num,3);w1=write(fd,&virgola,1);}>
w1=write(fd,&newline,1);}>
close(fd);#endif//edge detection del primo ordine con algoritmo di Sobel e soglia per binarizzazione//automaticaprintf("\n--- C O N S U M A T O R E : inizio calcolo soglia ");conta=0;sog=0;app=0;for (i_ind=0;i_ind<ed_im_dims1;i_ind=i_ind+2){ //indice di rigafor (j_ind=0;j_ind<ed_im_dims0;j_ind=j_ind+2){ //indice di colonnaapp+=my_blurring[i_ind][j_ind]; //calcolo approssimato del valore medio di tutti ipixelconta=conta+1; //per finire prima salto delle righe e delle colonne}
```//visto che l'errore commesso non è molto grosso
sog=(float)(app/conta);
media_pixel=(int)(sog); //trovo la media degli elementi dell'immagine in grayscale 1
soglia= 5*sqrt_vett[media_pixel]; // soglia per Sobel è 2*(media)^1/2
printf("\n--- C O N S U M A T O R E : soglia = %d \n",soglia);//calcola il prodotto di convoluzione coi due kernel
for (Y_ind=0;Y_ind
prod_parz_x;
s_lungo_y = s_lungo_y + prod_parz_y;
}}}
ax=abs(s_lungo_x); //trovo i valori assoluti delle approssimazioni delle componenti del radiente
ay=abs(s_lungo_y);
SUM = ax+ay; //calcolo l'approssimazione del modulo al quadrato del gradiente
if(SUM > 255) //effettuo saturazione dei valori
SUM = 255; //riportandoli all'intervallo [0,255]
else if(SUM < 0)
SUM = 0;
if(SUM > soglia) //effettuo la binarizzazione
mio_edge[Y_ind][X_ind] = 1; //se supero la soglia metto un pixel bianco
else
mio_edge[Y_ind][X_ind] = 0; //se non supero la soglia metto un pixel nero
}}
printf("\n--- C O N S U M A T O R E :calcolata matrice edge detection con Sobel e bi-narizzazione con soglia---\n");
#ifdef DEBUG
fd=open("./edge.doc",O_WRONLY|O_CREAT,0644);//per debug
for(i_ind=0;i_ind<ed_im_dims1-1;i_ind++){
for(j_ind=0;j_ind<ed_im_dims0;j_ind++){
y=mio_edge[i_ind][j_ind]; //salvo in un file doc l'immagine trattata con Sobel
int2char(y,num); //in un formato compatibile col
matlabw1=write(fd,&num,3);w1=write(fd,&virgola,1);}