/* Segmentação de regiao homogenea - algoritmo de Blob coloring */ // aqui estamos pegando os valores de pixel que tem media 3 x 3 abaixo de um limiar // #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, L; int aux, ai, aj , label = 0, nrnc , ac1 ,vlabel = 0; float A = 0, B = 0, XY = 0, w = 0, ac2, ac3, ac4; 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 ("%d", &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; 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; 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; // printf(" o valor de A é %f \n",A); // printf(" o valor de B é %f \n",B); // printf(" o valor de XY é %f \n",XY); 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 = A ; 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 = B; label_matriz[i][j] = label; label_matriz[i-1][j] = label; if ((XY <= L) && (A <= L)) { label_matriz[i][j-1] = label; } } } else { label = XY; label_matriz[i][j]= label; } // printf(" o valor de label_matriz é %d \n",label_matriz[i][j]); } } k = 0; f = fopen ("blob_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); }