20
06 Introducción al procesamiento de imágenes BMP con ANSI C Estructuras de datos (Prof. Edgardo A. Franco) 1 Prof. Edgardo Adrián Franco Martínez http://computacion.cs.cinvestav.mx/~efranco [email protected]

06 Introducción al procesamiento de imágenes BMP con ANSI C

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 06 Introducción al procesamiento de imágenes BMP con ANSI C

06 Introducción al procesamiento de imágenes BMP con ANSI C

Estructuras de datos (Prof. Edgardo A. Franco)

1

Prof. Edgardo Adrián Franco Martínez http://computacion.cs.cinvestav.mx/~efranco [email protected]

Page 2: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Contenido

• La imagen BMP • Estructura de un archivo BMP • Cabecera de un BMP de 24 Bits • Cabecera de un BMP de 24 Bits en C • Recordatorio de C

• Declarando y usando un arreglo dinámico de 2 dimensiones en C • Abrir archivos en C • Cerrar archivos en C • Posicionamiento en el archivo • Lectura por flujo en C • Escritura por flujo en C

• Lectura de los pixeles de un BMP de 24 bits • Procesamiento de imágenes • RGB a escala de grises 2

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

C

on

ten

ido

Page 3: 06 Introducción al procesamiento de imágenes BMP con ANSI C

La imagen BMP

• El formato BMP es uno de los más simples. Fue desarrollado por Microsoft e IBM en forma conjunta, lo que explica su uso particularmente amplio en plataformas Windows y OS/2.

• Un archivo BMP es un archivo de mapa de bits, es decir, un archivo de imagen de gráficos, con píxeles almacenados en forma de tabla de puntos que administra los colores como colores reales o usando una paleta indexada.

• El formato BMP ha sido estructurado y diseñado de manera tal que permite obtener un mapa de bits independiente del dispositivo de visualización periférico (DIB, Mapa de bits independiente del dispositivo).

3

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

La

imag

en B

MP

Page 4: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Estructura de un archivo BMP

• Un archivo BMP contiene una cabecera y a los pixeles de una imagen.

4

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

Es

tru

ctu

ra d

e u

n a

rch

ivo

BM

P

Cabecera (Metadatos) – 54Bytes

Imagen

Page 5: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Cabecera de un BMP de 24 Bits

• Los Primeros 54 Bytes contienen los metadatos de nuestra imagen y su estructura es la siguiente:

• 2 bytes - contienen siempre 'BM', sirve para poder identificar que realmente es un bmp • 4 bytes - tamaño del archivo (en bytes) • 4 bytes - Reservados, contienen ceros • 4 bytes - offset, distancia en bytes entre la cabecera y los píxeles (no lo usaremos) • 4 bytes - Tamaño de Metadatos (tamaño de esta estructura = 40) • 4 bytes - Ancho (numero de píxeles horizontales) • 4 bytes - Alto (numero de pixeles verticales) • 2 bytes - Numero de planos de color (No lo usaremos, valdrá 1) • 2 bytes - Profundidad de color (debe ser 24 para nuestro caso) • 4 bytes - Tipo de compresión (valdrá 0, ya que el bmp es descomprimido) • 4 bytes - Tamaño de la estructura Imagen (paleta “si hubiese pero en nuestro caso no” y

píxeles) • 4 bytes - Píxeles por metro horizontal (No lo usaremos) • 4 bytes - Píxeles por metro vertical (No lo usaremos) • 4 bytes - Cantidad de colores usados (No lo usaremos) • 4 bytes - Cantidad de colores importantes (Tampoco usaremos) 5

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

C

abec

era

de

un

BM

P d

e 2

4 B

its

Page 6: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Cabecera de un BMP de 24 bits en C

struct cabeceraBMP

{

char bm[2]; //(2 Bytes) BM (Tipo de archivo)

int tamano; //(4 Bytes) Tamaño del archivo en bytes

int reservado; //(4 Bytes) Reservado

int offset; //(4 Bytes) offset, distancia en bytes entre la img y los píxeles

int tamanoMetadatos;//(4 Bytes) Tamaño de Metadatos (tamaño de esta estructura =

40)

int alto; //(4 Bytes) Ancho (numero de píxeles horizontales)

int ancho; //(4 Bytes) Alto (numero de pixeles verticales)

short int numeroPlanos; //(2 Bytes) Numero de planos de color

short int profundidadColor;//(2 Bytes) Profundidad de color (debe ser 24 para

nuestro caso)

int tipoCompresion;//(4 Bytes) Tipo de compresión (Vale 0, ya que el bmp es

descomprimido)

int tamanoEstructura;//(4 Bytes) Tamaño de la estructura Imagen (Paleta)

int pxmh; //(4 Bytes) Píxeles por metro horizontal

int pxmv; //(4 Bytes) Píxeles por metro vertical

int coloresUsados;//(4 Bytes) Cantidad de colores usados

