コード例 #1
0
ファイル: main.cpp プロジェクト: cristiaan3003/pdi-fich2015
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;
}
コード例 #2
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) */
}
コード例 #3
0
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;
}
コード例 #4
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;
}
コード例 #5
0
ファイル: main.c プロジェクト: lucasmoreira/USP
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;
}
コード例 #6
0
ファイル: main.c プロジェクト: Drebt/Bixos-2018
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;
}