Programa de PDI

18
Trabajo: Practica #1 Asignatura: Procesamiento digital de imágenes Profesor: Carlos Hugo García capulín Alumno: José Alfredo Macario Castillo Mendoza Carrera: Ing. en Mecatrónica Fecha: 18/09/2014

description

Programa de procesamiento digital de imágenes para la creación de imágenes binarias.

Transcript of Programa de PDI

Page 1: Programa de PDI

Trabajo:

Practica #1

Asignatura:

Procesamiento digital de

imágenes

Profesor:

Carlos Hugo García capulín

Alumno:

José Alfredo Macario

Castillo Mendoza

Carrera:

Ing. en Mecatrónica

Fecha:

18/09/2014

Page 2: Programa de PDI

Primer Programa:

Para este programa solo se modificó una de las funciones para generar la imagen

requerida.

/* **********************************************************************

PROCESAMIENTO DIGITAL DE IMAGENES

Biblioteca Basica de Funciones

Autor: Dr. Carlos Hugo Garcia Capulin

Ver 1.2

Prohibido su uso, distribucion y copia sin autorizacion por parte del autor.

INSTITUTO TECNOLOGICO SUPERIOR DE IRAPUATO.

**********************************************************************

*/

#include<stdio.h>

#include<stdlib.h>

/* ***************** ESTRUCTURAS DE DATOS ****************************** */

typedef unsigned char byte; // Tipo de dato de 1 byte

typedef unsigned short int word; // Tipo de dato de 2 bytes

typedef unsigned long int dword; // Tipo de dato de 4 bytes

typedef struct{ byte id[1]; // Identificador de fila BMP

word offset; // Offset al principio de la imagen

word ancho; // Columnas de la imagen

word alto; // Filas de la imagen

byte bpp; // Bits de color por pixel

int size; // Tamaño de la imagen

byte *head; // Puntero al encabezado

float *imx; // Puntero al inicio de la imagen

}gcIMG;

Page 3: Programa de PDI

gcIMG* gcGetImgBmp(char *ruta);

void gcPutImgBmp(char *ruta, gcIMG *img);

gcIMG*gcNewImg(int ancho,int alto);

void gcFreeImg (gcIMG *img);

int main(void)

{ gcIMG *Img1;

int i,j,a,b;

//Abrir una imagen llamada X.bmp

Img1=gcNewImg(256,256);

for(i=0; i<Img1->alto; i++)//este ciclo for crea la línea que va de abajo hacia arriba de izquierda a derecha

{

Img1->imx[i*Img1->alto+i]=255;

}

for(b=255,i=0;i<=255;i++, b--)//este ciclo for crea la line desde la parte superior de la imagen a las parte inferior de

izquierda a derecha.

{

Img1->imx[i*Img1->ancho+b]=255;

}

//Almacena el resultado en Result.bmp

gcPutImgBmp("X.bmp",Img1);

//Libera la Imagen utilizada

gcFreeImg(Img1);

system("pause");

return 0;

}

Page 4: Programa de PDI

/* FUNCIONES BASE DE PROCESAMIENTO DE IMAGENES */

/********************Funcion Uno ***********************************

Garcia Capulin Get Image Bmp

gcGetImgBmp()

Funcion que lee un archivo bmp y lo coloca en memoria para su Proc.

*/

gcIMG* gcGetImgBmp(char *ruta)

{ gcIMG *img;

FILE *file;

int i,j,a,ar;

// Abrir Archivo de entrada

if ( (file = fopen(ruta,"rb"))==NULL )

{ printf(" Error al Abrir Archivo \n");

exit(1);

}

// Asignar memoria para la estructura gcIMG

if ( (img = (gcIMG *) calloc(1,sizeof(gcIMG)) ) == NULL)

{ printf("Error al reservar memoria para gcIMG \n");

exit (1);

}

fread(img->id,2,1,file); // Lee 2 bytes del identificador

fseek(file,10,SEEK_SET); // Se posiciona en Data offset

fread(&img->offset,2,1,file); // Lee el offset de la Imagen

fseek(file,18,SEEK_SET); // Se posiciona en Width

Page 5: Programa de PDI

fread(&img->ancho,2,1,file); // Lee el ancho de la Imagen

fseek(file,22,SEEK_SET); // Se posiciona en Height

fread(&img->alto,2,1,file); // Lee el alto de la Imagen

fseek(file,28,SEEK_SET); // Se posiciona en Bits p/pixel

fread(&img->bpp,1,1,file); // Lee los Bpp

fseek(file,34,SEEK_SET); // Se posiciona en Size

fread(&img->size,4,1,file); // Lee el tamaño de la Imagen */

// Comprobar archivo valido

if ( (img->id[0]!='B')||(img->id[1]!='M') )

{ printf("Archivo de Formato No Valido \n");

exit (1);

}

// Asignar memoria para el encabezado

if ( (img->head = (unsigned char *) malloc(img->offset)) == NULL )

{ printf("Error al reservar memoria para el encabezado \n");

exit (1);

}

// Asignar memoria para la imagen real

if ( (img->imx =(float *)calloc(img->ancho*img->alto,sizeof(float))) == NULL )

{ printf("Error al reservar memoria para la imagen \n");

exit (1);

}

// Lectura del encabezado

rewind(file);

Page 6: Programa de PDI

fread(img->head,1078,1,file);

// Lectura de la imagen

a=img->ancho;

ar=img->size/img->alto; //calcula el ancho real

fseek(file,img->offset,SEEK_SET); // Se posiciona al inicio de la imagen

for (i=0; i<img->alto; i++)

{ for(j=0; j<img->ancho; j++)

img->imx[i*a+j]=(float)fgetc(file);

if(ar!=a) for(j=0;j<ar-a;j++) fgetc(file); // Si el ancho es mayor

} // brinca esos datos

fclose(file);

img->size=img->ancho*img->alto; //Asigna el Tamaño Real de la Imagen

return img;

}

