Você está na página 1de 11

ESCUELA POLITCNICA SUPERIOR

INFORMTICA CURSO 2014-2015

PRCTICA 8. Problema Complejo I: Edicin de Imgenes


HASTA AHORA...
En prcticas anteriores se ha aprendido:
La estructura principal de un programa en C: la funcin main y las libreras.
Variables y Constantes: con sus respectivos tipos, usos y funcionamiento.
Programacin estructurada en funciones.
Funciones printf/scanf: muestra y obtencin de informacin por pantalla/teclado.
Condicionales if/else: ejecucin de un programa en rbol.
Programacin iterativa utilizando las instrucciones while y for.
Almacenamiento de informacin a gran escala: arrays.
Caso especial de vectores: cadenas de caracteres.
Estructuras de datos.

OBJETIVOS
El principal objetivo de esta prctica es concentrar todos los conceptos aprendidos en prcticas
anteriores y montar un sistema complejo que trabaje con imgenes. Principalmente se trabajar con
una imagen como si de una estructura se tratara, formada internamente por una serie de campos
entre los que destaca la informacin concerniente a cada pxel, almacenada en una matriz.
Con ello se pretende introducir al alumno a un programa de mayor complejidad y que conlleva
resultados tangibles, permitiendo al alumno acercarse a los programas con interfaz grfica.

PRERREQUISITOS
Para el aprendizaje efectivo del alumno en esta sesin prctica, el alumno debe repasar y
comprender en profundidad los conceptos explicados en prcticas anteriores y que se corresponden
con FUNCIONES, VECTORES bidimensionales y ESTRUCTURAS.
Adems, sera altamente recomendable que el alumno leyera el enunciado de la presente prctica, se
descargara el programa que incorpora y tratara de ejecutarlo.
Comenzar con la implementacin de alguno de los ejercicios que se proponen sera una muy
recomendable prctica.
Se aconseja el uso del material de apoyo de la asignatura. As, para esta prctica el alumno puede
consultar la siguiente bibliografa:
Rodrguez Jdar, M.A. y otros, Fundamentos de Informtica para Ingeniera Industrial:
o Captulo 4, Fundamentos de Programacin:
Apartado 4.5, Programacin Descendente.
Apartado 4.6, Vectores y Matrices: nicamente subapartados 4.6.1 y 4.6.2.
Apartado 4.8.1, Estructuras.

INTRODUCCIN
Para realizar esta prctica no se trabajar comenzando con un archivo vaco (como se vena
haciendo hasta ahora), sino que inicialmente se aporta un proyecto realizado ntegramente en CFree 4.0, y en el que vienen desarrolladas una serie de funcionalidades complejas que sern de gran
utilidad al alumno. Entre las funcionalidades del programa aportado se pueden encontrar: carga de
imgenes, guardado de imgenes en un fichero externo, visualizacin de imgenes en pantalla,
entorno grfico con botones, etc. Ms adelante se describe cada una de ellas en mayor profundidad.

