Programa de PDI
-
Upload
macario-castillo -
Category
Documents
-
view
221 -
download
0
description
Transcript of 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
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;
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;
}
/* 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
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);
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)
{ 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;
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);
}
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;
}
/******************** 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:
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
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;
}
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;
}
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;
}
//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:
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;
}
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;
}
//Almacena el resultado en Result.bmp
gcPutImgBmp("rectangulos.bmp",Img1);
//Libera la Imagen utilizada
gcFreeImg(Img1);
system("pause");
return 0;
}
Imagen generada: