Imagem* ler_imagem(char* nome_arquivo) { char P3[3]; int width; int height; int max_value; int i; int j; int r, g, b; FILE* arquivo; Imagem* img; arquivo = fopen(nome_arquivo, "r"); fscanf(arquivo, "%s", P3); fscanf(arquivo, "%i %i", &width, &height); fscanf(arquivo, "%i", &max_value); img = criar_imagem(width, height); for (i = 0; i < height; ++i) { for (j = 0; j < width; ++j) { fscanf(arquivo, "%i %i %i", &r, &g, &b); img->pixels[i][j].r = r; img->pixels[i][j].g = g; img->pixels[i][j].b = b; } } fclose(arquivo); return img; }
Imagem* binarizacao_imagem(Imagem* padrao, int limiar) { Imagem* copia = criar_imagem(padrao->width, padrao->height); int i; int j; int esc_C, a=0; for (i = 0; i < padrao->height; i++) { for (j = 0; j < padrao->width;j++) { esc_C = 0; esc_C = esc_C + padrao->pixels[i][j].r; esc_C = esc_C + padrao->pixels[i][j].g; esc_C = esc_C + padrao->pixels[i][j].b; esc_C = sat(esc_C/3); if(esc_C > limiar){ a=000; }else{ a=255; } copia->pixels[i][j].r = a; copia->pixels[i][j].g = a; copia->pixels[i][j].b = a; } } return copia; }
Imagem* zoom2x(Imagem* org) { int i; int j; Pixel p, a, b, d, e, c; Imagem* nova; nova = criar_imagem(org->width * 2, org->height * 2); limpar(nova, rgb(255, 255, 255)); for (i = 0; i < org->height; ++i) { for (j = 0; j < org->width; ++j) { nova->pixels[i*2][j*2] = org->pixels[i][j]; } } for (i = 0; i < org->height; ++i) { for (j = 0; j < org->width; ++j) { if (j+1 < org->width) { a = org->pixels[i][j]; b = org->pixels[i][j+1]; p = calculo_media(a, b); } if (j != 0) { nova->pixels[i*2][j*2-1] = p; } if (i+1 < org->height) { a = org->pixels[i][j]; b = org->pixels[i+1][j]; p = calculo_media(a, b); } if (i != 0) { nova->pixels[i*2-1][j*2] = p; } } } for (i = 0; i < nova->height - 2; i += 2) { for (j = 0; j < nova->width - 2; j += 2) { a = nova->pixels[i][j+1]; b = nova->pixels[i+1][j]; d = nova->pixels[i+1][j+2]; e = nova->pixels[i+2][j+1]; c = calculo_media4(&a, &b, &d, &e); nova->pixels[i+1][j+1] = c; } } return nova; }
Imagem* rotacionar90(Imagem* original) { int i; int j; int w = original->width; int h = original->height; Imagem* nova = criar_imagem(h, w); for (i = 0; i < h; ++i) { for (j = 0; j < w; ++j) { nova->pixels[j][(h - 1) - i] = original->pixels[i][j]; } } return nova; }
int main() { Imagem* img; Imagem* cop; int i; img = ler_imagem("conv.ppm"); cop = criar_imagem(img->width, img->height); for (i = 0; i < 1; ++i) { aplicar_filtro_1(cop, img); igualar_imagem(img, cop); } salvar_imagem(cop, "conv_copia.ppm"); return 0; }
Imagem* ler_imagem(char* nome_arquivo) { char P3[3]; int width; int height; int max_value; int i; int j; unsigned char r, g, b; FILE* arquivo; Imagem* img; arquivo = fopen(nome_arquivo, "r"); fscanf(arquivo, "%s", P3); fscanf(arquivo, "%i %i", &width, &height); fscanf(arquivo, "%i", &max_value); img = criar_imagem(width, height); if (P3[1] == '3') { for (i = 0; i < height; ++i) { for (j = 0; j < width; ++j) { fscanf(arquivo, "%i %i %i", &r, &g, &b); img->pixels[i][j].r = r; img->pixels[i][j].g = g; img->pixels[i][j].b = b; } } } else if (P3[1] == '6') { fscanf(arquivo, "%c", &r); for (i = 0; i < height; ++i) { for (j = 0; j < width; ++j) { fscanf(arquivo, "%c%c%c", &r, &g, &b); img->pixels[i][j].r = (unsigned int) r; img->pixels[i][j].g = (unsigned int) g; img->pixels[i][j].b = (unsigned int) b; } } } else { printf("Erro: formato de imagem desconhecida\n"); return NULL; } fclose(arquivo); return img; }
Imagem* reduzir2x(Imagem* org) { int i; int j; Pixel p, a, b, d, e, c; Imagem* nova; nova = criar_imagem(org->width / 2, org->height / 2); limpar(nova, rgb(255, 255, 255)); for (i = 0; i < org->height - 2; i += 2) { for (j = 0; j < org->width - 2; j += 2) { a = org->pixels[i][j]; b = org->pixels[i][j+1]; c = org->pixels[i+1][j]; d = org->pixels[i+1][j+1]; p = calculo_media4(&a, &b, &c, &d); nova->pixels[i/2][j/2] = p; } } return nova; }
Imagem* gaussianblur(Imagem* original) { Imagem* modificada = criar_imagem(original->width, original->height); int width; int height; int i; int j; int k; int m; int r; int g; int b; int acc; height = original->height; width = original->width; for (i = 1; i < height - 1; ++i) { for (j = 1; j < width - 1; ++j) { calculo_gaussianblur(modificada, original, i, j); } } return modificada; }