IMPORTANTE: antes de iniciar el programa, descomprmalo dentro de una carpeta vaca y haga
doble clic en el fichero denotado como imag.cfp. Una vez hecho esto, arrancar
automticamente el entorno C-Free 4.0 con el programa ya cargado. NO se cargar correctamente
si hacemos clic en un archivo .c.
Adems, si al ejecutar imag.cfp no aparece en C-Free el rbol de directorios y ficheros del
proyecto, es porque no est visible. Para hacerlo visible ir al men View -> File Tree Window.
El fichero que el alumno va a modificar en esta prctica es nicamente el llamado main.c.
No es necesario entender el programa que se aporta para poder realizar la prctica.
Los nicos apuntes a tener en cuenta de dicho programa son los siguientes:
1. Se trabaja con imgenes como mximo, de 600x600 pxeles, (por motivos de facilidad y
para evitar explicar reserva dinmica de memoria). Cada pxel est en formato RGB, es
decir con colores de 24 bits (8 bits para cada componente del color), y en formato BMP.
Las imgenes que no posean esa codificacin de colores no se visualizarn correctamente.
Las imgenes de mayor tamao que posean la codificacin de colores indicados, se cargarn
y mostrarn truncadas. Junto con el programa, se aportan varias imgenes con dichas
especificaciones para que el alumno trabaje con ellas (las imgenes se encuentran en la
carpeta Images, dentro de la carpeta en la que se ha instalado el programa).
2. Inicialmente el programa se cargar sin imagen alguna (se visualizar un fondo de color
blanco en la posicin en la que se mostrarn posteriormente las imgenes). Antes de
ejecutar cualquier tratamiento que hayamos programado, hay que cargar una imagen.
Para ello, hay que ejecutar la opcin Archivo
Abrir Imagen Primaria del men. Podr
navegar por el sistema de ficheros de su ordenador y cargar la imagen que estime oportuna.
[De igual forma, y adelantando instrucciones para ejercicios ms avanzados, se podr elegir
cargar una imagen secundaria (que posee las mismas restricciones que la primaria)].
2

3. El programa no posee funcin principal (main) propiamente dicha, sino que posee una
funcin llamada WinMain que, a efectos prcticos, funcionar para nosotros de forma
similar. Se insiste en que no es necesario comprenderlo, pero esta diferencia se justifica por
el cambio del tipo de proyecto que se est ejecutando: mientras que, anteriormente, se haca
uso de proyectos de consola para probar los algoritmos realizados por el alumno; en este
caso, se est ejecutando un proyecto con una interfaz grfica, que posee diferentes
requisitos.
4. Las operaciones que realiza el programa para cargar una imagen pueden resumirse de la
siguiente forma: se accede al fichero de la imagen, se recorre y almacenan los tres valores
numricos de cada uno de los pxeles (R, G y B) en su posicin correspondiente dentro de
una matriz y, por ltimo, se guardan otros atributos de la imagen que resultarn de utilidad
para el programa y el usuario. Tras cargar una imagen, sus datos quedarn almacenados
en una estructura de tipo imagen. Una imagen est definida en este sistema por:
struct Pixel
{
unsigned char ROJO, VERDE, AZUL;
};
struct Imagen
{
struct Pixel pixeles [600][600];
unsigned int ALTO, ANCHO;
/*Otros campos que no nos interesan*/
};
Representando grficamente la estructura (tal y como se explica en las diapositivas de
estructuras en C), quedara un rbol con el siguiente formato:

5. De las definiciones tericas de estructuras indicadas anteriormente, el sistema posee las dos
variables globales siguientes:
struct Imagen imagen, imagenBackUp;
a. imagen: en ella se almacena la imagen seleccionada mediante la opcin Archivo
Abrir Imagen Primaria. Dicha imagen se corresponde con la visualizada en el
programa. Se podr acceder a ella y modificar el contenido de sus pxeles, pudindose
apreciar las modificaciones en tiempo real.
b. imagenBackUp: proporciona un almacn temporal sobre el que poder realizar cambios
sin que afecten directamente a la variable principal imagen. La forma comn de hacer
uso de esta variable es mediante cdigo. Inicialmente, esta variable se encuentra en
blanco.
Ambas variables: imagen, imagenBackUp estn reservadas en memoria, y son de tipo struct
Imagen . Por tanto representadas grficamente quedaran as:

Estas representaciones grficas facilitarn la navegacin de la estructura.


Ejemplo 1:
Si se quiere imprimir las dimensiones de la variable imagen se pondra la siguiente setencia:
printf(\n Dimension: %u filas, %u columnas, imagen.ALTO, imagen.ANCHO);

Ejemplo 2:
Si se quiere cambiar a negro el pxel de la posicin 30, 50 de la variable imagen, se pondra
la siguiente setencia:
imagen.pixeles[30][50].ROJO=0;
imagen.pixeles[30][50].VERDE=0;
imagen.pixeles[30][50].AZUL=0;