int coloresImportantes; //(4 Bytes) Cantidad de colores importantes

}; 6 6

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

C

abec

era

de

un

BM

P d

e 2

4 B

its

en C

Page 7: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Declarando y usando un arreglo dinámico de 2 dimensiones en C • Arreglo dinámico de 2 dimensiones #define ancho 20

#define alto 30

.

int **arreglo2D;

int i,valor=10;

.

//Reservar memoria para el arreglo de enteros de tamaño ancho

arreglo=malloc(ancho*sizeof(int*));

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

arreglo[i]=malloc(ancho*sizeof(int));

//Escribiendo en un elemento

Arreglo[8][5]=valor;

.

//Leyendo de un elemento

valor=Arreglo[ancho-1][alto-1];

7 7

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 8: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Abrir archivos en C FILE *fopen(const char *nombre_fichero, const char *modo);

• Abre el fichero de nombre “nombre_fichero”, lo asocia con un flujo de datos y devuelve un puntero al mismo. Si falla la llamada, devuelve un puntero nulo. Algunos de los caracteres iniciales de "modo'' son:

• “r”, para abrir un fichero de texto existente para su lectura

• “w”, para crear un fichero de texto o abrir y truncar uno existente, para su escritura

• “a”, para crear un fichero de texto o abrir uno existente, para su escritura.

• “b”, para trabajar en modo binario sobre el archivo.

• El indicador de posición se coloca al final del fichero antes de cada escritura “r+”, para abrir un fichero de texto existente para su lectura y escritura

8

Ejercicios de programación en C (Edgardo A. Franco)

8

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 9: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Cerrar archivos en C int fclose(FILE *archivo);

• Cierra el fichero asociado con el puntero “archivo”. Devuelve 0 en caso de éxito y EOF (end of file) en caso contrario.

Ejercicios de programación en C (Edgardo A. Franco)

9

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 10: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Posicionamiento en el archivo int fseek( FILE *flujo, long desplazamiento, int origen);

• La función fseek() mueve el puntero de posición del fichero correspondiente al flujo de datos apuntado por “flujo”. La nueva posición, medida en bytes, se obtiene añadiendo el número indicado por desplazamiento a la posición especificada por origen. La variable origen puede tomar tres valores: • SEEK_SET: El puntero de posición apuntará al inicio del fichero más el

desplazamiento

• SEEK_CUR: El puntero de posición apuntará a la posición actual del puntero de posición del fichero más el desplazamiento.

• SEEK_END: El puntero de posición apuntará al fin del fichero más el desplazamiento (deberá ser menor o igual que cero).

10

Ejercicios de programación en C (Edgardo A. Franco)

10

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 11: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Lectura por flujo en C size_t fread(const void *buffer, size_t n, size_t c, FILE *flujo);

• fread() permite leer c elementos de longitud n bytes del fichero apuntado por “flujo” y los almacena en el buffer especificado. //Leer la cabecera de la imagen y almacenarla en la estructura img (Paso

por valor)

fseek( archivo,0, SEEK_SET);

fread(&img.bm,sizeof(char),2, archivo);

fread(&img.tamano,sizeof(int),1, archivo);

fread(&img.reservado,sizeof(int),1, archivo);

fread(&img.offset,sizeof(int),1, archivo);

fread(&img.tamanoMetadatos,sizeof(int),1, archivo);

fread(&img.alto,sizeof(int),1, archivo);

fread(&img.ancho,sizeof(int),1, archivo);

fread(&img.numeroPlanos,sizeof(short int),1, archivo);

.

.

.

11

Ejercicios de programación en C (Edgardo A. Franco)

11

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 12: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Escritura por flujo en C size_t fwrite(const void *buffer, size_t n, size_t c, FILE

*flujo);

• fwrite() permite escribir c elementos de longitud n bytes almacenados en el buffer apuntado por “flujo”.

//Escribir la cabecera de la imagen en el archivo a partir de la

estructura imagen (paso por referencia)

fseek( archivo,0, SEEK_SET);

fwrite(&imagen->bm,sizeof(char),2, archivo);

fwrite(&imagen->tamano,sizeof(int),1, archivo);

fwrite(&imagen->reservado,sizeof(int),1, archivo);

fwrite(&imagen->offset,sizeof(int),1, archivo);

fwrite(&imagen->tamanoMetadatos,sizeof(int),1, archivo);

fwrite(&imagen->alto,sizeof(int),1, archivo);

fwrite(&imagen->ancho,sizeof(int),1, archivo);

12

Ejercicios de programación en C (Edgardo A. Franco)

12

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

eco

rdat

ori

o d

e C

Page 13: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Lectura de los pixeles de un BMP de 24 bits • Una vez que se conoce el tamaño (ancho y alto)

de la imagen es posible apartar memoria para la matriz de pixeles a leer.

• El el formato BMP los pixeles se almacenan un offset bytes despues de la cabecera, a partir del pixel de la esquina superior izquierda de la imagen, moviéndose columna a columna de izquierda a derecha y fila a fila de arriba hacia abajo.

