clasificación de imágenes

Transcription

clasificación de imágenes
CLASIFICACIÓN DE IMÁGENES
Cesar Juárez Megías
I.T.T. Imagen y sonido
Carlos III de Madrid
[email protected]
Jessica Serrano Cita
I.T.T. Imagen y sonido
Carlos III de Madrid
[email protected]
OBJETIVO.
2.CLASIFICACION
IMÁGENES.
El objetivo principal de nuestro programa se basaría
en la clasificación de imágenes de varias categorías
diferentes.
Para ello nos basaremos en la forma, color,
luminosidad, etc de las imágenes, usando así algunos
de los algoritmos vistos de teoría a través de un
programa implementado en MATLAB desarrollado
por nosotros.
HERRAMIENTAS
UTILIZADAS
PARA EL DESARROLLO DE LA
APLICACIÓN.
DE
A continuación detallaremos los pasos a seguir para
realizar de forma completa una clasificación de
imágenes.
Adquisición y
procesado
Evaluación
Extracción
características
Bloque de
entrenamiento
Etapa de
clasificación
2.1.- Adquisición y procesado.
Para llevar a cabo el desarrollo de la aplicación
utilizaremos el programa MATLAB, que es un
entorno de desarrollo de aplicaciones orientado a
realizar cálculos matemáticos elevados y la
visualización de los mismos.
La elección de este programa está basada en que las
imágenes no dejan de ser matrices sobre las que
debemos realizar unos cálculos concretos, por lo
tanto sería un entorno de desarrollo totalmente
adecuado para la aplicación a desarrollar. Además la
implementación de nuestro clasificador va a
resultarnos fácil y será sencilla de entender a
cualquier usuario que desee comprobar su
funcionamiento.
PALABRAS CLAVE.
Imágenes, clasificación, extracción de características,
procesamiento…
1.- INTRODUCCIÓN.
La clasificación de imágenes es un procedimiento
utilizado en cartografía, astronomía, diagnósticos
médicos, etc.
Este procedimiento, se basará en la extracción de
ciertas características comunes en una categoría de
imágenes, para su posterior clasificación en una de
las distintas clases posibles.
El proceso de extracción de características estará
orientado a la manipulación de imágenes digitales.
Hay características que no percibimos a primera
vista, pero que están implícitamente dentro de las
imágenes con las que trabajaremos, para ello
utilizaremos técnicas de minería de datos, que extraen
dicha información.
En este bloque introducimos todas las imágenes que
queramos clasificar, independientemente de las
categorías con las que estamos trabajando, es decir, el
sistema nunca conocerá de forma cierta la categoría a
la que pertenecen cada una de las imágenes de
entrada; se comporta de una forma ciega.
Cada imagen es tratada como una matriz de dos
dimensiones (x e y) para cada una de las
componentes RGB, o una sola matriz (x · y) para las
imágenes en escala de grises.
Para la extracción de algunas de las características
deberemos convertir la imagen de color a escala de
grises, como por ejemplo para la extracción de
características que requieren el uso del histograma.
Cada uno de los componentes de la matriz será el
valor de la intensidad de un punto de la imagen, o
también denominado píxel.
En matlab, usaremos datos de tipo double con lo que
deberemos convertir la matriz de coeficientes de las
imágenes cargadas a este tipo.
2.2.- Extracción de las características
y almacenado.
El siguiente bloque de nuestro clasificador es el
encargado de la extracción y el almacenado de las
características de cada una de las imágenes de
entrada.
Es uno de los pasos más importantes de nuestra
aplicación, ya que a partir de la correcta extracción de
dichas características podremos posteriormente
clasificarlas de forma adecuada y sin demasiados
errores en una u otra clase.
EXTRACCIÓN DE CARACTERÍSTICAS.
Antes de ponerse a programar debemos analizar cada
una de las categorías que tendremos que clasificar
después. Observaremos sus características propias, y
visualizaremos cuáles son distintas en ambos grupos
de imágenes, para así poder decidir a cuál clase se
parece más.
Las características de las imágenes pueden ser de
varios tipos, como por ejemplo: número de líneas
horizontales y verticales, colores típicos, texturas,
uniformidad, etc.
En el caso que hemos implementado las dos
categorías seleccionadas son minaretes (torres) y
candelabros, y las características seleccionadas son el
color y la entropía.
anteriores para obtener un margen de marrón
similares a los que podríamos encontrar dentro de esa
categoría.
140<ROJO<200
140<VERDE<165
90<AZUL<145
- Color blanco: tras muchas pruebas de distintos
colores, comenzamos a probar colores que no se
visualizaban de forma directa en las imágenes, pero
que influyen en el color que el ojo percibe. Los
umbrales que definen los distintos tonos de blanco
que nos interesan en este caso son:
242<ROJO<254
242<VERDE<254
240<AZUL<254
Para calcular el nivel de blanco en la imagen
seguiremos estos pasos:
Comprobaremos si la imagen tiene las tres
componentes RGB mediante la función size, que nos
devolverá un vector con tres componentes, alto,
ancho y número de dimensiones (L). Si L es 3 la
imagen será del tipo RGB, y si es 1, la imagen estará
en escala de grises.
A continuación, una vez comprobado que la imagen
tiene las tres dimensiones (es decir, que L=3)
separamos cada una de las componentes de color para
cada pixel:
imagenColorRojo(i,j) = imagenColor(i,j,1);
imagenColorVerde (i,j) = imagenColor(i,j,2);
imagenColorAzul (i,j) = imagenColor(i,j,3);
- COLOR
Sin duda esta características es la que más problemas
puede darnos a la hora de clasificar, ya que puede que
sea evidente que haya un color predominante en la
imagen, pero al basarnos en rangos para definir un
color, puede que haya otro, que esté compuesto por
valores próximos a ese rango y nos modifique la
decisión del clasificador.
Cada vez que se ha realizado una prueba hemos
modificado los umbrales para comprobar qué color
estaba en mayor proporción dentro de cada una de las
categorías; por lo que hemos llegado a la conclusión
de que las torres contienen nivel de color blanco que
los candelabros.
Para la extracción del color nos basamos en los
distintos rangos que tiene cada uno de los colores en
sus tres componentes RGB. Estos rangos podrán
tomar valores comprendidos entre 0 y 254 (siendo el
0 la ausencia de esa componente y 254 el máximo
valor que esa componente puede tomar).
Los colores con los que hemos probado han sido:
- Color azul: la mayor parte de las imágenes de
torres están tomadas en el exterior, por lo que el azul
del cielo predominaría en el fondo de la imagen. Los
umbrales del color azul son:
100<ROJO<180
180<VERDE<220
210<AZUL<254
- Color tierra: las torres tienen un tono característico
marrón claro, por lo que modificamos los umbrales
Donde imagenColor, es la imagen cargada en ese
momento, i y j serán los índices de los bucles usados
para recorrer la imagen pixel a pixel.
- Una vez obtenida la componente de color,
marcamos un umbral que contendrá el color que nos
interesa conseguir (en este caso el blanco) con la
sentencia:
if((imagenColorRojo(i,j)<254)
&&
(imagenColorRojo(i,j)>242)
&&
(imagenColorVerde(i,j<242)
&&
(imagenColorVerde(i,j)<254)
&&
(imagenColorAzul(i,j)>240)
&&
(imagenColorAzul(i,j)<254))
Crearíamos por tanto otra condición en la que
impondremos que los pixeles que tengan un valor por
componente dentro del rango calculado se quedarán
tal y como están, mientras que cuando no se cumpla
la condición pasarán a tener un valor nulo (0).
Actualizamos la imagen para que nos aparezcan los
píxeles que nos interesan (cada una de las
componentes imagenColorRojo, imagenColorAzul e
imagenColorVerde, sobrescribe los valores anteriores
de esa componente en la imagenColor), por lo que
observaremos una imagen en la que destacarán los
píxeles del color que queremos, en este caso
aparecerá el negro (correspondiente a los valores
nulos) y el blanco.
Recorremos la imagen para realizar el conteo de los
píxeles negros, para posteriormente, conociendo el
número de píxeles totales, podamos obtener el
número de píxeles del color que estamos estudiando.
Para terminar, almacenamos el nivel de color en la
matriz de características asociada a las imágenes de
cada categoría.
- ENTROPÍA
Es el grado de incertidumbre que existe en cualquier
proceso aleatorio. En nuestro caso podremos definirlo
como la cantidad de “desorden” que contiene nuestra
imagen.
En el caso que nos corresponde estudiar, usaremos el
histograma de la imagen en escala de grises
(mediante la función imhist) y podremos definir la
entropía como el sumatorio del valor obtenido en
dicho histograma, multiplicado por el logaritmo en
base dos del mismo valor más un valor muy pequeño,
denominado eps. Este valor se suele utilizar cuando el
valor al cual le aplicaremos el logaritmo es muy
pequeño.
La expresión de la entropía será:
entropía = -sum(p.*(log2(p+eps)));
Existen muchas más características que podrían ser
útiles a la hora de la clasificación de imágenes, como
por ejemplo:
- UNIFORMIDAD
Nos indica la poca variación que hay dentro de una
imagen. Esta característica se calcula a partir del
histograma de cada una de las imágenes en escala de
grises.
Almacenamos este valor en una variable para su
posterior uso.
La suma de todos los valores que hemos almacenado
en la variable anterior al cuadrado nos dará el valor
de la uniformidad.
Nos basamos en la imagen en escala de grises.
Para obtener el número de líneas horizontales,
definimos un filtro detector de bordes horizontales y
se lo aplicamos a la imagen.
El filtro definido es el siguiente:
fitro = [1 2 1; 0 0 0; -1 -2 -1];
Un ejemplo de la imagen que obtenemos, una vez
aplicado el filtro es la siguiente:
Binarizamos la nueva imagen y realizamos el cálculo
del número de líneas, mediante la función strel;
previamente,
hemos
definido
el
elemento
estructurante, en este caso líneas (line).
Usamos la función imerode para llevar a cabo la
erosión y posteriormente la función bwlabel, para
unir de nuevo las líneas que se han fragmentado, que
es lo que hará que nos quedemos únicamente con las
líneas, para realizar posteriormente el conteo
mediante la función bweuler, que nos devolverá el
valor que buscamos.
- NUMERO DE LINEAS VERTICALES
Es el mismo caso que el parámetro anterior, salvo que
usaremos un filtro detector de bordes verticales:
filtro = [0 0 0; -1 1 0; 0 0 0];
- SUAVIDAD
Sirve para detectar aquellas imágenes que son más
lisas que otras. La suavidad tendrá un valor más bajo
para imágenes con una rugosidad más alta. Al
comparar una categoría con otra, la de mayor
suavidad será la que tenga un valor más alto (o más
baja rugosidad).
Para calcular la suavidad, necesitamos obtener antes
el tamaño de la imagen, mediante la función size.
Utilizamos también la imagen en escala de grises.
Obtenemos la varianza de cada una de las imágenes
para posteriormente calcular la suavidad mediante la
fórmula:
suavidad = 1-(1/(1+varianza));
- NUMERO DE LINEAS HORIZONTALES
Esta característica es algo abstracta a la vista de
cualquier observador, ya que no podemos
diferenciarla a simple vista, sino que necesitamos
realizar un filtrado de la imagen para poder obtener
cierta información; por lo cual, esta es una
característica en la que no se piensa en un principio.
- NUMERO DE LINEAS (HOUGH)
Podemos calcular el número total de líneas a partir de
la transformada de Hough.
Binarizamos la imagen y le incluimos como
parámetro un método ya predeterminado denominado
‘canny’, que busca los máximos de gradiente encada
una de las imágenes; el gradiente lo calcularíamos
mediante la derivada de un filtro gaussiano.
Utilizamos este parámetro, y no otro, porque tiene
mayor inmunidad frente al ruido.
A continuación, definimos un vector donde
recogeremos la información de la transformada de
Hough, y que a su vez contendrá el ángulo de cada
una de la columnas de la transformada y los valores
de rho de cada una de la filas de la transformada.
Marcamos un umbral, en el que indicaremos un
número orientativo de líneas, como puede ser 125.
Llamamos a la función houghpeaks, que detecta los
ejes que hay en la matriz obtenida anteriormente a
partir de la transformada Hough, pasándole como
parámetros: la matriz de la transformada Hough, el
número de líneas y un umbral máximo, a partir del
cual se suprimirán los píxeles vecinos.
Para
terminar
definimos
un
parámetro
(numeroDeLineas) que nos vaya almacenando el
tamaño p (ejes), que más tarde nos servirá para la
clasificación.
- OTRAS CARACTERÍSTICAS
Otra característica interesante habría sido el número
de círculos.
Para ello se utilizaría la imagen binarizada, con la
función im2bw. Definiríamos el radio del círculo
(radio de los elementos que querríamos encontrar) y
para finalizar, utilizaríamos la transformada de
Hough para encontrar los círculos mediante la
función houghcircle.
Para tener una idea visual de lo que estamos
realizando en el bloque de entrenamiento, obtenemos
la gráfica de distribución de características,
dibujamos los centroides y la frontera de decisión
para saber a qué categoría pertenecería la imagen
según esté en una región u otra.
2.4.- Etapa de clasificación.
Al tratarse de un clasificador de mínima distancia,
calcularemos las distancias entre las características de
las imágenes de entrada y cada uno de los centroides
que habíamos calculado en el bloque de
entrenamiento.
Una vez calculadas las distancias, comprobamos cuál
de las dos es menor, y por lo tanto a qué categoría de
imágenes pertenece.
Realizamos la siguiente comparación:
Si la distancia al centroide 1 es mayor que la
distancia al centroide 2, la categoría a la que
pertenece la imagen estudiada es la 2; en otro caso,
será la 1.
ALMACENAMIENTO
Una vez que extraemos todas las características, se
almacenan en una matriz.
A continuación la matriz de características se divide
en dos submatrices dejando algo más de la mitad de
los valores para el bloque de entrenamiento y el resto
para el test (evaluación).
Generalmente suele rondar en torno al 65% para
entrenamiento y el 35% para el test, aunque en
ocasiones se utiliza también los porcentajes 75 / 25%,
dependiendo de cómo queremos que esté entrenado
nuestro sistema, aunque tendremos en cuenta que no
esté sobreentrenado, ya que esto iría en contra de
generalizar y hacer más fácil la solución sencilla al
problema propuesto.
2.3.- Bloque de entrenamiento.
En este caso, el clasificador utilizado ha
sido el de mínima distancia, teniendo en cuenta que
los resultados obtenidos no van a ser buenos,
realizaremos un entrenamiento previo del mismo a
partir del cual obtendremos un parámetro que nos
servirá para llevar a cabo la clasificación de las
imágenes en cada categoría.
Calculamos los centroides obteniendo la media de la
característica asociada a cada una de las categorías de
imágenes; de esta forma, nos permitirá tener una
mayor precisión a la hora de clasificar las imágenes
introducidas.
Para no tener fallos a la hora de hacer el balance de
aciertos y errores, le damos un valor concreto a cada
una de las categorías, como pueden ser 0 para la
categoría 1 y 1 para la categoría 2, de esta forma, para
saber cuántas veces ha clasificado la imagen de la
categoría 1 tan sólo nos basta con hacer un sumatorio
(sabiendo el número total de imágenes que hemos
incluido en el clasificador).
Las imágenes de entrada a este bloque serán las
submatrices de entrenamiento y test de cada
categoría.
2.5.- Evaluación del clasificador.
Este es el bloque final de nuestro clasificador, y es
donde podemos llevar a cabo una evaluación de la
eficiencia de nuestro programa.
Obtenemos una matriz de confusión, la cual nos
indicará cómo de bueno o malo es el clasificador que
hemos implementado.
Para sacar los centroides, utilizaremos la submatriz
de características de entrenamiento definida
anteriormente.
La matriz de confusión tiene dimensión 2x2 y los
valores que nos interesan son los de la diagonal,
cuanto más altos sean con respecto a los demás,
mejores resultados obtendremos en la clasificación.
Una vez obtenidas las medias, las almacenamos en un
vector de medias para ser utilizado en el bloque de
clasificación.
Dentro de la matriz de confusión:
•
La primera fila se referirá a la categoría 1; el
primer término de la fila nos indicará las
imágenes que ha clasificado correctamente frente
•
al número total de imágenes que tenía la categoría
1 y el segundo término en cuales ha fallado.
recurriremos más tarde para implementar el sistema
que permita la clasificación de las imágenes.
La segunda fila se referirá a la categoría 2; el
primer término se referirá a las imágenes que ha
clasificado mal con respecto al número total de
imágenes de la categoría 2 y el segundo término
nos indicará el número de imágenes que ha
clasificado correctamente.
Nuestro motor de inferencias será la extracción de
características para compararlas con las medias
almacenadas que será nuestra base de conocimientos.
Haremos una evaluación de las imágenes de
entrenamiento y otra de las imágenes de test,
obteniendo mejores resultados en la evaluación de las
imágenes de entrenamiento por lo general, ya que son
las que hemos utilizado en el bloque de
entrenamiento por lo que el “molde” está hecho a su
medida.
Tabla de evaluación del clasificador
Imágenes de
Entrenamiento
Imágenes
de Test
TASA DE
ERROR
0.3357 (33’57%)
0.3026
(30’26%)
TASA DE
ACIERTO
0.6643
(66’43%)
0.6974
(69’74%)
Tabla de eficiencia del clasificador
Imágenes de
Entrenamiento
Imágenes
de Test
IMÁGENES
BIEN
CLASIFICADAS
95/143
53/76
IMÁGENES
CLASIFICADAS
ERRONEAMENTE
48/143
23/76
3.CLASIFICACION
DE
IMÁGENES Vs. INTELIGENCIA
ARTIFICIAL
(algoritmos
de
búsqueda)
En este apartado tratamos de buscar similitudes entre
los algoritmos y métodos usados en la
implementación del programa y los estudiados en la
asignatura.
Observamos que nuestro sistema será un sistema
basado en conocimiento, ya que necesitamos conocer
el tipo de problemas que tenemos entre manos antes
de llevar a cabo el programa de clasificación.
Separaremos el conocimiento que codificamos en la
máquina y los mecanismos deductivos (motor de
inferencias).
Para realizar un programa de estas envergadura
necesitaremos que un experto en el tema (en este caso
nosotros) nos “ponga al día” de todos los posibles
métodos que existen para ello, a los cuales
Observamos, a su vez, un razonamiento lógico, ya
que obtenemos una conclusión (la imagen es de tal o
cual categoría) mediante unas premisas (se parece
más a esta característica que a esta otra).
Cuando tratamos la imagen, vemos que si no
pertenece a una categoría, es obligatoriamente de la
otra, ya que en nuestro sistema solo disponemos de
dos grupos de imágenes posibles. Este tratamiento de
las imágenes es claramente un mecanismo más del
razonamiento lógico.
Vemos también una serie de indicios que nos llevan a
deducir que el sistema implementado tiene a su v ez
algunos rasgos claros del razonamiento bajo
incertidumbre, ya que si lo pensamos detenidamente,
percibimos proposiciones imprecisas, puesto que las
variables no se pueden determinar con exactitud
(siempre quedan dudas de si la decisión tomada es la
correcta o no lo es).
Podemos en algunos casos, implementar un sistema
parecido al que nosotros hemos desarrollado que
contenga una teoría de la evidencia, que mejore
nuestro programa (si con una de las características no
es capaz de resolver la decisión, puede apoyarse en
la otra para solucionar este problema).
Cuando estudiamos Clips, nos dimos cuenta de que
nuestra aplicación se asemejaba también a algunos
aspectos de este tema.
Cada característica extraída es un patrón, y nuestro
motor de inferencias (la observación de estos
patrones con las medias sacadas de los bloques de
entrenamiento) es capaz de emparejar la lista de
hechos (la imagen tiene tanta cantidad de la
característica i) con los patrones de las reglas (el
centroide de la característica i está en tal o cual
posición).
Evaluaremos los patrones, con funciones booleanas
de comparación numérica y lógicas, para realizar
varias cosas en nuestro sistema, como decidir si los
valores de un pixel está o no en los niveles de blanco
definidos.
Otro de los temas tratados en clase y en nuestro
programa es el aprendizaje.
Usaremos
un
sistema
que
no
produzca
sobreentrenamiento, ya que si nuestra aplicación se
ajusta demasiado a los datos de entrenamiento no será
capaz de decidir de forma correcta si le introducimos
posteriormente los datos de test.
El agrupamiento es otro de los contenidos del tema de
aprendizaje que somos capaces de observar en
nuestro trabajo; identificaremos grupos de datos en
cada una de las características, ya que siempre
tendrán valores muy separados si se trata de imágenes
de una categoría o de la otra. La técnica que usa el
agrupamiento de los datos en una u otra región la
realizaremos mediante la media (centroides).
La idea básica del tema de aprendizaje es que nuestro
sistema es capaz de “aprender”, mediante unas
imágenes de entrenamiento, para posteriormente
evaluar el sistema, mediante las imágenes de test.
El bloque de conocimientos más importante de la
asignatura es también el que más se asemeja a la
forma de trabajar que tiene nuestro sistema, la
minería de datos.
Observamos que el proceso básico de minería de
datos es más o menos igual que el que usamos
nosotros en nuestro sistema:
Tenemos una base de datos, que en nuestro caso será
cada una de las categorías que comprenden las
imágenes que vamos a estudiar.
Seleccionamos los datos que necesitamos de esta
base, y le realizamos un preprocesado.
A continuación seleccionamos las características que
necesitamos y las extraemos.
Como último paso, evaluamos e interpretamos los
resultados obtenidos, obteniendo así un modelo de
conocimiento, que será el saber distinguir entre una
categoría u otra.
La metodología llevada a cabo en nuestra aplicación
es también la misma que en la minería de datos:
Lo primero es comprender el ámbito en el que nos
estamos moviendo. Este proceso se realiza siempre
bajo la supervisión y el consejo de personas expertas
en el tema que estemos tratando en ese momento, en
este caso la clasificación de imágenes.
Posteriormente, observamos los datos que tenemos,
en nuestro caso las imágenes y comprendemos sus
características, para luego poder tratarlas de la forma
correcta.
Una vez hecho esto, podemos pasar al preprocesado
de datos, en el que los ajustaremos para trabajar
posteriormente con ellos. Este apartado lo iremos
realizando a la vez que el modelado, ya que idear el
sistema consiste también en probar distintos
algoritmos y prestar atención a los resultados
obtenidos, posteriormente observar si nuestra
aplicación necesita cambios o está correctamente
implementada.
Cuando ya tenemos el modelo realizado, debemos
evaluarlo, de esta forma, comprobaremos el correcto
funcionamiento del sistema, si es así, ya tendremos el
programa totalmente desarrollado.
La parte de minería de datos que trataremos para
realizar la extracción del conocimiento, serán las
técnicas descriptivas, que tratarán de describir un
conjunto de datos, pero también podríamos
enmarcarla en técnicas predictivas ya que lo que
pretendemos es estimar un valor de salida (una
conclusión determinada, la cuál nos dará información
sobre el proceso de clasificación).
La clasificación se realizará mediante mínimas
distancias, es decir, observaremos la característica de
la imagen que estemos tratando en ese momento y la
compararemos con las medias almacenadas; así
podremos decidir a cual se parece más, es decir, de
cual característica está más cerca.
Realizaremos también una segmentación de los datos
para posteriormente tratarlos de forma más eficiente,
en nuestro caso trataremos por separado los bloques
de entrenamiento y de test.
CONCLUSIÓN
Nuestro sistema está profundamente relacionado con
varios conceptos de la inteligencia artificial, y
podemos asemejarlo a muchos temas dados en la
asignatura.
La realización de este programa nos ha servido para
darnos cuenta de que la mayor parte de las veces, los
sistemas implementados para dar una solución a un
problema siguen siempre el mismo patrón:
Adquisición y preprocesado de los datos.
Elección y extracción de las características para
realizar un modelo general.
Clasificación de unos datos de entrada y evaluación
del sistema.
4.- BIBLIOTECA DE FUNCIONES
UTILIZADAS EN MATLAB
imread = función utilizada para leer las imágenes de
un determinado archivo
rgb2gray = convierte las imágenes RGB a escala de
grises, eliminando el matiz y la saturación de la
información, manteniendo la luminancia
tmhist = muestra el histograma de datos de la imagen
size = tamaño (dimensión) de la imagen
strel = crea el elemento estructural morfológico
imerode = erosiona la imagen con el elemento
estructural que hemos definido con la función strel
bwlabel = encargada de conectar las componentes de
la imagen binaria que hemos previamente hemos
erosionado
bweuler = obtenemos el número de elementos que
hayamos definido en la imagen.
im2bw = función utilizada para binarizar una imagen
houghcircle = transformada de hough utilizada para
encontrar círculos
5.- REFERENCIAS
[1] Apuntes asignatura Tratamiento Digital de
Imágenes, tercer curso de I.T.T. Sonido e
Imagen, Jesús Cid
http://www.tsc.uc3m.es/~jcid
[2] Tratamiento digital de imágenes, apuntes de
I.T.T. Sonido e Imagen de la Universidad de
Málaga, Fº Navas Herrera, Enrique Nava Baro
http://campusvirtual.uma.es/tdi/
[3] Recurso didáctico de tratamiento digital de
imátenes, José J. Grimaldos
http://www.grimaldos.es/cursos/imgdig/
[4] Curso de doctorado de tratamiento digital de
imágenes, Rafael Palacios
http://www.iit.upcomillas.es/palacios/dip/
[5] Wikipedia, procesamiento digital de imágenes
http://es.wikipedia.org/wiki/Procesamiento_digit
al_de_im%C3%A1genes
[6] Apuntes de vision artificial, Universidad
Politécnica de Madrid, Carlos Platero
http://www.elai.upm.es/spain/Asignaturas/Robot
ica/ApuntesVA/cap3ProcesadoImagv1.pdf
http://www.elai.upm.es/spain/Asignaturas/Robot
ica/ApuntesVA/cap5VASegmentacion.pdf
[7] Procesamiento digital de imágenes, Facultad de
agronomía
http://www.agro.uba.ar/users/paruelo/SIG/Clase
_proc_dig.pdf
[8] Apuntes análisis de imágenes de la Universidad
de Alcalá
http://www.depeca.uah.es/docencia/ITINF/sva/t7-analisis.pdf
[9] Introducción a la Toolbox de Procesado de
Imagen
http://www.depeca.uah.es/docencia/INGTELECO/lce/image_toolbox.pdf
[10] Prácticas segmentación de imágenes de la
Universidad Politécnica de Madrid
http://www.elai.upm.es/spain/Asignaturas/Robot
ica/PracticasROVA/prROVA5Segmentacion.pdf