6. Estas dos variables indicadas anteriormente son variables GLOBALES y, por tanto, pueden
ser utilizadas y modificadas por cualquier funcin sin necesidad de pasarlas por parmetros.
7. El programa se encarga, automtica y peridicamente, de pintar los valores que posee
imagen. De esta forma, cada modificacin sobre dicha variable ocasionar una
modificacin en la visualizacin por pantalla. Tenga en cuenta que las modificaciones
realizadas sobre imagenBackUp no se apreciarn por pantalla.
8. Cada variable de tipo struct Imagen posee dos campos internos (ALTO y ANCHO) que
contienen el valor numrico del nmero de filas y de columnas de dicha imagen,
respectivamente. Tenga en cuenta de que cada uno de estos valores puede oscilar entre 0 y
599, y que no tiene por qu ser estrictamente el valor mximo tras cargar una imagen.
9. Durante las operaciones de tratamiento sobre una imagen cualquiera, el alumno se encargar
de programar la funcionalidad correspondiente. Para ello se han habilitado 6 botones en la
interfaz grfica de nuestro programa. Cada vez que se pulsa uno de estos botones, se ejecuta
el cdigo contenido en una de las siguientes funciones (situadas en el fichero main.c):

Esta funciones BOTON() estn dentro del fichero main.c, y servirn para llamar al filtro
correspondiente al botn que queramos asociarle.
10. Se recomienda:
-

Hacer
una
funcin
por
cada
filtro
y
darle
un
nombre.
Ejemplo: implementamos una funcin para pasar una imagen a blanco y negro puros
(sin escala de grises), y le llamamos BinarizarImagen( ).

Llamar a la funcin del filtro desde la funcin correspondiente al botn que


queremos que active la ejecucin de dicho filtro.
Ejemplo: queremos que se ejecute el fitro cuando pulsemos el botn 1, por tanto la
llamada a BinarizarImagen( ) se hara as:
void BOTON1()
{
BinarizarImagen( );
}

Como slo hay seis botones disponibles, y en esta prctica hay ms de seis filtros a
implementar, tendremos que ir cambiando la llamada desde el botn
correspondiente, o bien comentar la lnea de cdigo de la funcin.

Ejemplo: Si queremos que el botn 1 se use tambin para llamar al filtro


EscalaGrises( ), entonces se hara as:
void BOTON1()
{
// BinarizarImagen( );
EscalaGrises();
}

De esta forma, en la siguiente ejecucin no se llamar a BinarizarImagen() por