/******************** Funcion Dos ***********************************

Garcia Capulin Put Image Bmp

gcPutImgBmp()

Funcion que envia a un archivo bmp una imagen en memoria.

*/

void gcPutImgBmp(char *ruta, gcIMG *img)

{ FILE *file;

int aux,zero=0,i,j,offset,Newancho;

// Crear un Archivo nuevo

if ((file = fopen(ruta,"w+b")) == NULL)

Page 7: Programa de PDI

{ printf("\nError abriendo el archivo \n");

exit(1);

}

//Checar si el ancho es multiplo de 4

offset=img->ancho%4;

if (offset) Newancho=img->ancho+(4-offset); //Si no hacerlo multiplo

else Newancho=img->ancho; // Si, si mantenerlo

// Checar el encabezado

if (img->head) { img->size=(Newancho*img->alto); //Modificar el bitmap size

fwrite(img->head,1078,1,file);

}

// Generar encabezado:

else {

fputc('B',file); fputc('M',file); // Escribe BMP Identificador

aux = Newancho * img->alto + 1078;

fwrite(&aux,4,1,file); // Escribe File Size

fwrite(&zero,4,1,file); // Escribe Word Reserved

aux=1078;

fwrite(&aux,4,1,file); // Escribe Data Offset

// Image Header

aux=40;

fwrite(&aux,4,1,file); // Escribe Header Size

aux=img->ancho;

fwrite(&aux,4,1,file); // Escribe Width

aux=img->alto;

fwrite(&aux,4,1,file); // Escribe Height

aux=1;

Page 8: Programa de PDI

fwrite(&aux,2,1,file); // Escribe Planes

aux=8;

fwrite(&aux,2,1,file); // Escribe Bits p/pixel

aux=0;

fwrite(&aux,4,1,file); // Escribe Compression

aux=(Newancho*img->alto);

fwrite(&aux,4,1,file); // Escribe Bitmap Size

aux=0;

fwrite(&aux,4,1,file); // Escribe HResolution

fwrite(&aux,4,1,file); // Escribe VResolution

aux=256;

fwrite(&aux,4,1,file); // Escirbe Colors used

aux=0;

fwrite(&aux,4,1,file); // Escirbe Important Colors

// Escritura de la paleta

for (aux=0; aux<256; aux++)

{ for (i=0; i<3; i++) fwrite(&aux,1,1,file);

fwrite(&zero,1,1,file);

}

}

// Escritura del mapa de bits

aux=img->ancho;

for(i=0;i<img->alto;i++)

for(j=0;j<Newancho;j++)

{ if(j>aux-1) fputc(0,file);

else fputc((unsigned char)img->imx[i*aux+j],file);

}

Page 9: Programa de PDI

fclose(file);

}

/******************** Funcion Tres ***********************************

Garcia Capulin New Image

gcNewImg()

Funcion que genera una matriz vacia de una imagen en memoria.

*/

gcIMG *gcNewImg(int ancho,int alto)

{

gcIMG *img;

int i;

if (( img = (gcIMG *) calloc(1,sizeof(gcIMG)) ) == NULL)

{ printf("Error al reservar memoria para gcIMG\n");

exit (1);

}

img->ancho = ancho;

img->alto = alto;

img->size = ancho*alto;

if (( img->imx = (float *) calloc(img->size,sizeof(float)) ) == NULL)

{ printf("Error al reservar memoria para la Imagen \n");

exit (1);

}

img->head = NULL;

return img;

}

Page 10: Programa de PDI

/******************** Funcion Cuatro ***********************************

Garcia Capulin Free Image

gcfreeImg()

Funcion que libera la memoria de una imagen.

*/

void gcFreeImg (gcIMG *img)

{ free(img->head);

free(img->imx);

free(img);

}

Imagen generada:

Page 11: Programa de PDI

Segundo Programa:

Para generar la segunda imagen de la práctica solo se modificó la función que crea la

imagen debido a lo cual solo se anexa esa parte del código.

int main(void)