• En un BMP de 24 bits cada pixel almacena 3 bytes BGR (Plano Azul, Verde y Rojo). 13

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

Le

ctu

ra d

e lo

s p

ixel

es

de

un

BM

P d

e 2

4 b

its

Page 14: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Lectura de los pixeles de un BMP de 24 bits

14

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

Le

ctu

ra d

e lo

s p

ixel

es

de

un

BM

P d

e 2

4 b

its

Imagen BMP de 24 bits

PlanoR Se representa con tres

planos

PlanoB

PlanoG

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

{

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

{

fread(&B,sizeof(char),1, archivo); //Byte Blue del pixel

fread(&G,sizeof(char),1, archivo); //Byte Green del pixel

fread(&R,sizeof(char),1, archivo); //Byte Red del pixel

}

}

Page 15: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Procesamiento de imágenes

• El procesamiento de imágenes emplea algoritmos y principios que permiten mejorar la calidad de una imagen, modificarla o detectar e identificar regiones de interés en ella.

• El procesamiento de imágenes da pie a aplicaciones de visión artificial.

• Las aplicaciones que tiene esta área de la computación abarca aplicaciones medicas, de robótica móvil, de seguridad y video vigilancia, etc. 15

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

P

roce

sam

ien

to d

e im

ágen

es

Page 16: 06 Introducción al procesamiento de imágenes BMP con ANSI C

Procesamiento de imágenes

• Muchos de los algoritmos y técnicas del procesamiento de imágenes pueden operar de manera eficiente con imágenes en escalas de grises. Por lo que en muchos sistemas de visión uno de los primeros pasos es convertir la imagen de entrada a escala de grises.

16

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

P

roce

sam

ien

to d

e im

ágen

es

Page 17: 06 Introducción al procesamiento de imágenes BMP con ANSI C

RGB a escala de grises

• La descripción RGB (Red, Green, Blue; "rojo, verde, azul") de un color hace referencia a la composición del color en términos de la intensidad de los colores primarios con que se forma: el rojo, el verde y el azul.

• Es un modelo de color basado en la síntesis aditiva, con el que es posible representar un color mediante la mezcla por adición de los tres colores luz primarios. El modelo de color RGB no define por sí mismo lo que significa exactamente rojo, verde o azul, por lo que los mismos valores RGB pueden mostrar colores notablemente diferentes en diferentes dispositivos que usen este modelo de color. Aunque utilicen un mismo modelo de color, sus espacios de color pueden variar considerablemente.

17

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

GB

a e

scal

a d

e gr

ises

Page 18: 06 Introducción al procesamiento de imágenes BMP con ANSI C

RGB a escala de grises

• Aunque el intervalo de valores podría ser cualquiera, es frecuente que cada color primario se codifique con un byte (8 bits). Así, de manera usual, la intensidad de cada una de las componentes se mide según una escala que va del 0 al 255.

• Por lo tanto, el rojo se obtiene con (255,0,0), el verde con (0,255,0) y el azul con (0,0,255), obteniendo, en cada caso un color resultante monocromático.

• La ausencia de color (negro) se obtiene cuando las tres componentes son 0.

• La combinación de dos colores a nivel 255 con un tercero en nivel 0 da lugar a tres colores intermedios. De esta forma el amarillo es (255,255,0), el cyan (0,255,255) y el magenta (255,0,255).

• El color blanco se forma con los tres colores primarios a su máximo nivel (255,255,255) 18

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

GB

a e

scal

a d

e gr

ises

Page 19: 06 Introducción al procesamiento de imágenes BMP con ANSI C

RGB a escala de grises

• El conjunto de todos los colores se puede representar en forma de cubo.

• Cada color es un punto de la superficie o del interior de éste. La escala de grises estaría situada en la diagonal que une al color blanco con el negro.

19

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

GB

a e

scal

a d

e gr

ises

• La escala de grises es una escala en la que el valor de cada píxel posee un valor equivalente a una graduación de gris.

• Las imágenes de este tipo están compuestas de sombras de grises, que van desde el negro más profundo variando gradualmente en intensidad de grises hasta llegar al blanco.

Page 20: 06 Introducción al procesamiento de imágenes BMP con ANSI C

RGB a escala de grises

• Las imágenes en escala de grises, emplean 8 bits para representar cada píxel lo que sólo permite una escala con 256 intensidades (o escalas de gris).

pixelGris=R*0.3+G*0.59+ B*0.11

20

Sist

emas

op

erat

ivo

s II

0

6 In

tro

du

cció

n a

l pro

cesa

mie

nto

de

imág

enes

BM

P c

on

AN

SI C

R

GB

a e

scal

a d

e gr

ises

//Conversión a escala de grises en C

imagen->pixel[i][j]=(unsigned char)((R*0.3)+(G*0.59)+ (B*0.11));