haberle aadido un comentario // al principio de la lnea, y s se ejecutar
EscalaGrises(). Es decir, cada botn debe llamar a una nica funcin en cada
ejecucin, pero se pueden comentar las llamadas a los filtros previamente usados, por
si en algn momento queremos volver a ejecutarlos (para lo cual bastar quitar el //).
La otra opcin es borrar de la funcin BOTON1() la llamada a BinarizarImagen() y
dejar slo la de EscalaGrises()
5

11. TENGA PRESENTE que en los ejercicios avanzados se har uso de algunas de las
funcionalidades que se piden en los primeros ejercicios.
12. A la hora de depurar los fallos de un programa, la herramienta Debug del entorno no
funciona correctamente con proyectos que posean ventanas grficas, como es el caso. Para
poder depurar a un nivel bsico, se ha incluido una herramienta denominada
Consola para poder mostrar mensajes que estimemos oportuno. Para ello, dentro de la
funcionalidad Herramientas
Consola, aparecer una nueva ventana denominada
Debug y con un aspecto similar al de una consola de comandos, como la utilizada para
visualizar los resultados de los ejercicios en prcticas anteriores. Para ocultar dicha ventana,
active nuevamente la misma opcin.

13. Para mostrar mensajes en la consola indicada anteriormente, se puede hacer uso de la
funcin printf. En el caso de que la ventana de consola no est abierta, estos mensajes no
se muestran y se pierden; es por ello que se aporta una funcin denominada
pintaEnConsola, que posee una nomenclatura idntica a la del printf y cuya funcionalidad
es: en caso de que se est mostrando la consola, pinta el mensaje en consola y, en caso
contrario, se almacena el mensaje en una cadena de caracteres para que, al activar la
consola, aparezca todo el conjunto de mensajes que se han ido almacenando. As pues,
se recomienda hacer uso de pintaEnConsola en lugar de usar printf.
14. El programa permite Restaurar la imagen primaria, mediante la carga de la imagen
desde el fichero origen (al cargar la imagen, se guarda, en un campo interno a la estructura,
la ruta desde donde se carg). Esta opcin se encuentra dentro del men Herramientas,
como se puede ver en la imagen anterior.
15. Si nos parece oportuno guardar el estado de una imagen modificada, se aporta la utilidad de
Guardar, dentro del men Archivo. Esta opcin permite crear una imagen BMP nueva y
almacenar en un fichero el contenido de la imagen que se est visualizando por pantalla.

EJERCICIOS DE LA PRIMERA PARTE


Ejercicio 1: Modificar la imagen cargada para que solo se muestre la componente roja de color de
dicha imagen, poniendo a 0 los valores de las otras componentes. Haga lo mismo para las otras
componentes de color de la imagen. Tenga presente que la componente roja se corresponde con el
campo ROJO de cada pixel de la imagen; as pues deber recorrer la imagen al completo y modificar
los valores de las otras dos componentes para TODOS los pxeles de la imagen.
Ejercicio 2: Realizar un cambio de imagen de color RGB a imagen monocromtica (en escala de
grises). Para ello modifique TODAS las componentes del color por lo siguiente:
ComponenteRoja*0.3 + ComponenteVerde*0.59+ComponenteAzul*0.11
Suponiendo que estas componentes son de un pxel cualquiera de la imagen. As pues, la sentencia
ser algo similar a lo siguiente, pero traducindolo al lenguaje C:
{k ROJO, VERDE, AZUL]} {i 0, imagen.ALTO)} {j 0, imagen.ANCHO)}, imageni,j,k =
imagen i,j,ROJO*0.3+ imagen i,j,VERDE*0.59+ imagen i,j,AZUL*0.11

NOTA: Realice ahora una funcin aparte que haga esto mismo.
Ejercicio 3: Una vez que tenemos la imagen en escala de grises (ejercicio anterior), es fcil obtener
el negativo de dicha imagen. Para ello, nicamente habra que hallar el valor opuesto a cada
tonalidad de gris. Esto es que, para el valor 255 su opuesto es el 0, para el 250 su opuesto es el 5,...
Ejercicio 4: Una vez realizado el paso a escala de grises, binarizaremos la imagen. Esto es, con el
valor obtenido con la transformacin a imagen monocromtica, transformaremos la imagen a
blanco y negro. Para ello solo puede haber dos posibles valores: totalmente negro (tres componentes
a 0) o totalmente blanco (tres componentes a 255). Lo nico necesario aparte de lo que tenemos es
un valor umbral utilizado para la binarizacin. Para ello, como una primera aproximacin, lo
asignaremos manualmente. Supondremos un umbral de 200, a partir del cual todos los pxeles con
valor en escala de grises superior a l se pondrn a blanco absoluto; el resto de pxeles se pondrn a
negro absoluto. NOTA: si lo ha hecho directamente dentro de la funcin del botn, realice ahora
una funcin llamada binarizar, que reciba por parmetro el valor umbral y que realice lo descrito.
Ejercicio 5: Reduciremos la imagen situndola en la esquina superior izquierda. Para ello solo
cogeremos los pxeles con posiciones pares en filas y columnas y las situaremos en el primer
cuadrante de la imagen.
Ejercicio 6: Cuadruplicaremos la imagen en la ventana. Para ello, tras utilizar el resultado
conseguido en el ejercicio 5 (que reduce la imagen situndola en el primer cuadrante), copiaremos
el primer cuadrante de la imagen a los otros tres cuadrantes restantes.
Ejercicio 7: Realice un zoom de la imagen, correspondiente al primer cuadrante de la misma. Para
ello, recorremos el recuadro correspondiente al primer cuadrante, con un tamao correspondiente a
la mitad de filas y de columnas. Conforme realizamos el recorrido, ampliaremos la imagen de forma
inversa a como hicimos en la cuadruplicacin de la imagen: cada pxel se pintar en la posicin que
le corresponda y en las 3 posiciones adyacentes a l.
Ejercicio 8: Ahora realizaremos el mismo zoom sobre la imagen, pero en el centro de la misma en
vez del primer cuadrante. Para ello obtendremos, en primer lugar el recuadro central de la imagen,
con un tamao correspondiente a la mitad de filas y de columnas (situado en el centro de la
imagen). Una vez tenemos dicha seccin de la imagen, la ampliaremos de forma inversa a como
hicimos en la cuadruplicacin de la imagen: cada pxel se pintar en la posicin que le corresponda
y en las 3 posiciones adyacentes a l.
Ejercicio 9: Haremos un giro de 90 en el sentido de las agujas del reloj. Debido a que
necesitaremos los valores sin modificar, leeremos desde imagenBackUp y modificaremos en
imagen. La nica dificultad es obtener la relacin matemtica entre filas y columnas de la imagen
7