{ gcIMG *Img1;

int i,b;

//Abrir una imagen llamada cuadro.bmp

Img1=gcNewImg(256,256);

for(i=40,b=40;b<=215;b++)//inicia la creación de la primera línea en los pintos 40,40 ( vertical).

{

Img1->imx[b*Img1->alto+i]=215;

}

for(b=40,i=40;i<=215;i++)//inicia la creación de la segunda línea en los puntos 40,40 (horizontal).

{

Img1->imx[b*Img1->ancho+i]=215;

}

for(b=40,i=215;b<=215;b++)//inicia la creación de la tercera línea (vertical).

{

Img1->imx[b*Img1->alto+i]=215;

}

for(i=40,b=215;i<=215;i++)//inicia la creación de la cuarta línea (horizontal).

{

Img1->imx[b*Img1->ancho+i]=215;

}

//Almacena el resultado en Result.bmp

gcPutImgBmp("cuadro.bmp",Img1);

//Libera la Imagen utilizada

Page 12: Programa de PDI

gcFreeImg(Img1);

system("pause");

return 0;

}

Imagen generada:

Tercer Programa:

Para el tercer programa igualmente solo se modificó la función siguiente para poder

generar otra imagen.

int main(void)

{ gcIMG *Img1;

int i,b;

//Abrir una imagen llamada X inscrita.bmp

Img1=gcNewImg(256,256);

for(i=40; i<=215; i++)//crea la primera diagonal inscrita.

{

Img1->imx[i*Img1->alto+i]=215;

}

Page 13: Programa de PDI

for(b=215,i=40;i<=215;i++, b--)//crea la segunda diagonal inscrita.

{

Img1->imx[i*Img1->ancho+b]=215;

}

for(i=40,b=40;b<=215;b++)//Este ciclo crea la primera línea del cuadro.

{

Img1->imx[b*Img1->alto+i]=215;

}

for(b=40,i=40;i<=215;i++)//Este ciclo crea la segunda línea del cuadro.

{

Img1->imx[b*Img1->ancho+i]=215;

}

for(b=40,i=215;b<=215;b++)//Este ciclo crea la tercera línea del cuadro.

{

Img1->imx[b*Img1->alto+i]=215;

}

for(i=40,b=215;i<=215;i++)//Este ciclo crea la cuarta línea del cuadro.

{

Img1->imx[b*Img1->ancho+i]=215;

}

//Almacena el resultado en Result.bmp

gcPutImgBmp("x inscrita.bmp",Img1);

//Libera la Imagen utilizada

gcFreeImg(Img1);

system("pause");

return 0;

}

Page 14: Programa de PDI

Imagen generada:

Cuarto Programa:

Para el cuarto programa de la misma manera solo se modificó la función siguiente para

generar otra imagen.

int main(void)

{ gcIMG *Img1;

int i,b;

//Abrir una imagen llamada cuadros.bmp

Img1=gcNewImg(256,256);

//Los dos siguientes ciclos juntos generaran el cuadro superior izquierdo blanco.

for(i=128;i<=255;i++)

for(b=0;b<=128;b++)

{

Img1->imx[i*Img1->ancho+b]=-1;

}

Page 15: Programa de PDI

//Los siguientes dos ciclos generaran el cuadro inferior derecho.

for(i=0;i<=128;i++)

for(b=128;b<=255;b++)

{

Img1->imx[i*Img1->ancho+b]=-1;

}

//Almacena el resultado en Result.bmp

gcPutImgBmp("cuadros.bmp",Img1);

//Libera la Imagen utilizada

gcFreeImg(Img1);

system("pause");

return 0;

}

Imagen generada:

Page 16: Programa de PDI

Quinto Programa:

Para generar la quinta imagen se tuvo que modificar la misma función que para todas

las demás imágenes.

int main(void)

{ gcIMG *Img1;

int i,b;

//Abrir una imagen llamada cuadro inscrito.bmp

Img1=gcNewImg(256,256);

for(i=64;i<=192;i++)

for(b=64;b<=192;b++)

{

Img1->imx[i*Img1->alto+b]=-1;

}

//Almacena el resultado en Result.bmp

gcPutImgBmp("cuadro inscrito.bmp",Img1);

//Libera la Imagen utilizada

gcFreeImg(Img1);

system("pause");

return 0;

}

Page 17: Programa de PDI

Imagen generada:

Sexto Programa:

int main(void)

{ gcIMG *Img1;

int i,b;

//Abrir una imagen llamada rectangulos.bmp

Img1=gcNewImg(256,256);

//El siguiente par de ciclos crea el rectángulo izquierdo en tono de blanco.

for(i=32;i<=224;i++)

for(b=32;b<=112;b++)

{

Img1->imx[i*Img1->ancho+b]=-1;

}

//El siguiente par de ciclos genera el segundo rectángulo en tono gris.

for(i=32;i<=224;i++)

for(b=128;b<=224;b++)

{

Img1->imx[i*Img1->ancho+b]=-127;

}

Page 18: Programa de PDI

//Almacena el resultado en Result.bmp

gcPutImgBmp("rectangulos.bmp",Img1);

//Libera la Imagen utilizada

gcFreeImg(Img1);

system("pause");

return 0;

}

Imagen generada: