/* Segmentação de regiao homogenea - algoritmo de Blob coloring variância*/ #include <stdio.h> #include <math.h> #define MAX #include "lib.h" void ajeita(int i,int j,int lold,int m[1024][1024]) { if (m[i][j-1] == lold) { m[i][j-1] = m[i][j]; ajeita(i, j-1, lold, m); } if (m[i-1][j] == lold) { m[i-1][j] = m[i][j]; ajeita(i-1, j, lold, m); } if (m[i][j+1] == lold) { m[i][j+1] = m[i][j]; ajeita(i, j+1, lold, m); } if (m[i+1][j] == lold) { m[i+1][j] = m[i][j]; ajeita(i+1, j, lold, m); } } int main (int argc, char *argv[]) { int i=0, j=0, k=0, xmin=0, xmax=0, kk=0 ,b =0 ,a = 0, ax=0, h=0, p=0, r=0, z=0, old=-1; int aux, ai, aj , label = 0, nrnc , ac1 ,vlabel = 0; float A = 0, B = 0, XY = 0, w = 0, ac2, ac3, ac4, L; FILE *f; IMAGE im; int imagem_copia[1024][1024], imagem_final[1024][1024], label_matriz[1024][1024]; if (argc < 2) { printf ("A imagem não estã disponível <imagem> \n"); exit (1); } im = Input_PBM (argv[1]); if (im == 0) { printf ("No input image ('%s') \n", argv[1]); exit (2); } // entrada do parametro de criterio printf ("entre com o valor do limiar \n"); scanf ("%f", &L); //copia da imagem original para as outras utilizadas for (i=1; i < im->info->nr - 1 ; i++) { for (j=1; j < im->info->nc - 1 ; j++) { imagem_copia[i][j] = im->data[i][j]; imagem_final[i][j] = 255; label_matriz[i][j] = 0; } } for (i = 3; i< im->info->nr-2; i++) { for (j = 3; j< im->info->nc-2; j++) { A = (imagem_copia[i-1][j-3] + imagem_copia[i-1][j-2] + imagem_copia[i-1][j-1] + imagem_copia[i][j-3] + imagem_copia[i][j-2] + imagem_copia[i][j-1] + imagem_copia[i+1][j-3] + imagem_copia[i+1][j-2] + imagem_copia[i+1][j-1])/9; A = ((imagem_copia[i-1][j-3]-A)*(imagem_copia[i-1][j-3]-A) + ( imagem_copia[i-1][j-2]-A)*( imagem_copia[i-1][j-2]-A) + ( imagem_copia[i-1][j-1]-A)* ( imagem_copia[i-1][j-1]-A) + ( imagem_copia[i][j-3]-A)*( imagem_copia[i][j-3]-A) + (imagem_copia[i][j-2]-A)*(imagem_copia[i][j-2]-A) + ( imagem_copia[i][j-1]-A)* ( imagem_copia[i][j-1]-A) + ( imagem_copia[i+1][j-3]-A)* ( imagem_copia[i+1][j-3]-A)+ (imagem_copia[i+1][j-2]-A)*(imagem_copia[i+1][j-2]-A) + (imagem_copia[i+1][j-1] - A )*(imagem_copia[i+1][j-1] - A ) )/9; B = (imagem_copia[i-3][j] + imagem_copia[i-3][j+1] + imagem_copia[i-3][j+2] + imagem_copia[i-2][j] + imagem_copia[i-2][j+1] + imagem_copia[i-2][j+2] + imagem_copia[i-1][j] + imagem_copia[i-1][j+1] + imagem_copia[i-1][j+2])/9; B = ((imagem_copia[i-3][j]-B) * (imagem_copia[i-3][j]-B) + ( imagem_copia[i-3][j+1]-B)*( imagem_copia[i-3][j+1]-B) + ( imagem_copia[i-3][j+2]-B)* ( imagem_copia[i-3][j+2]-B) + (imagem_copia[i-2][j]-B)* (imagem_copia[i-2][j]-B) + (imagem_copia[i-2][j+1]-B)*(imagem_copia[i-2][j+1]-B) + ( imagem_copia[i-2][j+2]-B)*( imagem_copia[i-2][j+2]-B) + (imagem_copia[i-1][j]-B)* (imagem_copia[i-1][j]-B) + ( imagem_copia[i-1][j+1]-B)* ( imagem_copia[i-1][j+1]-B) + ( imagem_copia[i-1][j+2]-B)* ( imagem_copia[i-1][j+2]-B) )/9; XY = (imagem_copia[i-1][j-1] + imagem_copia[i-1][j] + imagem_copia[i+1][j+1] + imagem_copia[i][j-1] + imagem_copia[i][j] + imagem_copia[i][j+1] + imagem_copia[i+1][j-1] + imagem_copia[i+1][j] + imagem_copia[i+1][j+1])/9; XY = ((imagem_copia[i-1][j-1]-XY) *(imagem_copia[i-1][j-1]-XY) + (imagem_copia[i-1][j]-XY)*(imagem_copia[i-1][j]-XY) + (imagem_copia[i+1][j+1]-XY)* (imagem_copia[i+1][j+1]-XY) + ( imagem_copia[i][j-1]-XY)* ( imagem_copia[i][j-1]-XY) + ( imagem_copia[i][j]-XY) *( imagem_copia[i][j]-XY) + (imagem_copia[i][j+1]-XY)*(imagem_copia[i][j+1]-XY) + ( imagem_copia[i+1][j-1]-XY) *( imagem_copia[i+1][j-1]-XY) + (imagem_copia[i+1][j]-XY)* (imagem_copia[i+1][j]-XY) + ( imagem_copia[i+1][j+1]-XY)*( imagem_copia[i+1][j+1]-XY) )/9; // A = (int) (A * 100); //B = (int) (B * 100); //XY = (int) (XY * 100); //printf(" o valor de A é %f \n",A); //printf(" o valor de B é %f \n",B); //printf(" o valor de XY é %f \n",XY); // printf(" o valor de L é %f \n",L); if ((XY <= L) && (A <= L)) { if (label_matriz[i][j-1] != 0) { label_matriz[i][j] = label_matriz[i][j-1]; if ((XY <= L) && (B <= L)) { if ((label_matriz[i-1][j] != 0) && (label_matriz[i-1][j] != label_matriz[i][j])) { old = label_matriz[i-1][j]; label_matriz[i-1][j] = label_matriz[i][j]; ajeita(i-1, j, old, label_matriz); //Acertando os anteriores } } } else { label = imagem_copia[i][j-1] ; label_matriz[i][j] = label; label_matriz[i][j-1] = label; if ((XY <= L) && (B <= L)) { label_matriz[i-1][j] = label; } } } else if ((XY <= L) && (B <= L)) { if (label_matriz[i-1][j] != 0) { label_matriz[i][j] = label_matriz[i-1][j]; } else { label = imagem_copia[i-1][j]; label_matriz[i][j] = label; label_matriz[i-1][j] = label; if ((XY <= L) && (A <= L)) { label_matriz[i][j-1] = label; } } } else { label = imagem_copia[i][j]; label_matriz[i][j]= label; } // printf(" o valor de label_matriz é %d \n",label_matriz[i][j]); } } k = 0; f = fopen ("blobvar_res.pgm", "w"); fprintf (f, "P2\n%d %d\n255\n", im->info->nc, im->info->nr); for (i=0; i<im->info->nr; i++) for (j=0; j<im->info->nc; j++) { // kk = imagem_final[i][j]; // if (kk < 0) kk = 0; // else if (kk > 255) kk = 255; fprintf (f, "%3d ", label_matriz[i][j]); k++; if (k > im->info->nc) { k = 0; fprintf (f, "\n"); } } fprintf (f, "\n"); fclose (f); }