original con las de la imagen que queremos obtener (imagen girada). NOTA: recuerde que se
propuso un ejercicio idntico para obtener la relacin matemtica en la prctica de Matrices.
Ejercicio 10: Implementar una rotacin cualquiera sobre la imagen. En este caso, la rotacin no
ser mltiplo de 90 grados, como se ha visto en el ejercicio 6. De esa forma, implementar un giro
sea cual sea el ngulo (probar con varios para comprobar su funcionamiento). Haciendo uso de una
transformacin matemtica de rotacin, se puede saber cules seran sus nuevas coordenadas. En
nuestro caso, bastar con aplicar a las coordenadas actuales (x, y), la siguiente transformacin:

As pues, su funcin deber aplicar dicha transformacin a todos y cada uno de los pxeles de la
imagen para completar el giro. Puede hacer uso de las funciones double sin(double) y double
cos(double) definidas dentro de la librera math.h.
Ejercicio 11: Haremos lo mismo que en el ejercicio 4, pero no colocaremos el umbral de
binarizacin fijo a nuestro antojo, sino que lo calcularemos segn la concentracin de valores de
pxeles. Para ello calcularemos previamente el HISTOGRAMA de la imagen (busque informacin
de qu es un histograma si su profesor no lo ha explicado). Colocaremos como umbral el valor
mximo del histograma. Sin embargo, debido a la cantidad de blanco que hay en algunas imgenes,
este valor no es muy correcto. Por ello, realice el clculo del umbral de binarizacin sin tener en
cuenta ni el blanco (todas las componentes a 255) ni el negro (todas las componentes a 0). Puede
jugar con los umbrales y con los valores del histograma y ver los resultados.
Ejercicio 12: Sabiendo que pintar algo nuevo en la imagen solo conlleva modificar los pxeles
adecuados, intente dibujar en forma de diagrama de barras el histograma resultante en el apartado
anterior. Colquelo en una esquina de la imagen para que se vea tanto ella como el histograma.

EJERCICIOS DE LA SEGUNDA PARTE


