int main() { //kernels CImg<bool> img,umbral,se0(3,3),se1(3,3); se0.fill(1); // Structuring element 1 se1.fill(0,1,0,1,1,1,0,1,0); //imagen CImg<double> original; original.load("../../../../images/Morfologia/Tarjeta.jpeg"); //Visualizo el histograma para ver el nivel de umbral //original.get_histogram(256,0,255).display_graph(); //Umbralado de la imagen (negativizo porque erode y dilate trabajan sobre los blancos) umbral = negativo(original.get_threshold(232)); img = umbral; //Aplico segmentacion erosionando fuertemente y reconstruyendo img = img.get_erode(se0).get_dilate(se1).get_erode(se0).get_dilate(se1).get_erode(se0); img = reconstruccion_dilatacion(umbral,img);//Reconstruccion es la posta //Visualizo (original,umbral,NOTimg(img)).display(); return 0; }
int main(int argc, char *argv[]){ /* funcao principal que recebe uma letra 'n', 'e' ou 'p' de maneira a escolher a funcao que define o novo formato da imagem */ switch(argv[1][0]) { case 'n':{ cabecalho("# negativo", 1, 1); negativo(); break; } case 'e': { cabecalho("# espelho", 1, 1); espelho(); break; } case 'p': { cabecalho("# padrao", atoi(argv[2]), atoi(argv[3])); padrao(atoi(argv[2]), atoi(argv[3])); break; } default: return EXIT_FAILURE; /* Opção desconhecida (STDLIB)*/ } return EXIT_SUCCESS; /* Termina o programa com sucesso (STDLIB) */ }
int main() { /* Matriz que armazena os pixels da imagem */ int img[MAX_TAM][MAX_TAM]; /* Atributos da imagem */ int W, H, MaxV; /* Identificador do filtro a ser utilizado */ int F; /* Parametro a ser passado para o cisalhamento */ double Px, Py; /* Le a imagem */ if (ler_pgm(img, &W, &H, &MaxV, &F, &Px, &Py) != 1) { printf("Error: nao foi possivel ler a imagem\n"); return 0; } /* Seleciona o filtro */ switch (F) { case 1: negativo(img, W, H, MaxV); break; case 2: rotacao180(img, W, H); break; case 3: detectaBorda(img, W, H, MaxV); break; case 4: cisalhamento(img, W, H, Px, Py); break; } /* Escreve a imagem */ escrever_pgm(img, W, H, MaxV); return 0; }
/* * Programa que lee un archivo de imagen BMP y almacena su contenido en * la estructura archivo_bmp, la cual, a su vez, guardará el header, la * paleta de coloures (si la hay) y la MATRIZ (pertenenciente a la * imagen real) en respectivas variables. Luego, de acuerdo a los * parámetros recibidos, invocará a las diferentes funciones asociadas a * éstos, a fin de manipular la imagen. * Por último, de ser necesario, se escribirá la información en un nuevo * archivo. */ int main(int argc, char *argv[]){ FILE *bmp; FILE *copia_bmp; archivo_bmp image; int j=1,aux; char entro='N'; char okey='F';/*F=FALSE*/ /*Se recorre el arreglo de parámetros al main.*/ while ((*(argv[j]+1)!='i') &&(j<=argc)) /*Busco -i y abro el archivo.*/ j++; if ((*(argv[j])=='-')&&(*(argv[j]+1)=='i')&&(*(argv[j]+2)=='\0')){ if ((argc-1) == j) ayuda(ERROR); else{ j++; bmp=fopen(argv[j],"r"); if (bmp==NULL){ printf("No se pudo abrir el archivo. \n"); exit(1); } image=leer_bmp(bmp); fclose(bmp); } } for (j=1;j<argc;j++){ /*Se consulta por el patrón "-" + argumento + " ".*/ if(*argv[j]=='-'){ if (*(argv[j]+2)=='\0'){ switch (*(argv[j]+1)){ case '?': ayuda(OK); break; case 'h': ayuda(OK); break; case 's': imprimir_header(image.h, image.rgb); okey='T';/*T=TRUE*/ break; case 'p': image.matriz=invertir(image.matriz); break; case 'r': image.matriz=rotar(image.matriz); image.h.ih.width=image.matriz.max_columnas; image.h.ih.height=image.matriz.max_filas; aux=image.h.ih.XpixelsPerM; image.h.ih.XpixelsPerM=image.h.ih.YpixelsPerM; image.h.ih.YpixelsPerM=aux; break; case 'n': image.matriz=negativo(image.matriz,image.h.ih.BitCount); break; case 'd': image.matriz=duplicar(image.matriz,image.h.ih.BitCount); image.h.ih.width=image.h.ih.width*2; image.h.ih.height=image.h.ih.height*2; image.h.ih.XpixelsPerM=image.h.ih.XpixelsPerM*2; image.h.ih.YpixelsPerM=image.h.ih.YpixelsPerM*2; image.h.ih.imageSize=image.h.ih.height*image.h.ih.width; image.h.fh.FileSize=(image.h.ih.height*image.h.ih.width)*(image.h.ih.BitCount/8)+54; if(image.h.ih.BitCount<=8) image.h.fh.FileSize+=(4*image.h.ih.coloursUsed); break; case 'f': image.matriz=reducir(image.matriz,image.h.ih.BitCount); image.h.ih.width=image.h.ih.width/2; image.h.ih.height=image.h.ih.height/2; image.h.ih.XpixelsPerM=image.h.ih.XpixelsPerM/2; image.h.ih.YpixelsPerM=image.h.ih.YpixelsPerM/2; image.h.ih.imageSize=image.h.ih.height*image.h.ih.width; image.h.fh.FileSize=(image.h.ih.height*image.h.ih.width)*(image.h.ih.BitCount/8)+54; if(image.h.ih.BitCount<=8) image.h.fh.FileSize+=(4*image.h.ih.coloursUsed); break; case 'b':if ((argc-1) == j) ayuda(ERROR); else{ j++; /*Con la función atoi() convierto un string a entero y, * utilizando abs(), me aseguro que el resultado sea siempre positivo. (1)*/ int radio=abs(atoi(argv[j])); image.matriz=blur(image.matriz,image.h.ih.BitCount,radio); } break; case 'o': if ((argc-1) == j) ayuda(ERROR); else{ j++; copia_bmp=fopen(argv[j],"w"); entro='S'; /*Utilizo la variable entro para indicar que se recibió el parámetro -o.*/ } break; case 'i': if ((argc-1) == j) ayuda(ERROR); else{ j++; } break; default: printf("\nERROR: Incorrect parameters.\n");//Si el parámetro es incorrecto se interrumpe el programa. ayuda(ERROR); } }else{ if((*(argv[j]+1)=='l')&&(*(argv[j]+3)=='\0')){ /* Si los parámetros recibidos son lh o lv..*/ switch (*(argv[j]+2)){ case 'h': if ((argc-3) <= j) ayuda(ERROR); else{ int width=abs(atoi(argv[j+1])); /*Vale la aclaración (1).*/ int space=abs(atoi(argv[j+2])); /*Vale la aclaración (1).*/ int colour=abs(atoi(argv[j+3]));/*Vale la aclaración (1).*/ image.matriz=lineas_horizontales(image.matriz,width,space,colour); j+=3; } break; case 'v': if ((argc-3) <= j) ayuda(ERROR); else{ int width=abs(atoi(argv[j+1]));/*Vale la aclaración (1).*/ int space=abs(atoi(argv[j+2]));/*Vale la aclaración (1).*/ int colour=abs(atoi(argv[j+3]));/*Vale la aclaración (1).*/ image.matriz=lineas_verticales(image.matriz,width,space,colour); j+=3; } break; default: printf("\nERROR: Parametros incorrectos.\n");//Si el parámetro es incorrecto se interrumpe el programa. ayuda(ERROR); } } } }else{ /*En caso que el patrón no se cumpla, se llama a la función ayuda interrumpiendo el programa a través de la función EXIT (librería stdlib.h).*/ printf("\nERROR: Parametros incorrectos.\n\n"); ayuda(ERROR); } } /* Si la condición de los siguientes if es falsa, significa * que el único parámetro recibido (además de -i) fue -s, * por lo que NO debo crear una copia*/ if((argc!=4)){ if(entro=='N') copia_bmp=fopen("out.bmp","w"); escribir_bmp(image,copia_bmp); fclose(copia_bmp); } else{ if(okey=='F'){ if(entro=='N') copia_bmp=fopen("out.bmp","w"); escribir_bmp(image,copia_bmp); fclose(copia_bmp); } } liberar_matriz(image.matriz.m,image.matriz.max_filas); free(image.rgb); return 0; }
int main() { int m[MAXLINHA][MAXCOLUNA], linhas, colunas, maiorValor; int c_m[MAXLINHA][MAXCOLUNA], c_linhas, c_colunas, c_maiorValor; char nome_arquivo[MAX_NAME], c_nome_arquivo[MAX_NAME], complemento[MAX_NAME], menu = '9'; int a, b, c, d, t = 0, index_char; printf("Digite o nome do arquivo de entrada: "); scanf("%s", nome_arquivo); while (le_pgm(nome_arquivo, m, &linhas, &colunas, &maiorValor) == 0) { printf("Digite o nome do arquivo de entrada: "); scanf("%s", nome_arquivo); } printf("Arquivo %s.pgm carregado com sucesso.\n", nome_arquivo); imprime_menu(); while(menu != 's') { if (menu == 'c') { printf("Digite o nome do arquivo de entrada: "); scanf("%s", nome_arquivo); if (le_pgm(nome_arquivo, m, &linhas, &colunas, &maiorValor) == 1) { t = 0; printf("Arquivo %s.pgm carregado com sucesso.\n\n", nome_arquivo); } else return 0; } else if (menu == 'a') { imprime_menu(); } else if (menu == 't') { imprime_matriz(m, linhas, colunas); } else if (menu == 'n') { negativo(m, linhas, colunas); complemento[t++] = 'n'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'r') { rotacao(m, &linhas, &colunas); complemento[t++] = 'r'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'v') { rebatimentoVertical(m, linhas, colunas); complemento[t++] = 'v'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'h') { rebatimentoHorizontal(m, linhas, colunas); complemento[t++] = 'h'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'x') { printf("Informe x superior: "); scanf("%d", &a); printf("Informe y superior: "); scanf("%d", &b); printf("Informe x inferior: "); scanf("%d", &c); printf("Informe y inferior: "); scanf("%d", &d); if (a < 0 || b < 0 || c > (linhas - 1) || d > (colunas - 1) || a > c || b > d) { printf("Limites invalidos\n\n"); } else { corte(m, &linhas, &colunas, a, b, c, d); complemento[t++] = 'x'; printf("Operacao realizada com sucesso.\n"); } } else if (menu == 'e') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } filtroErosao(m, linhas, colunas, a); complemento[t++] = 'e'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'd') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } filtroDilatacao(m, linhas, colunas, a); complemento[t++] = 'd'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'm') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } filtroMediana(m, linhas, colunas, a); complemento[t++] = 'm'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'z') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } filtroMedia(m, linhas, colunas, a); complemento[t++] = 'z'; printf("Operacao realizada com sucesso.\n"); } else if (menu == '1') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } printf("Informe o valor de k: "); scanf("%d", &b); filtroBorda1(m, linhas, colunas, a, b); complemento[t++] = '1'; printf("Operacao realizada com sucesso.\n"); } else if (menu == '2') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } printf("Informe o valor de k: "); scanf("%d", &b); filtroBorda2(m, linhas, colunas, a, b); complemento[t++] = '2'; printf("Operacao realizada com sucesso.\n"); } else if (menu == '3') { printf("Digite o tamanho da janela: "); scanf("%d", &a); while(a < 3 || a > 50) { printf("Tamanho invalido. A janela deve ser entre 3 e 50.\n"); printf("Digite o tamanho da janela: "); scanf("%d", &a); } printf("Informe o valor de k: "); scanf("%d", &b); filtroBorda3(m, linhas, colunas, a, b); complemento[t++] = '3'; printf("Operacao realizada com sucesso.\n"); } else if (menu == 'g') { for(index_char = 0; nome_arquivo[index_char] != 0; index_char++) { c_nome_arquivo[index_char] = nome_arquivo[index_char]; } if (t > 0) c_nome_arquivo[index_char++] = '-'; for(a = 0; a < t; a++) c_nome_arquivo[index_char++] = complemento[a]; while(c_nome_arquivo[index_char] != 0) c_nome_arquivo[index_char++] = 0; grava_pgm(c_nome_arquivo, m, linhas, colunas, maiorValor); printf("%s.pgm\nArquivo %s.pgm gravado com sucesso.\n", c_nome_arquivo, c_nome_arquivo); } else if (menu == 'C') { printf("Digite o nome do arquivo para comparacao: \n"); scanf("%s", c_nome_arquivo); if (le_pgm(c_nome_arquivo, c_m, &c_linhas, &c_colunas, &c_maiorValor) == 1) { if (c_linhas != linhas || c_colunas != colunas) { printf("As matrizes tem dimensoes diferentes.\n"); } else { /* Compara valor a valor e verifica se é igual ou diferente */ c = 1; for(a = 0; a < linhas; a++) { for(b = 0; b < colunas; b++) { if (m[a][b] != c_m[a][b]) { c = 0; break; } } if (c == 0) break; } if (c == 0) printf("As matrizes tem dimensoes diferentes.\n"); else printf("As matrizes sao iguais.\n"); } } else { printf("Falha ao carregar arquivo %s.pgm de comparacao.\n", c_nome_arquivo); } } else if (menu != '9') { printf("Comando invalido\n"); } printf("Digite um comando: "); scanf(" %c", &menu); } return 0; }
void main(int argc, char *argv[]) { char prefixo_arquivo_out[MAX_NAME - 4]; int imagem[MAXLINHA][MAXCOLUNA]; int linhas, colunas, maiorValor, check, larguraJanela, k, limiteValido = 0; const char comandos[] = "nrvhedmz123xctgCas"; char comando = 0; int flag = 0; if (argc < 2) { printf("Usage: %s <arquivo entrada>\n", argv[0]); exit(0); } if (le_pgm(argv[1], imagem, &linhas, &colunas, &maiorValor)) { printf("Arquivo %s.pgm carregado com sucesso.\n", argv[1]); } else { exit(0); } strcpy(prefixo_arquivo_out, argv[1]); void menu(); while (comando != 's') { printf("Digite um comando: "); scanf(" %c", &comando); if (!strchr (comandos, comando)) { printf("Comando invalido\n"); continue; } for (int i = 4; i < 11; i++) { if (comando == comandos[i]) { larguraJanela = 0; while (larguraJanela < JANELA_MIN || larguraJanela > JANELA_MAX) { printf("Digite o tamanho da janela: "); scanf("%d", &larguraJanela); if (larguraJanela < JANELA_MIN || larguraJanela > JANELA_MAX) { printf("Tamanho invalido. A janela deve ser entre %d e %d.\n", JANELA_MIN); } } } } if (comando == '1' || comando == '2' || comando == '3') { printf("Informe o valor de k: "); scanf("%d", &k); } if (comando = 'n') negativo(imagem, linhas, colunas); if (comando = 'r') rotacao(imagem, &linhas, &colunas); if (comando = 'v') rebatimentoVertical(imagem, linhas, colunas); if (comando = 'h') rebatimentoHorizontal(imagem, linhas, colunas); if (comando = 'e') filtroErosao(imagem, linhas, colunas, larguraJanela); if (comando = 'd') filtroDilatacao(imagem, linhas, colunas, larguraJanela); if (comando = 'm') filtroMediana(imagem, linhas, colunas, larguraJanela); if (comando = 'z') filtroMedia(imagem, linhas, colunas, larguraJanela); if (comando = '1') filtroBorda1(imagem, linhas, colunas, larguraJanela, k); if (comando = '2') filtroBorda2(imagem, linhas, colunas, larguraJanela, k); if (comando = '3') filtroBorda3(imagem, linhas, colunas, larguraJanela, k); if (comando = 'a') menu(); if (comando == 'c') { check = 0; while (!check) { printf("Digite o nome do arquivo de entrada: "); scanf("%s", argv[1]); if ((check = le_pgm(argv[1], imagem, &linhas, &colunas, &maiorValor))) printf("Arquivo %s.pgm carregado com sucesso.\n\n", argv[1]); } strcpy(prefixo_arquivo_out, argv[1]); flag = 0; } if (comando == 't') { imprimeMatriz(imagem, linhas, colunas); printf("\n"); } if (comando == 'x') { int xsup, ysup, xinf, yinf; printf("Informe x superior: "); scanf("%d", &xsup); printf("Informe y superior: "); scanf("%d", &ysup); printf("Informe x inferior: "); scanf("%d", &xinf); printf("Informe y inferior: "); scanf("%d", &yinf); if (xsup < 0 || ysup < 0 || xinf >= linhas || yinf >= colunas || xsup > xinf || ysup > yinf) limiteValido = 0; else limiteValido = 1; if (limiteValido) { corte(imagem, &linhas, &colunas, xsup, ysup, xinf, yinf); if (!flag) { strcat(prefixo_arquivo_out, "-"); flag = 1; } strncat(prefixo_arquivo_out, &comando, 1); printf("Operacao realizada com sucesso.\n"); } else { printf("Limites invalidos\n\n"); } } if (comando == 'g') { grava_pgm(prefixo_arquivo_out, imagem, linhas, colunas, maiorValor); printf("%s.pgm\n", prefixo_arquivo_out); printf("Arquivo %s.pgm gravado com sucesso.\n", prefixo_arquivo_out); } if (comando == 'C') { int c[MAXLINHA][MAXCOLUNA]; int linhasC, colunasC, maiorValorC; char prefixo_arquivo_c[MAX_NAME - 4]; posicao erro; check = 0; while (!check) { printf("Digite o nome do arquivo com a imagem a ser comparada: "); scanf("%s", prefixo_arquivo_c); check = le_pgm(prefixo_arquivo_c, c, &linhasC, &colunasC, &maiorValorC); } erro = compara(imagem, c, linhas, linhasC, colunas, colunasC); if (erro.linha == -2 && erro.coluna == -2) { printf("As matrizes sao iguais\n"); } else if (erro.linha == -1 && erro.coluna == -1) { printf("As matrizes tem dimensoes diferentes\n"); } else { printf("As matrizes tem valores diferentes na posicao %d, %d\n", erro.linha, erro.coluna); } } for (int i = 0; i < 11; i++) { if (comando == comandos[i]) { if (flag == 0) { strcat(prefixo_arquivo_out, "-"); flag = 1; } strncat(prefixo_arquivo_out, &comando, 1); printf("Operacao realizada com sucesso.\n"); } } } return; }