En este caso, para la realizacin de algunos ejercicios, ser necesaria realizar la carga de una
segunda imagen (o imagen fantasma), proceso que se obviaba en los ejercicios anteriores. Para ello,
tras iniciar el programa, se puede acceder a la utilidad Archivo
Abrir imagen secundaria. Junto
al proyecto se adjunta un conjunto de imgenes secundarias que cumplen con el formato necesitado.
A los conocimientos y aclaraciones aportados en la prctica anterior, hay que aadir los siguientes:
1. La imagen secundaria o imagen fantasma se almacena en una variable global denominada
fantasma: struct Imagen fantasma;
Esta variable posee el mismo contenido que las variables utilizadas hasta ahora (imagen e
imagenBackUp.
2. De igual forma tendr su tamao dentro de dos campos internos denominados ALTO y
ANCHO.
3. El acceso a esta imagen se realiza de igual forma que a la imagen principal, pero haciendo
uso de la variable a tal efecto.
4. Esta imagen secundaria no se copia en ninguna otra imagen por medida de seguridad, tal
como pasaba con la imagen principal (que se copiaba a imagenBackUp); as que tenga en
cuenta que una modificacin en sta no se puede deshacer, excepto si la volvemos a cargar.
De igual forma, los ejercicios propuestos no pedirn modificar dicha imagen, sino hacer uso
de sus valores (leerlos nicamente).
Ejercicio 1: Supongamos que tenemos cargadas dos imgenes diferentes (una almacenada en la
variable imagen y otra en fantasma cargue dos imgenes de 600x600) que no tienen ninguna
similitud. Queremos hacer un collage entre ambas imgenes para dar lugar a un resultado nico y
con informacin de ambas. As pues, implemente una funcin que combine el contenido de ambas
imgenes sobre una tercera imagen (realice los cambios sobre imagenBackUp para,
posteriormente, copiarla a imagen y poder apreciar el resultado), de tal forma que el resultado
alterne las columnas de ambas imgenes (columna 0 de imagen, columna 1 de fantasma,
columna 2 de imagen, columna 3 de fantasma, etc.).
Recuerde que al estar trabajando con variables de tipo estructura, se puede hacer una asignacin
para copiar valores entre variables del mismo tipo. Es decir, para copiar imagenBackUp en
imagen, bastar con hacer la asignacin imagen=imagenBackUp;
Ejercicio 2: Cargue en el programa una imagen principal cualquiera y una imagen secundaria a su
eleccin. Superponga la imagen secundaria sobre la primaria en la esquina inferior izquierda (0, 0).
NOTA: superponer la imagen secundaria sobre la primaria consistir en cambiar los pxeles de la
imagen principal por los de la imagen secundaria, en aquella rea en la que se encuentre sta.
Ejercicio 3: Realice exactamente lo mismo que el ejercicio 2 pero, en este caso, superponga la
imagen secundaria de forma centrada en la imagen primaria.
Ejercicio 4: teniendo en cuenta que las imgenes secundarias aportadas poseen un fondo de color
blanco (R=255, G=255, B=255), realice los dos apartados anteriores de superposicin pero
mostrando aquellos pxeles de la imagen secundaria que sean distintos de blanco, para que no se vea
su fondo.
Ejercicio 5: Intentaremos ahora mimetizar la imagen secundaria con el fondo (imagen principal).
Para ello, en vez de pintar cada pixel de la imagen secundaria con su color real, pintaremos un pxel
cuyo color sea la media aritmtica entre las componentes del color del pxel de la imagen
secundaria y las componentes de color del pxel de la imagen primaria dnde vaya a ubicarse dicho
pxel. De esta forma, tendremos la impresin de mostrar la imagen secundaria como un fantasma
dentro de la imagen primaria.
9

Ejercicio 6: Existe una funcin predefinida en el sistema que es Sleep(int milisegundos), esta
funcin permite dejar nuestro programa dormido o parado el tiempo que le especifiquemos. As
pues, realice un programa que haga uso de lo descrito anteriormente con la integracin de la imagen
secundaria dentro de la primaria pareciendo un fantasma. Ahora, adems, haremos que la imagen
secundaria haga un recorrido (horizontal, vertical o diagonal como guste) por la imagen primaria.
Dicho recorrido se realizar pxel a pxel dentro de la imagen principal y, por cada iteracin, se har
uso de la funcin Sleep para que nuestro programa se quede quieto un milisegundo. Adems, se ha
de forzar el pintado de la imagen, puesto que ste se realiza automticamente cuando termina de
ejecutarse el cdigo del botn; pero, en nuestro caso, queremos hacerlo antes: para ello se har una
llamada a la funcin ya predefinida pintaImagen(&imagen), antes de hacer el Sleep. Si no
usamos dicha funcin, no se podr apreciar el movimiento. NOTA: Para realizar esta tarea, en el
siguiente pseudocdigo haremos uso de tres bucles anidados. Como siempre, hay muchas posibles
formas de resolverlo, as que puede que la solucin pensada por el alumno haga uso de un mayor
nmero de bucles. Por ejemplo, supondiendo que las dimensiones de imagen son (ALTO,
ANCHO) y que las de fantasma son (ALTOfan, ANCHOfan), se podra utilizar el siguiente
algoritmo:
Desde i=0, j=0 hasta i=ALTO-ALTOfan, j=ANCHO-ANCHOfan
Desde x=0 hasta x=ALTOfan-1
Desde y=0 hasta y=ANCHOfan-1
Si fantasma(x,y) no es blanco
Asigne a cada componente de imagen(i+x,j+x) la media de imagen(i+x,j+x) y fantasma(x,y)
Fin Si
Fin Desde
Fin Desde
Duerme 1 milisegundo
Restaura valores iniciales de imagen
Fin Desde

Ejercicio 7: Haciendo uso del cdigo del ejercicio 12 de la primera parte, vamos a crear un
programa que rote progresivamente la imagen, de grado en grado, en el sentido de las agujas del
reloj. Haga uso de las funciones Sleep y pintaImagen para que se aprecien las modificaciones a
medida que se va incrementando el ngulo.
Ejercicio 8: Realizaremos un filtro de suavizado de la imagen principal. Esto consiste en un
algoritmo que asigna a cada pxel el valor medio de entre l y todos sus vecinos. Esto se realiza para
las tres componentes de color. Se supone como vecino de un pxel a todo aquel que tiene contacto
con l (incluidos los diagonales). Para facilitar el trabajo, no aplique el filtro al marco exterior de la
imagen (compuesto por primera y ltima fila, as como primera y ltima columna), ya que son
casos especiales por no tener 8 vecinos como el resto.

10

NOTA: todos los filtros aplicados sobre imgenes que se piden a continuacin se realizan sobre
la imagen en escala de grises.
ACLARACIN: la aplicacin sobre una imagen de lo que se denota como matriz de convolucin
consiste en, para cada pixel (i, j), aplicar una media ponderada de sus valores y los de sus vecinos.
Nosotros usaremos matrices de tamao 3x3, pero podran ser mayores. As pues, de forma general
tenemos:

Esto es, centrando el pxel actual en el centro de la matriz de convolucin.


Solo queda tener en cuenta que el valor obtenido puede llegar a ser superior al mximo o inferior
al mnimo para dicho pxel, as pues hay que adaptarlo al rango de valores que usamos nosotros
(de 0 a 255). Esto se realiza de la siguiente forma:

Donde valorAntiguo es el obtenido tras aplicar la operacin detallada anteriormente; ValorMin es


el valor mnimo que puede obtenerse en la operacin anterior; ValorMax es el valor mximo que
puede obtenerse en la operacin anterior; y rangoNuevo en nuestro caso es 255.
Ejercicio 9: Aplicar una mediana ponderada a los pxeles. La matriz a utilizar es:
1 2 1
2 4 2
1 2 1

Ejercicio 10: Aplicaremos un filtro direccional, como es el filtro norte utilizando la matriz:
1 1 1
1 -2 1
-1 -1 -1

Ejercicio 11: Aplicaremos ahora filtros de Sobel para deteccin de contornos.


Filtro C:

-1 0 1
-2 0 2
-1 0 1

Filtro F:

11

-1 -2 -1
0 0 0
1 2 1

Você também pode gostar