Está en la página 1de 70

Ingeniera Informatica

Proyectos Informaticos (E80)


Localizacion y decodicacion de codigos de barras
en imagenes digitales
Proyecto presentado por:
Vicente Castell o Martnez
y dirigido por:
Vicente Javier Traver Roig
Castellon de la Plana, Julio de 2005
ii
Resumen
Esta memoria describe un metodo para la localizacion y posterior decodicacion de codigos de
barras presentes en imagenes digitales. El codigo de barras puede aparecer en cualquier posicion
y orientacion dentro de la imagen, con lo cual debemos ser capaces de detectarlo y recticar su
orientacion, para as poder decodicarlo de forma correcta.
Una tecnica que se presenta, debido a que los codigos de barras poseen unas caractersticas
muy denidas, como un metodo adecuado para la localizacion de un codigo de barras dentro
de una imagen es la deteccion de bordes. Ademas, como los puntos de borde pertenecientes al
codigo presentaran una orientacion similar, el objetivo sera de alguna forma homogeneizar esta
zona donde se encuentra el codigo, extendiendo el valor de la orientacion obtenido de los puntos
de borde a los que no lo son. A continuacion, debido a este proceso de expansion de la orientacion
conseguiremos un conjunto de regiones candidatas, de las cuales debemos ser capaces de poder
elegir una de ellas como susceptible de contener el codigo. A partir de esta region debemos
calcular la orientacion que presentan los puntos de borde de la misma, para poder recticar
as la imagen. Una vez conseguida una subimagen centrada en el codigo intentamos decodicar
este con exito, basandonos en lo que conocemos del tipo de codicacion en concreto.
Por ultimo comentar que durante toda la memoria se presentan los resultados que se van
consiguiendo para cada una de las fases en las que se divide el metodo, ademas de una serie de
experimentos para reforzar la comprension del mismo o recalcar ciertos aspectos que se creen de
interes.
iii
iv
Agradecimientos
En unas pocas palabras quisiera agradecer a una serie de personas la ayuda que me han presta-
do en la realizacion de este proyecto.

Estas son M
a
Angeles Lopez (por su implementacion del
detector de bordes de Canny), Ra ul Montoliu (por su codigo para el etiquetado de componentes
conexas) y Vctor Jimenez (por sus ideas acerca de posibles estrategias a seguir para la decodi-
cacion), sin los cuales el esfuerzo realizado hubiese sido enormemente mayor. Por ultimo y no
por ello menos importante, agradecer en gran medida a mi director, Javier Traver, el tiempo
que me ha dedicado y la paciencia que ha tenido conmigo, ya que sin su colaboracion no hubiese
podido afrontar este proyecto. Simplemente, muchas gracias.
v
vi

Indice general
1. Introduccion 1
1.1. Motivacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Organizacion de la memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3. Trabajos relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Codigos de barras 7
2.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Denicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4. Ventajas e inconvenientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6. Clases de codigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7. Dispositivos de escritura y lectura de codigos de barras . . . . . . . . . . . . . . . 11
3. Deteccion de bordes 15
3.1. Tecnicas de localizacion de codigos de barras . . . . . . . . . . . . . . . . . . . . 15
3.2. Detector de bordes de Canny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4. Deteccion de regiones candidatas 19
4.1. Idea general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5. Etiquetado y ltrado de regiones 23
5.1. Etiquetado de componentes conexas . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.3. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6. Estimacion de la orientacion y recticacion 31
6.1. Idea general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7. Decodicacion 33
7.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.3. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.4. Analisis de robustez . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
vii

Indice general
8. Sistema experimental 45
8.1. Informacion general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
8.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8.3. Valores por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8.4. Tiempo de ejecucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
8.5. Duracion del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9. Conclusiones 49
A. Detector de bordes de Canny 51
B. Algoritmo clasico de etiquetado de componentes conexas 53
C. Metodo de Otsu 55
D. Caractersticas del codigo EAN-13 57
viii
1. Introduccion
1.1. Motivacion
Hoy en da los codigos de barras estan muy presentes en nuestro quehacer diario, ya que
nos aparecen en los supermercados, tiendas de toda clase, en los libros de las bibliotecas, etc.,
debido a que permiten obtener una especicacion unica de un producto o material en concreto.
Sin embargo no debemos olvidar que los codigos de barras necesitan de instrumentos que puedan
leerlos, al igual que de un software que permita captar y procesar la informacion.
Ademas en entornos controlados, las camaras pueden ser usadas para la identicacion de
objetos, es decir, si los objetos de nuestro interes presentan etiquetas de codigos de barras en
una supercie visible, entonces un simple sistema de camaras portatiles puede reconocer el codigo
de barras en el entorno y proporcionar al usuario informacion sobre el objeto etiquetado [26].
Por todo ello este proyecto intenta ofrecer un metodo de localizacion de un codigo de barras
dentro de una imagen, para su posterior decodicacion. Se ha utilizado una serie de procedimien-
tos que nos han permitido conseguir nuestro objetivo y que se explican con detalle posteriores
captulos de esta memoria.
Como es obvio, hay una gran variedad de codigos de barras, pero en este proyecto nos hemos
centrado en una clase en concreto, el codigo EAN (European Article Number) y mas concreta-
mente en su version EAN-13 [20], que aunque dicho de esta forma no nos suene mucho, es uno de
los codigos mas presentes en nuestras vidas, ya que se utiliza en una gran cantidad de productos
de todo tipo, desde cualquiera de los artculos presentes en un supermercado hasta toda clase
de libros. Es en este ultimo uso donde nos centraremos, ya que los libros se codican basandose
en un sistema internacional de numeracion, el ISBN (International Standard Book Number) [9],
el cual utiliza para su codicacion el codigo EAN-13.
Si sabemos que los dgitos que encontramos normalmente impresos junto a las barras y espacios
de un codigo de barras suelen ser aquellos codicados dentro de este, por que no leer estos dgitos
en lugar de decodicar estas barras y espacios. La razon principal es que, incluso con los modernos
sistemas de reconocimiento optico de caracteres (OCR, Optical Character Recognition), no es
posible identicar las cifras de un codigo numerico con la suciente rapidez, facilidad y abilidad
que se requiere y por tanto no queda otra solucion mas que representar el codigo mediante
smbolos facilmente legibles por el ordenador, empleando sus sistemas binarios.
Otra pregunta que puede surgir es por que investigar en este tema si los sistemas existentes
ya funcionan correctamente. Una de las razones es la posibilidad de que cualquier persona con
una camara, como por ejemplo una simple webcam, pudiese decodicar codigos de barras en su
propia casa si lo precisase, ya que es mas facil que un particular pueda adquirir una camara de
este tipo que un lector laser por ejemplo, mucho mas caro. Incluso podra ser utilizado por el
peque no y mediano comercio, resultando una opcion mucha mas economica.
1.2. Organizacion de la memoria
La memoria esta dividida en una serie de captulos donde cada uno de ellos presenta la
siguiente informacion:
1
1. Introduccion
El captulo 2, ((Codigos de barras)), se dedica a aportar una serie de datos relacionados con
los codigos de barras: denicion, ventajas e inconvenientes, aplicaciones, lectores, etc., a
modo de informacion introductoria al mundo de los codigos de barras.
En el captulo 3, ((Deteccion de bordes)), se explica la idea fundamental que se sigue para
la localizacion del codigo de barras y es que debido a las caractersticas que este posee,
la deteccion de bordes se presenta como una tecnica mas que adecuada para su posible
deteccion.
En el captulo 4, ((Deteccion de regiones candidatas)), nos centramos en la idea que a la hora
de detectar el codigo de barras los pixels que son puntos de borde y forman parte del codigo
van a tener una orientacion similar. Con esta caracterstica lo que se pretende es expandir
esta orientacion a los vecinos de cada uno de los puntos de borde y as, homogeneizar toda
la zona donde se encuentra el codigo con una misma orientacion.
En el captulo 5, ((Etiquetado y ltrado de regiones)), explicamos como tras el paso anterior
mediante un proceso de agrupamiento, extendiendo la orientacion y gracias a una posterior
binarizacion, conseguimos obtener una serie de regiones susceptibles de ser la que se busca.
Utilizando algoritmos de etiquetado de componentes conexas y realizando a continuacion
un ltrado, podemos quedarnos con la region que ((supuestamente)) contiene el codigo.
En el captulo 6, ((Estimacion de la orientacion y recticacion)), se indica como, al poder
presentar el codigo cualquier angulo dentro de la imagen, se debe calcular la orientacion
que presentan los puntos de borde que aparecen en esta region susceptible de contener
al codigo y que hemos obtenido en el paso anterior. Una vez conocida esta orientacion
simplemente debemos recticar la imagen y conseguir una imagen centrada en el codigo,
para su posterior binarizacion.
En el captulo 7, ((Decodicacion)), se explica como basandonos en la imagen binarizada del
codigo de barras obtenida en el paso anterior, y empleando el conocimiento que tenemos
del tipo de codigo a interpretar (EAN-13), se obtiene la consiguiente decodicacion del
mismo.
El captulo 8, llamado ((Sistema experimental)), presenta informacion relativa al proyecto
y que creemos que debe ser mencionada, desde el software utilizado para la realizacion del
proyecto hasta el tiempo en que tarda en ejecutarse la tecnica implementada.
En el ultimo captulo simplemente mencionamos las conclusiones a las que llegamos despues
de la realizacion de este proyecto.
De forma graca el proceso que se ha seguido para la localizacion y posterior decodicacion
de un codigo de barras se puede observar en la Figura 1.1. Cada una de las fases que componen
el proceso en general se explican con mas detalle, y como hemos comentado anteriormente, en
los correspondientes captulos que aparecen en esta memoria.
1.3. Trabajos relacionados
Previamente y durante la realizacion de este proyecto se ha ido recopilando informacion de
artculos y trabajos relacionados con codigos de barras, algunos de los cuales vamos a comentar
en este punto, ya que han servido de complemento y ayuda al igual que nos han ofrecido ideas
para la realizacion del metodo, o simplemente pueden resultar de interes para conocer con mayor
detalle el estado del arte o profundizar en el tema.
2
1.3. Trabajos relacionados
La decodicacion de codigos de barras da nados es un tema que se presta a estudio. Un ejemplo
sera la decodicacion de los codigos de barras que nos aparecen en las recetas medicas y que se
ven afectados por rmas o cualquier otro tipo de mancha [22]. El metodo en cuestion se basa
en la utilizacion de la transformada de Hough como herramienta que permite la b usqueda de
lneas verticales dentro de una imagen. La tecnica implementada consigue leer alrededor de un
85 % de las prescripciones que se analizan, sin embargo cabe destacar que el proceso asume que,
a diferencia de nuestro proyecto, el codigo ya se encuentra en una orientacion mas o menos
adecuada para ser procesado por el algoritmo.
Sin embargo los estudios realizados no solo se han centrado en la localizacion de las barras
y los espacios que conforman el codigo, sino que han llegado a plantearse otra opcion como, el
decodicar un codigo de barras a partir de los dgitos presentes junto a las barras del mismo [5].
Los sistemas de analisis de imagen normalmente requieren que la imagen donde se encuentra el
codigo de barras a analizar tenga una resolucion lo sucientemente buena para su decodicacion.
Gracias a este nuevo metodo se consigue que la imagen pueda presentar una baja resolucion y
se decodique el codigo con exito, ya que los caracteres o dgitos presentes debajo del codigo
de barras pueden verse menos afectados por un emborronamiento o una baja resolucion de
la imagen, con lo cual pueden convertirse en una acertada fuente de informacion, mejor que
el patron de barras. En este metodo la localizacion del codigo de barras se realiza a partir
del analisis del gradiente. Una vez localizado el codigo, basandose en el tipo de codicacion
que se quiere decodicar, se determina donde se encuentra la zona que incluye los caracteres
que representan al codigo, para posteriormente mediante tecnicas de probabilidad y estadstica
determinar a que dgitos corresponden.
Dentro del campo de la robotica tambien resulta de interes la localizacion y posterior de-
codicacion de codigos de barras. Se ha llegado a investigar en temas como el desarrollo de un
sistema robotizado que, utilizando algoritmos de procesamiento de imagenes, intenta reconocer
y decodicar los codigos de barras que aparecen en una gran variedad de barriles utilizados
en algunos sectores industriales para almacenar toda clase de residuos. Al mismo tiempo este
reconocimiento sirve para realizar una especie de inventario de los barriles inspeccionados [31].
El procedimiento se basa en dos fases: una primera en la que la imagen es procesada aplicando
ltros adaptativos de umbralizacion del gradiente. Este ltrado identica bordes verticales en la
imagen. En la segunda fase la imagen es analizada por areas que tienen una alta concentracion
de estos bordes verticales, asumiendo que son zonas con una alta probabilidad de ser el codigo
de barras, idea parecida a la que se utiliza en nuestro metodo donde se consiguen regiones de
orientacion similar susceptibles de contener el codigo. Sin embargo presenta inconvenientes co-
mo la aparicion de falsos positivos, debido a que la imagen puede presentar zonas con bordes
similares a los de un codigo de barras y por tanto detectarse como zona donde se encuentra el
codigo cuando no lo es. Ademas tambien se ve bastante inuenciado por el tama no del codigo
de barras respecto a la imagen.
Normalmente los sistemas de analisis de imagenes requieren que el codigo de barras este con-
tenido completamente en la imagen, sin embargo se han realizado investigaciones para evitar
esta limitacion. Un trabajo relacionado con este aspecto desarrollaba un metodo para la decod-
icacion de codigos de barras captados con una camara, cuyo campo de vision es mas peque no
que el tama no del propio codigo, con lo cual deba capturar distintas imagenes, que una vez
juntas, reconstruan el codigo, para posteriormente decodicarlo [28]. La localizacion del codigo
se realiza mediante el calculo del gradiente y buscando zonas donde la orientacion del mismo es
similar. Esta misma idea es en la que nos basamos en nuestro metodo para la localizacion del
codigo de barras. Una vez detectado el codigo se aprovecha el conocimiento que se posee del tipo
de codigo que se esta analizando para conseguir una correcta decodicacion. En nuestro proyecto
tambien explotamos este conocimiento que tenemos del codigo de barras para su decodicacion.
3
1. Introduccion
Relacionado con la problematica de la teora de se nales podemos encontrar trabajos que tratan
de interpretar el codigo de barras a partir del tratamiento o reconocimiento de los picos presentes
en la se nal u onda obtenida del mismo [18]. Se utilizan modelos estadsticos de reconocimiento
para clasicar estos picos como los caracteres presentes en el codigo. Mediante esta tecnica se
consigue mejores resultados ante codigos emborronados, ya que el proceso es mas resistente ante
tales contratiempos.
La ciencia no solo ha investigado en la mejora de tecnicas de decodicacion de codigos de
barras en cuanto a procesamiento de imagenes, sino que tambien se ha preocupado por mejorar
las prestaciones de los escaneres lectores de codigos. Un ejemplo es una investigacion realizada
con el objetivo de ofrecer mejoras en el funcionamiento de los escaneres a traves de un muestreo
selectivo y el uso de ltros de realzado para mejorar la deteccion de bordes, que detectan las
fronteras entre areas oscuras y claras (barras y espacios) [27]. Otros estudios se centran mas
en obtener tecnicas destinadas a la mejora de la decodicacion de codigos de barras borrosos o
emborronados [30].
4
1.3. Trabajos relacionados
Figura 1.1.: Diagrama global del proceso implementado
5
1. Introduccion
6
2. Codigos de barras
2.1. Introduccion
Como informacion preliminar, antes de comenzar a explicar el metodo desarrollado, se ha
credo conveniente aportar informacion general sobre los codigos de barras. Por ello, en este
punto de la memoria se presentan una serie de datos acerca de este sistema de codicacion.
Empezamos con una breve descripcion de los codigos de barras, su nomenclatura basica y una
serie de caractersticas. A continuacion nos adentramos en su historia [2], cuando surgieron y su
posterior desarrollo, ventajas e inconvenientes que presentan y un conjunto de aplicaciones en las
que los codigos de barras suelen ser de gran utilidad. Por ultimo se mencionan las distintas clases
de codigos que existen, para acabar comentando diferentes tipos de impresoras [4] y lectores para
esta clase de codicacion en concreto.
2.2. Denicion
Los codigos de barras son un sistema de codicacion creado con el objetivo de identicar
objetos y facilitar la obtencion de informacion y de esta forma eliminar la posibilidad de error
en la captura. La utilizacion de este sistema de codicacion es tan exitosa debido a la abilidad
que presenta en la recoleccion automatica de datos, reduciendo los posibles errores humanos que
se pueden producir en el caso de una introduccion erronea de informacion.
Podemos denir un codigo de barras como un patron formado por barras y espacios parale-
los que codica informacion mediante las anchuras relativas de estos elementos. Su estructura
basica consiste de un patron de inicio, uno o mas caracteres de datos, opcionalmente unos o dos
caracteres de vericacion y un patron de termino.
Ademas implementar un sistema de captura de datos por codigos de barras es poco costoso
y el conocimiento necesario para utilizar el sistema es mnimo, por lo que no debe presentarse
como un problema el aprendizaje del personal que manipule el mismo.
El desarrollo de este sistema de codicacion nos permite disponer de tres categoras de codigos
de barras, dependiendo de la tecnologa que es necesaria para realizar una lectura de los mismos:
lineales, multilas y bidimensionales. Una gran parte de la literatura existente llama tambien
codigos bidimensionales a los considerados multilas. Por tanto se puede realizar una division
entre codigos de una dimension (lineales) donde solo importa el ancho de las barras y el espacio
entre ellas y codigos de dos dimensiones (multilas y bidimensionales) donde importa la altura
y anchura del smbolo.
Nomenclatura basica
La visualizacion fsica de los codigos de barras suele presentarse mediante barras verticales:
estas representan caracteres de informacion mediante barras negras y espacios, donde el ancho
de las barras y espacios puede ser variable. Por tanto, cada dgito o caracter representado en un
codigo esta formado por barras y espacios que tienen una anchura total de una cierta cantidad
de unidades o modulos, dependiendo del codigo, de esta forma cada barra y cada espacio puede
tener una anchura de diversas unidades o modulos. De forma resumida se puede expresar de la
siguiente manera:
7
2. Codigos de barras
Modulo: es la unidad mnima o basica de un codigo. Las barras y espacios estan formados
por un conjunto de modulos.
Barra: el elemento ((oscuro)) dentro del codigo. Se hace corresponder con el valor binario 1.
Espacio: el elemento ((claro)) dentro del codigo. Se hace corresponder con el valor binario 0.
Caracter: formado por barras y espacios. Normalmente se corresponde con un caracter
alfanumerico.
Todo esto se observa mejor gracamente en la Figura 2.1.
Figura 2.1.: Cada caracter o dgito esta formado por un conjunto de modulos
Caractersticas
Un smbolo de codigo de barras presenta una serie de caractersticas entre las cuales cabe
destacar las siguientes:
Densidad: es la anchura del elemento, ya sea barra o espacio, mas estrecho dentro del
smbolo de codigo de barras. Un codigo de barras no se mide por su longitud fsica sino
por su densidad, que viene dada en milesimas de pulgada.
Razon ancho-estrecho (Wide to Narrow Ratio (WNR)): Es la relacion existente entre el
grosor del elemento mas estrecho con respecto al mas ancho. Normalmente es de 1:3 o 1:2.
Zona muda (Quiet Zone): Es el area blanca que aparece al principio y al nal de un
smbolo de codigo de barras y que es necesaria para una acertada lectura del smbolo.
2.3. Historia
El codigo de barras como sistema de codicacion tiene aceptacion mundial y hoy en da es un
requisito indispensable para que los productos de una determinada empresa puedan ser comer-
cializados tanto en el mercado interior como en el exterior. Pero mucho antes de que los codigos
de barras aparecieran, ya surgan investigaciones relacionadas con sistemas de codicacion de
informacion.
En 1932, Wallace Flint, un estudiante de la Universidad de Harvard, realizo un proyecto
nal de carrera (master thesis) que desarrollaba un sistema mediante el cual los clientes de un
supermercado podran marcar aquello que quisieran comprar en una serie de tarjetas perforadas,
8
2.3. Historia
que posteriormente se introduciran en una serie de lectores que activaran un sistema automatico
que les proporcionara aquello demandado.
Sin embargo la idea de codigo de barras conforme lo entendemos hoy en da nacio en 1948. En
ese a no Bernard Silver, un estudiante graduado del Instituto Drexel de Tecnologa de Filadela,
escucho por casualidad como el presidente de una cadena de supermercados le peda a uno de los
decanos que emprendiese una investigacion para desarrollar un sistema que permitiese la lectura
automatica de informacion de los productos durante el cobro de los mismos.
Silver conto lo que haba escuchado a su amigo Normand Joseph Woodland, que ejerca como
profesor en esa misma universidad. La idea le fascino y empezaron a investigar en el tema.
Despues de un a no de gran esfuerzo Woodland y Silver registraron en 1949 la primera patente
para un codigo de barras. El sistema que tena forma circular se denomino ((bulls eye code)) y
consista en una serie de crculos concentricos con el objetivo de que pudiera leerse en cualquier
direccion.
Tres a nos mas tarde, en 1952, construyeron el primer lector de codigos de barras, pero
lamentablemente el sistema no consiguio ser demasiado efectivo, al igual que resultaba caro,
por lo que no llego a comercializarse.
Los codigos de barras se emplearon por primera vez a principios de la decada de los 60 para
identicar material rodante ferroviario y de ah en adelante ha venido avanzando su aplicacion
y desarrollo. A nales de los a nos 60 y comienzos de los 70 aparecieron las primeras aplicaciones
industriales, pero solo para manejo de informacion.
Durante esos a nos la Asociacion Nacional de Cadenas Alimenticias (NAFC, de las siglas en
ingles) se dio cuenta que deban solucionar de una vez por todas los problemas que se presentaban
a la hora del cobro de sus productos. Por ello, en 1967, la cadena de supermercados Kroger instala
el primer sistema de venta basado en codigos de barras en su sucursal de Cincinnati (Ohio, EE.
UU.). El experimento presento una serie de problemas que sirvieron para la mejora del sistema
y de esta forma su posterior adaptacion a todos los productores y comerciantes del sector.
Durante los a nos 70 y primeros de los 80 se produjo la evolucion de los codigos lineales. Su
utilizacion se difunde a varios sectores utilizandose en muy distintas tareas, desde el control de
documentos en bibliotecas, hasta la identicacion y vericacion automatica en los bancos de
sangre.
En el a no 1973 se anuncia la aparicion del codigo UPC (Universal Product Code) que se
convertira en el estandar de identicacion de productos en los Estados Unidos. Como anecdota,
comentar que el primer producto escaneado en un punto de pago utilizando este codigo fue un
paquete de chicles, el cual se encuentra hoy en da expuesto en el Museo Nacional de Historia
Americana. En 1976, Europa desarrolla su propia version de UPC, el codigo EAN (European
Article Number), del cual se desarrollaran dos versiones: el EAN-13 y el EAN-8.
En 1974, se inventa el codigo 39, el primero de tipo alfanumerico y trece a nos mas tarde, en
1987, se desarrolla el primer codigo bidimensional, el codigo 49, primer codigo multilas que
aparecio en el mercado.
Poco a poco, durante los a nos 80 y 90, la tecnologa de identicacion y manejo de datos a
traves de codigos de barras, logra convertirse en un estandar al ser aplicada, cada vez con mas
frecuencia, tanto en operaciones de distribucion y manejo de materiales, como en organizaciones
de manufactura industrial, al igual que en todo tipo de nuevos ambitos. Durante los a nos 90
fueron apareciendo nuevos tipos de codigos y se desarrollaron sobretodo los codigos de alta
densidad o bidimensionales.
9
2. Codigos de barras
2.4. Ventajas e inconvenientes
La tecnologa de codigo de barras presenta una serie de ventajas sobre otros procedimientos
de coleccion de datos, estas son:
Se imprime con costes bajos.
Su precision en la informacion, evitando o reduciendo de esta forma los errores.
Su eciencia debido a la rapidez en la lectura, ahorrando tiempo y dinero.
La relativa exibilidad y facilidad de conexion e instalacion de los equipos de lectura e
impresion de codigo de barras.
Por contrapartida, no todo son ventajas, tambien presentan inconvenientes, como los que a
continuacion mencionamos:
En general los codigos de barra no son facilmente descifrables por las personas, necesitando
pues lectores que nos decodiquen la informacion.
La facilidad con la cual es posible dicultar la legibilidad de ciertos codigos, es decir,
simplemente con agregar una barra al inicio o nal del smbolo o trazar una lnea paralela a
las barras en cualquier lugar dentro del codigo, complica en gran manera su decodicacion.
2.5. Aplicaciones
Las aplicaciones del codigo de barras cubren practicamente cualquier tipo de actividad hu-
mana, lo podemos encontrar tanto en la industria, en el comercio, en instituciones guberna-
mentales, y en un sinn de areas, ya que cualquier sector puede beneciarse del uso de este
sistema de codicacion. Ademas, la tecnologa que conlleva ofrece una de las mejores maneras
de automatizar el manejo de informacion, ofreciendo un sistema de coleccion de datos mediante
identicacion automatica bastante rapido y seguro.
Cualquier sector donde se necesita un sistema para capturar informacion y as mejorar la
productividad, puede optar por utilizar codigos de barras. Algunas de las aplicaciones en las
que el uso del codigo de barras se muestra como una eleccion acertada son: control de material
en proceso, control de inventario, contro de tiempo y asistencia, puntos de venta, control de
calidad, bibliotecas, bancos de sangre, control de acceso, identicacion de carga, etc. Pero estas
son solo una parte de la gran variedad de aplicaciones en las que se pueden utilizar codigos de
barras como procedimiento de codicacion de datos.
En todas estas actividades el codigo de barras se presenta como una de las mejores tecnologas
para implementar un sistema de captacion de datos mediante identicacion automatica, presen-
tando una serie de benecios desde la mejora de la calidad y servicio al cliente hasta una mayor
competitividad.
2.6. Clases de codigos
La simbologa de un codigo de barras nos dene los detalles tecnicos de cada tipo particular
de codigo de barras, la anchura de las barras, la forma en que se codica la informacion en las
barras y espacios del smbolo de codigo de barras, etc.
Como hemos comentado anteriormente podemos distinguir entre codigos de una dimension y
c odigos de dos dimensiones. En los primeros, al efectuar la lectura, se tiene en cuenta el ancho
10
2.7. Dispositivos de escritura y lectura de codigos de barras
de las barras y los espacios entre ellas, en cambio la altura de las barras no otorga ning un dato.
En cierta forma estos codigos representan la clave para acceder a un registro de alguna base de
datos en donde realmente reside la informacion, o sea, los smbolos no contienen informacion del
producto o artculo, sino una clave unica que lo identica.
Por tanto la peque na capacidad de codicacion de estos codigos los hace depender de sistemas
de datos externos, sin el sistema externo el codigo no tiene signicado. La dependencia de
sistemas externos de datos ofrece dos importantes ventajas:
Proporciona la posibilidad de acceder a gran cantidad de informacion utilizando un codigo
y smbolo relativamente corto.
Permite cambiar los datos asociados a este sin tener que editar o modicar nuevamente el
codigo.
El otro tipo de codicacion que surgio no hace tantos a nos es la codicacion bidimensional,
dentro de la cual tenemos los llamados codigos de barras apilados o multilas (((stacked))) y los
codigos matriz (((matrix))). La principal ventaja de utilizar codigos de dos dimensiones es que
los datos estan codicados tanto en la altura como en la longitud del smbolo y la informacion
no se reduce solo al codigo del artculo, sino que puede almacenar gran cantidad informacion
que puede ser leda de manera rapida y able, sin necesidad de acceder a una base de datos en
donde se almacene dicha informacion, como ocurre en el caso de los codigos de una dimension.
Por el contrario, al contener mucha mas informacion que los codigos unidimensionales requieren
de un escaner especial cuyo coste es mas elevado.
La seguridad que son capaces de incorporar estos codigos los hace casi invulnerables a los posi-
bles agentes externos que pueden causar su deterioro, ya que este tipo de codigos han superado
innumerables pruebas de resistencia con el objetivo de determinar su integridad.
Los codigos bidimensionales deben ser considerados como un complemento a la tecnologa
tradicional de codigos unidimensionales, no como su reemplazo y las ventajas deben ser com-
paradas frente al incremento en coste. Por tanto, dependiendo del tipo de necesidades de iden-
ticacion interna del negocio o a los requisitos que se deben cumplir para comerciar seg un las
normas del mercado, se debe optar por un sistema de codicacion u otro.
Normalmente cuando la gente piensa en codigos de barras los suele relacionar con la tpica
simbologa de barras y espacios, por ello en la Figura 2.2 se muestran un par de codigos bidi-
mensionales como curiosidad, ya que estos suelen ser, dentro de los codigos de barras, los mas
desconocidos.
(a) (b)
Figura 2.2.: Codigos bidimensionales: (a) Codablock; (b) MaxiCode
2.7. Dispositivos de escritura y lectura de codigos de barras
Para poder imprimir los codigos de barras se nos presentan en el mercado distintos tipos de
impresoras que pueden llevar a cabo tal funcion. El empleo de una u otra dependera de lo que
11
2. Codigos de barras
el usuario requiera para cada caso en particular.
Los codigos de barras se pueden imprimir en impresoras laser o de chorro de tinta con las cuales
se puede conseguir codigos de barras de alta densidad y calidad, pero, por el contrario, tambien
presentan problemas al imprimir en cantidad, al igual que las etiquetas donde se imprimen los
codigos deben tener un adhesivo especial que tolere las altas temperaturas generadas por la
impresora. Ademas, la imagen en el codigo de barras se puede da nar facilmente, a menos que se
utilicen recubrimientos especiales en las etiquetas o bien laminarlas una vez que se ha impreso
el codigo.
Otra posibilidad es la impresion termica directa, metodo mas rapido y simple de gran aceptacion
en la industria y el comercio. El coste de las etiquetas termicas es mayor comparado con el de
las utilizadas para impresoras laser, pero sin embargo el coste del proceso global es menor. Por
tanto este tipo de impresion presenta una serie de ventajas como son su velocidad y calidad de
impresion, donde la imagen es duradera, al igual que es excelente para el trabajo por lotes. Por
el contrario tambien tiene inconvenientes como que requiere etiquetas de material especial y de
un tama no limitado y que la imagen puede deteriorarse en caso de exponerse a la luz solar o a
altas temperaturas.
Para obtener unos mejores resultados que en las anteriores impresoras es necesario usar una
impresora especca para etiquetas, una impresora de transferencia termica, capaz de impri-
mir, con gran velocidad y calidad, rollos de etiquetas autoadhesivas. Estos equipos suelen ser
los mejores para aplicaciones de mediano y alto volumen, ya que re unen las ventajas de las
impresoras laser y las termicas directas.
En la gura 2.3 se muestra un ejemplo de cada uno de los diferentes tipos de impresoras que
hemos comentado en este apartado.
(a) (b) (c)
Figura 2.3.: Impresoras de codigos de barras: (a) laser; (b) termica directa; (c) de transferencia
termica
Para poder obtener la informacion presente en un codigo de barras necesitamos de dispositivos
que decodiquen la informacion presente en el mismo, por ello los lectores de codigos de barras
nos permiten obtener esta informacion, de forma que pueda almacenarse en una computadora
para poder ser procesada.
Existen muchas opciones de conexion de lectores de codigos de barras a una computadora,
aunque existen dos tipos basicos: aquellos lectores que almacenan la informacion en memoria
para despues transferirla a una computadora y los lectores de radiofrecuencia que transmiten la
informacion a la computadora en tiempo real. En los primeros si la computadora central falla,
la recoleccion de datos puede continuar, al igual que si falla una lector en particular, este puede
ser reemplazado. Por su parte el segundo sistema presenta una vericacion de datos inmediata y
mas sosticada, con una interaccion con el usuario que consigue una mayor reduccion de errores.
El funcionamiento de los lectores de codigos de barras se podra explicar de la siguiente manera:
el lector decodica el codigo de barras a traves de la digitalizacion proveniente de una fuente
de luz que cruza el codigo y mide la intensidad de la luz reejada por los espacios blancos, ya
12
2.7. Dispositivos de escritura y lectura de codigos de barras
que las barras oscuras absorben la luz y los espacios la reejan. El patron de la luz reejada se
detecta a traves de un fotodiodo, el cual produce una se nal electrica que coincide exactamente
con el patron impreso del codigo de barras. Un decodicador usa algoritmos matematicos para
traducir los impulsos electricos en un codigo binario y transmite el mensaje decodicado a una
computadora como si la informacion hubiese sido introducida por teclado.
En cuanto a los lectores existe una gran variedad, pero podemos destacar cuatro que son los
principales:
1. Lectores tipo pluma o lapiz (wand):
El modo de uso es simple, el operador coloca la punta del lector en la zona blanca que
esta al inicio del codigo y lo desliza a traves del smbolo a velocidad e inclinacion constante
haciendo contacto a lo ancho del codigo, enviandose una se nal digital pura de las barras y
espacios a una frecuencia igual a la velocidad con que se desliza el lapiz.
Con este tipo de lector obtenemos una serie de ventajas como son su bajo precio y su
tama no reducido, por contra son susceptibles a cadas debido a su forma, pueden ser
necesarias varias pasadas para conseguir una lectura correcta, por lo tanto tiene un bajo
Fisrt Read Rate (FRR) y solo son practicos cuando se leen codigos impresos de gran calidad
colocados preferentemente en supercies duras, planas y horizontales.
2. Lectores CCD (Charge Coupled Device):
Son lectores de contacto que emplean un fotodetector CCD formado por una la de LEDs
que emite m ultiples fuentes de luz y forma un dispositivo similar al encontrado en las
camaras de vdeo, es decir, mediante un arreglo de foto diodos toma una ((foto)) del smbolo
de codigo de barras y la traduce a una se nal, que puede ser similar a la enviada por el laser
o a la del lapiz optico. Se requiere hacer contacto fsico con el codigo, pero a diferencia del
anterior no hay movimiento que degrade la imagen al escanearla.
Algunas de las ventajas que presenta son su rapidez de lectura, es bastante duradero por
no tener partes moviles, tiene un alto First Read Rate (FRR) y es economico. Sin embargo
no todo son ventajas ya que requiere estar muy cerca del codigo (01.5 cm) y no puede
leer smbolos que rebasen el ancho de su ventana.
3. Lectores laser tipo pistola:
Realiza un barrido mediante una luz laser que genera una se nal similar a la del lapiz
optico, pero a una mayor frecuencia. Esta se nal es conocida como HHLC (Hand Held
Laser Compatible). Un espejo rotatorio u oscilatorio dentro del equipo mueve el haz de
un lado a otro a traves del codigo de barras, de modo que no se requiere movimiento por
parte del operador, este solo debe apuntar y disparar. Ademas usan un mecanismo para
prevenir la lectura accidental de otros codigos dentro de su distancia de trabajo.
Presenta las siguientes ventajas: rapido, tiene un alto First Read Rate (FRR), puede leer
codigos estropeados o mal impresos y puede leer a distancia, desde unos pocos centmetros
a varios metros.
Las desventajes son: puede tener problemas para leer con demasiada luz ambiental, es
relativamente caro y puede presentar problemas de durabilidad debido a sus partes moviles.
4. Lectores laser jos omnidireccionales:
Se encuentran normalmente en las cajas registradoras de supermercados. El haz de laser se
hace pasar por un conjunto de espejos que generan un patron ominidireccional, otorgando
as la posibilidad de pasar el codigo en cualquier direccion, sin importar la orientacion del
13
2. Codigos de barras
mismo. Los productos a leer se deben poder manipular y pasar a mano frente al lector.
Son recomendables cuando se requiere una alta tasa de lectura.
Las ventajas que se obtienen con este tipo de lector son las mismas ventajas que con el
laser de pistola, ademas de presentar un First Read Rate (FRR) de practicamente el 100 %.
En contrapartida es un lector caro y el operador que lo utilice requiere que los artculos
etiquetados no sean muy voluminosos pues el escaner se monta en posicion ja.
En la Figura 2.4 se muestra un lector de cada uno de los diferentes tipos que hemos mencionado
anteriormente.
(a) (b) (c) (d)
Figura 2.4.: Lectores de codigos de barras: (a) tipo pluma o lapiz; (b) lector CCD; (c) laser tipo
pistola; (d) laser omnidireccional
14
3. Deteccion de bordes
3.1. Tecnicas de localizacion de codigos de barras
Existen distintas tecnicas para identicar donde se encuentra un codigo de barras dentro de
una imagen [28]:
Algoritmo Morfologico Matematico: Metodo de localizacion basado en operaciones
morfologicas basicas como: dilatacion, erosion, cierre y un conjunto de operaciones mor-
fologicas geodesicas. El algoritmo se basa en el hecho que los codigos de barras poseen
((valles estrechos)) (espacios estrechos existentes entre las barras), un alto contraste y lneas
paralelas. Mediante una segmentacion, estos valles se juntan para formar una region que
corresponde al codigo de barras, descartando peque nas areas que no pertenecen al codigo,
para a continuacion aplicar ltros morfologicos en diferentes orientaciones con el n de
extraer la orientacion del codigo de barras.
Analisis de texturas mediante ltros de Gabor: La idea fundamental sobre la que
se basa este metodo es asumir que un codigo de barras es una region con una textura
homogenea. Ademas en una imagen donde se encuentra presente la textura, el nivel de
gris de los pixels individuales no proporcionan suciente informacion para llevar a cabo
una segmentacion satisfactoria de la imagen, por ello se hace necesario incluir las relaciones
espaciales existentes entre los niveles de gris de los pixels dentro de una vecindad local.
Deteccion de texto en las imagenes: Otra idea para la localizacion de codigos de barras
es utilizar tecnicas provenientes de los algoritmos de b usqueda de texto, sin embargo este
tipo de metodos presentan como inconveniente que suelen consumir mucho tiempo.
Densidad de Gradiente: Otro metodo de localizacion de codigos de barras es el basado
en la extraccion de areas que poseen una alta densidad de gradientes mono-orientados.
La localizacion de codigos de barras en una imagen con baja resolucion es el principal
proposito de este algoritmo, que utiliza para tal objetivo el calculo de gradientes y ltros
morfologicos.
En nuestro metodo, la idea en la que nos basamos para la localizacion del codigo de barras,
es muy similar a la presente en la ultima tecnica mencionada. Aunque debemos recalcar que
el conocimiento sobre estas tecnicas no se produjo hasta bastante mas tarde del comienzo de
este proyecto. Simplemente, el descubrir que existan y conocer en que se basan, sobretodo esta
ultima, nos llevo a pensar que no ibamos mal encaminados en cuanto a la manera en que se
detecta y localiza el codigo de barras en nuestro proyecto.
Por tanto, el objetivo nal que perseguimos es conseguir la decodicacion del codigo de barras,
para lo cual un paso esencial es la localizacion dentro de la imagen del codigo en cuestion.
La idea fundamental que se ha seguido para conseguir esta tarea ha sido que los codigos de
barras presentan unas caractersticas que permiten su localizacion basandonos en el metodo de
la deteccion de bordes, ya que cada uno de los puntos de borde que conforman el codigo de
barras ((supuestamente)) presentaran una orientacion similar y por tanto, seran susceptibles de
ser clasicados como puntos de la imagen con una alta probabilidad de contener el codigo de
barras pretendido.
15
3. Deteccion de bordes
3.2. Detector de bordes de Canny
Un concepto relacionado con la extraccion de bordes es el de la primera derivada, ya que esta
es cero en todas las regiones donde no vara la intensidad y tiene un valor constante en toda la
transicion de intensidad. Por tanto un cambio de intensidad se maniesta como un cambio brusco
en la primera derivada [24], caracterstica esta que puede utilizarse para detectar la presencia
de un borde.
Uno de los operadores basados en la primera derivada para la deteccion de bordes es el
algoritmo de Canny, que consiste en tres grandes pasos [24]:
Obtencion del gradiente (magnitud y orientacion del vector gradiente en cada pxel).
Supresi on no maxima o adelgazamiento del ancho de los bordes, obtenidos con el gra-
diente, hasta lograr bordes de un pxel de ancho.
Histeresis de umbral al resultado de la supresion no maxima, con este proceso se pre-
tende reducir la posibilidad de aparicion de falsos contornos.
Por tanto, en primer lugar a la imagen se le aplica un ltro gaussiano, para suavizar la imagen
y tratar de conseguir la eliminacion del posible ruido que afecte a la misma. Sin embargo hay
que ir con cuidado para no realizar un suavizado excesivo de la imagen y perder detalles o
caractersticas de interes, provocando de esta forma un peor resultado.
A continuacion se realiza el calculo del gradiente de la imagen suavizada, utilizando para ello
una aproximacion del gradiente de la funcion Gaussiana.
La imagen correspondiente a la magnitud del gradiente de la funcion gaussiana tendra valores
grandes donde la variacion de la intensidad sea grande. Por esta razon se debe eliminar aquellos
pixels que no tienen una magnitud alta utilizando para ello un cierto umbral.
Posteriormente se realiza un proceso de eliminacion de falsos bordes, conjuntamente a un
realzado de bordes poco denidos. Este proceso se consigue eliminando aquellos pixels que no
son maximos locales.
Un punto a tener en cuenta es la eleccion de los valores de las variables que se aplican en
cada uno de los pasos anteriores, ya sea el valor de los umbrales o de la varianza en los ltros
gaussianos por ejemplo, ya que seg un estos valores los resultados pueden ser mejores o peores.
Los valores que se han tomado denitivamente para estos parametros se muestran mas adelante,
en el captulo 8.
En resumen, la deteccion de bordes usando operadores de aproximacion del gradiente tiende a
funcionar bien en los casos en que se utilizan imagenes con transiciones de intensidad claramente
denidas y ruidos relativamente bajos [24].
El algoritmo de Canny para la deteccion de bordes se explica con mas detalle en el apendice A.
3.3. Ejemplo
Previamente a la utilizacion del algoritmo de Canny para la deteccion de bordes se probo con
otros operadores como los de Sobel, pero el resultado que se obtena era bastante peor que
con el primero. Al aplicar el ltro de Sobel, para conseguir el gradiente y posteriormente su
magnitud y orientacion, el resultado que se obtena se vea afectado por el ruido que presentaba
la imagen. Por este motivo se penso en aplicar previamente un ltro media o mediana para
suavizar la imagen y as obtener mejores resultados, pero la imagen tenda a emborronarse
en vez de suavizarse. Otra opcion que se hubiese podido aplicar es la utilizacion de un ltro
Gaussiano previamente al ltro de Sobel, sin embargo esta posibilidad no se probo, ya que
directamente enfocamos nuestra atencion hacia el detector de bordes de Canny.
16
3.3. Ejemplo
Un ejemplo de los resultados que se obtienen al aplicar el algoritmo de Canny se puede observar
en la Figura 3.1:
(a) (b)
(c) (d)
Figura 3.1.: Resultado de aplicar el detector de bordes de Canny: (a) imagen original; (b) orien-
tacion; (c) supresion no maxima; (d) histeresis de umbral
17
3. Deteccion de bordes
18
4. Deteccion de regiones candidatas
4.1. Idea general
Una idea que manejamos a la hora de detectar el codigo de barras dentro de la imagen es que
((supuestamente)) los pixels que forman parte del codigo van a tener una orientacion similar o
muy parecida, por ello se pretende extender la orientacion de los puntos de borde de la zona
donde se encuentra el codigo a los puntos de esta que no lo son, creando as una region de
orientacion similar que podra seleccionarse como region que contiene el codigo. Los puntos de
borde representan la separacion entre los espacios y las barras del codigo, por este motivo se
pretende extender la orientacion de estos puntos a aquellos puntos que no son borde y en los
cuales no tenemos nada. De esta forma se consigue una zona amplia con orientacion similar
donde se encuentra el codigo de barras.
Con este n, una vez hemos conseguido el valor de la orientacion del gradiente de intensidad
para cada uno de los pixels de la imagen, operacion realizada en el paso anterior, se prosigue el
proceso realizando un analisis multiresolucion de la imagen. Con esta operacion vamos a obtener
una piramide de imagenes donde cada imagen que precede a otra siempre sera de mayor tama no,
es decir, se van consiguiendo imagenes de menor tama no. Pero esta operacion no solo conlleva
una reduccion del tama no de la imagen progresivamente, sino que se pretende, como hemos
comentado, conseguir extender la orientacion de manera que podamos seleccionar una region de
la imagen como posible zona donde se encuentra el codigo de barras por poseer, localmente, un
valor de orientacion com un.
4.2. Procedimiento
El proceso que se sigue es el siguiente: se divide el tama no de la imagen por dos, reduciendo
este hasta alcanzar un determinado tama no, por tanto cuatro pixels de la imagen en un cierto
nivel pasaran a ser uno en la imagen de nivel posterior. A partir del valor de la orientacion de
estos cuatros pixels se calcula la media, pero solo participan en esta operacion los pixels que
pertenezcan a un punto de borde. As, el pixel en la imagen reducida tomara un valor para la
orientacion que sera la media de los pixels de los que proviene, que seran aquellos que son puntos
de borde.
Ademas, si los cuatro pixels no pertenecen a ning un punto de borde, entonces el nuevo pixel
que se obtiene se etiqueta como ((no-borde)), de forma que nos va a servir para descartar zonas
donde no hay ning un punto de borde y por tanto es poco probable que el codigo de barras se
encuentre en ellas.
Por tanto, si partimos de una imagen I iremos cogiendo 4 pixels de la siguiente forma:
I(i, j) I(i + 1, j)
I(i, j + 1) I(i + 1, j + 1)
A partir de estos pixels se toman aquellos que son bordes y se realiza una media.

I =

(i,j)N
I(i, j)
19
4. Deteccion de regiones candidatas
siendo N el conjunto de pixels que son borde dentro de la vecindad considerada.
El procedimiento implementado se muestra en el Algoritmo 1 en pseudo-codigo para una
mejor comprension de los pasos realizados. Nos aparece en el mismo la funcion Vecindad() que
nos devuelve el conjunto de pixels vecinos de un determinado punto seg un la vecindad indicada.
Ademas esta funcion ya tiene en cuenta no acceder a puntos de fuera de la imagen. Esta funcion
tambien sera usada en algoritmos que aparecen mas adelante.
Algoritmo 1 Agrupamiento de la orientacion seg un la vecindad
Entrada: La imagen O de la orientacion de tama no M N, la imagen E de bordes de tama no
M N y la vecindad V
x
V
y
utilizada
Salida: La imagen S de tama no
M
V
x

M
V
y
1: for x 1 to M with step V
x
do
2: for y 1 to N with step V
y
do
3: numbordes 0
4: Suma 0
5: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
6: if E(i, j) = 1 then
7: numbordes numbordes + 1
8: Suma Suma +O(i, j)
9: if numbordes = 0 then
10: S(
x
V
x
,
y
V
y
) ((no-borde))
11: else
12: S(
x
V
x
,
y
V
y
)
Suma
numbordes
Debemos se nalar que este algoritmo se utiliza solo para el primer nivel, es decir, cuando
partimos de la imagen de la orientacion obtenida en el punto anterior. A partir de entonces el
algoritmo a utilizar es muy similar a este, simplemente cambia que la entrada sera la imagen de
salida del Algoritmo 1 y por tanto en vez de quedarnos con aquellos puntos que son bordes nos
quedaremos con aquellos que no esten etiquetados como ((no-borde)). El resto del funcionamiento
del algoritmo es el mismo.
Una vez hemos obtenido la ultima imagen del escalado, es decir, hemos llegado al ultimo nivel
L, realizamos ahora el proceso inverso, es decir, si hemos subido en la piramide de imagenes vamos
ahora a bajar, de forma que un pxel extendera su valor a los cuatro pixels de los que provena.
Con este proceso se pretende extender, en la zona donde se encuentra el codigo, la orientacion
de los pixels que eran bordes a aquellos que no lo eran, todo ello para intentar homogeneizar la
orientacion en nuestra region de interes y as, de esta forma, poder posteriormente elegir todos
estos pixels como posible zona donde pueda encontrarse el codigo de barras. El procedimiento
utilizado se describe en el Algoritmo 2.
Algoritmo 2 Reconstruccion para extender la orientacion
Entrada: Imagen I de tama no M N y la vecindad V
x
V
y
utilizada
Salida: Imagen S de tama no (M V
x
) (N V
y
)
1: for x 1 to M do
2: for y 1 to N do
3: i x V
x
4: j y V
y
5: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
6: S(i, j) I(x, y)
20
4.3. Ejemplo
Sin embargo, despues de realizar esta operacion, es decir, subir y bajar en la piramide de
imagenes, la zona donde se encontraba el codigo no presentaba esa homogeneidad que se pre-
tenda y todava exista demasiada variacion dentro de la zona en cuestion.
Por tanto se penso que para este proceso se podra coger una division mayor y en vez de
un conjunto de 2 2 pixels de los que pasamos a uno, realizarlo de 3 3 o superior, pero los
resultados tendan a ser peores, es decir, cuanto mas grande es la vecindad que cogemos para
reducir, los resultados empeoran, de forma que la homogeneizacion, en cuanto al valor de la
orientacion de la zona donde se encuentra el codigo, es peor.
Esto puede ser debido a que al coger mas puntos para realizar la media, en la zona proxima al
codigo estamos cogiendo un n umero mayor de pixels que son puntos de borde y que no pertenecen
al codigo y cuyo valor afecta de manera negativa a la hora de calcular la orientacion. De alguna
manera estamos provocando el proceso contrario al pretendido, ya que el valor de la orientacion
de los puntos de borde de la frontera exterior al codigo y que no pertenecen al codigo de barras,
dominan a los puntos de borde de dentro del codigo, provocando que su orientacion se extienda
hacia dentro del codigo y reduciendo as la region donde se encuentra este.
Otra opcion con la que los resultados que se obtuvieran podran ser mejores, era la posibilidad
de utilizar la mediana y no la media, por su mayor robustez estadstica. Al cambiar la media por
esta operacion empezamos a conseguir lo que se pretenda, debido, seguramente, a que la media
se poda ver afectada, a la hora de realizarse la operacion, por un valor muy alto en cuanto al
resto de valores o viceversa.
4.3. Ejemplo
Por tanto con este nuevo paso los resultados que se consiguieron eran los deseados. En la
Figura 4.1 podemos observar un ejemplo de las imagenes que se obtienen en este nuevo proceso,
tanto cuando subimos en la piramide, como cuando bajamos.
21
4. Deteccion de regiones candidatas
(a) (b)
Figura 4.1.: Deteccion de regiones candidatas: (a) resultado del proceso cuando subimos; (b)
resultado del proceso cuando bajamos
22
5. Etiquetado y ltrado de regiones
5.1. Etiquetado de componentes conexas
Una vez realizado el paso anterior, debamos pensar una forma de poder discriminar el conjunto
de pixels que no nos proporcionan informacion relevante y quedarnos solo con aquellos que nos
interesan por contener la region de la imagen donde supuestamente se encuentra el codigo que
se pretende detectar.
En busca de este objetivo se penso en utilizar algoritmos de etiquetado de componentes
conexas, cuya idea basicamente consiste en agrupar pixels de una misma region dentro de la
imagen, para lo cual les asigna la misma etiqueta a cada uno de ellos. Simplemente se presentaba
un problema y es que la imagen a partir de la cual se aplican estos algoritmos debe ser binaria.
Por ello debamos binarizar, de alguna forma, el resultado obtenido en el proceso anterior, para
poder despues aplicar el algoritmo de componentes conexas.
El concepto de componentes conexas es el siguiente: todos los pixels que tienen un mismo
valor binario 1 y estan conectados entre s (usando 4-conectividad u 8-conectividad) por un
camino o conjunto de pixels todos con ese mismo valor binario se les asigna una misma etiqueta
identicativa, que debe ser unica de la region a la cual pertenecen los pixels y constituye su
identicador [24].
5.2. Procedimiento
Con el n de obtener la binarizacion deseada se penso en la siguiente idea: cuando ((subimos)) en
la piramide, como comentamos en el punto anterior, estamos intentando que la zona de la imagen
donde se encuentra el codigo de barras se homogeinice, en cuanto al valor de la orientacion, y
as, posteriormente, poder elegir todos estos pixels, con valor similar, como posible zona donde
se encuentra un codigo de barras. Sin embargo, ahora cuando ((bajamos)), en lugar de extender
la orientacion a los distintos pixels seg un la division implementada, podemos aprovechar para
binarizar y realizar a continuacion su correspondiente expansion.
Por tanto una vez hemos llegado al ultimo nivel (el mas alto de la piramide) nos disponemos
a binarizar dicha imagen siguiendo el siguiente criterio: si la mitad de los pixels de la vecindad
elegida para la division son parecidos o similares entre s, es decir, no distan mucho en cuanto al
valor de la orientacion, seg un un umbral predeterminado, entonces todos los pixels de la vecindad
tendran el valor binario ((1)), si no es as seran ((0)), al igual que si mas de la mitad de los pixels son
puntos etiquetados como ((no-bordes)), tambien toman el valor ((0)). Una vez tenemos la imagen
binarizada, simplemente se trata a continuacion de extender esta binarizacion hasta el nivel
inicial, el cual se corresponde a una imagen de tama no igual al de la imagen original. El proceso
de binarizacion se puede observar en el Algoritmo 3 y el proceso de extender la orientacion es
similar al que aparece en el Algoritmo 2. En el Algoritmo 3 aparece la funcion RelPixels() que
simplemente se encarga de ver la relacion existente entre los pixels de la vecindad elegida y,
seg un el umbral determinado, devolver una cantidad que nos indica el n umero de pixels que son
similares entre s.
Se probo un poco con todas las posibles variables que nos dan juego a la hora de realizar este
proceso, para ver cuales son las condiciones con las cuales se obtienen los mejores resultados.
23
5. Etiquetado y ltrado de regiones
Algoritmo 3 Binarizacion de un determinado nivel l de la piramide
Entrada: Una imagen O
l
de tama no M N, la vecindad V
x
V
y
y un umbral U
Salida: Una imagen binaria S de tama no M N
1: mitad (V x V y)/2
2: for x 1 to M with step V
x
do
3: for y 1 to N with step V
y
do
4: num 0
5: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
6: if I(i, j) = ((no-borde)) then
7: V ect[num] O
l
(i, j)
8: num num+ 1
9: if num < mitad then
10: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
11: S(i, j) 0
12: else
13: n RelPixels(V ect, U)
14: if n > mitad then
15: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
16: S(i, j) 1
17: else
18: for all (i, j) Vecindad(x, y, V
x
, V
y
) do
19: S(i, j) 0
Se realizaron pruebas con diferentes tama nos en cuanto a las operaciones de agrupamiento de
los pixels vecinos 3 3, 5 5, etc., al igual que se probo a realizar el proceso de binarizacion
no desde el ultimo nivel sino desde cualquier otro de los calculados. Despues de varias pruebas
se pudo comprobar que utilizar una vecindad de 2 2 es la mejor opcion, al igual que realizar
la binarizacion a partir, no desde el ultimo nivel, sino desde dos niveles menos. Ademas, otra
conclusion que se obtuvo despues de probar distintas opciones, es que el nivel desde el cual es
mejor empezar a binarizar depende del tama no del codigo de barras con respecto al tama no de
la imagen, algo que, en nuestro caso asumimos, por su simplicidad, como constante.
Una vez obtenida la imagen binarizada del mismo tama no que la imagen inicial, una compro-
bacion para asegurarnos que vamos por el camino acertado, no a nivel del algoritmo, sino como
comprobacion visual nuestra, es superponer a la imagen original esta imagen binarizada, para
ver que conjunto de pixels se estan eligiendo, es decir, aquellos pixels que son la zona donde
supuestamente esta el codigo. De esta manera se puede ver si el codigo de barras esta dentro de
alguna de las regiones que detectaremos con los algoritmos antes mencionados. El resultado de
esta operacion se puede ver en la Figura 5.1, donde las regiones obtenidas se superponen a la
imagen original que nos aparece en la Figura 3.1 (a).
Como hemos comentado, si cambiamos las opciones elegidas para realizar el proceso, el tama no
de la vecindad con el que operar y el nivel a partir del cual binarizar, los resultados son bastante
peores como se puede observar en la Figura 5.2.
El algoritmo de etiquetado de componentes conexas que utilizamos es el que se denomina algo-
ritmo clasico [24] (Apendice B). Este algoritmo realiza solo dos pasadas a la imagen, necesitando
para todo el proceso mantener una tabla de equivalencias de etiquetas.
El resultado del algoritmo se muestra en la Figura 5.3, donde las regiones obtenidas se han
coloreado para que se observe mejor el resultado.
Por tanto, una vez aplicado el algoritmo a nuestra imagen, solo falta, para nalizar, descartar
24
5.3. Resultados
Figura 5.1.: Imagen original con la mascara correspondiente a las regiones candidatas
(a) m = 2, L

= L (b) m = 3, L

= L 2 (c) m = 5, L

= L 1
Figura 5.2.: Distintas imagenes obtenidas seg un la vecindad, de tama no m, y el nivel L

desde
el cual binarizar siendo L el ultimo nivel de la piramide: (a) resultado obtenido con
una vecindad 2 2 y binarizando a partir del ultimo nivel; (b) resultado obtenido
con una vecindad 33 y binarizando a partir del nivel L2; (c) resultado obtenido
con una vecindad 5 5 y binarizando a partir del nivel L 1
aquellas regiones que no nos interesan y quedarnos con la que contiene el codigo de barras. Por
ello, en nuestro caso, nos quedaremos con la region con mayor n umero de pixels, que sera, con
gran probabilidad, la region con mas posibilidades de contener la zona donde se encuentra el
codigo de barras.
5.3. Resultados
A continuacion mostraremos un conjunto de imagenes con el resultado obtenido al aplicar el
algoritmo de etiquetado de componentes conexas y quedarnos con aquella region con un mayor
n umero de pixels. De esta forma se podra observar en que casos el proceso funciona, en cuales no
es exacto y que factores afectan al mismo. Antes de todo recalcar que el algoritmo en un principio
se usaba para una 4-conectividad, pero se modico para utilizar una mayor conectividad, ya que
de esta manera los resultados eran mejores.
En la Figura 5.5 podemos observar que tanto en la imagen (a) como en la (b) el resultado
es bastante bueno, aunque no se incluyan unos pocos puntos del codigo dentro de la region.
En la imagen (c) el codigo de barras previamente fue modicado manualmente, dibujando una
lnea al principio y otra al nal del mismo para ver que resultado obtenamos. Como se puede
25
5. Etiquetado y ltrado de regiones
Figura 5.3.: Resultado del algoritmo de etiquetado de componentes conexas
Figura 5.4.: La region de mayor tama no de la Figura 5.3, hemos descartado las regiones que no
nos interesan y nos hemos quedado con la region que contiene un mayor n umero de
pixels
observar, la region obtenida despues de realizar el proceso incluye estas dos falsas barras, como
es logico, ya que el proceso las considera como propias del codigo. Este caracterstica de los
codigos de barras, la facilidad con la cual es posible da narlos, conlleva la consiguiente dicultad
para los lectores que intenten descifrar dicho codigo. Pero esto ocurre tambien con otros tipos
de codicacion, por ejemplo, caracteres normales, los cuales si son da nados se diculta, en gran
medida, su legibilidad.
En la Figura 5.6 podemos ver tres diferentes imagenes del mismo codigo de barras, pero en
cada una de ellas el codigo se ha visto afectado por distintos factores que provocan el deterioro
del mismo. Como se observa aunque el codigo esta rayado, como en (a) o en (b), o incluso
emborronado, como en (c), la region que determina la zona donde se encuentra el codigo es
bastante acertada y no aparecen muchos huecos dentro de la misma. Esto es debido a que las
supuestas ((manchas)) que contiene el codigo, no tienen un trazo muy intenso con lo que no
afectan en gran medida al proceso, cosa muy diferente sera si fueran mas intensas, mas oscuras,
como en los siguientes ejemplos.
En la Figura 5.7 vemos como en las imagenes (a) y (b), el ruido provocado por unas rayas de
26
5.3. Resultados
(a) (b) (c)
Figura 5.5.: Resultado del proceso de localizacion ante un codigo de barras: (a,b) no da nado; (c)
al que se le ha dibujado una barra al principio y otra al nal
(a) (b) (c)
Figura 5.6.: Diversas imagenes de un mismo codigo de barras da nado por una serie de factores:
(a) da nado con una sola lnea; (b) afectado por mas de una lnea; (c) emborronado
trazo mas intenso que en la Figura 5.6, s que afectan en mayor medida al proceso, provocando
que la region que contiene el codigo no sea todo lo exacta que se precisa y dicultando su posterior
decodicacion. En la imagen (c) se han complicado todava mas las cosas, incluyendo ademas de
las rayas un elemento metalico (((clip))) encima del codigo para comprobar as el funcionamiento
del proceso ante tal situacion. Como era logico la region que se obtiene descarta la zona del
codigo donde se encuentra el ((clip)), ademas de los puntos donde se encuentran las manchas, con
lo cual es muy poco probable que esta region nos pueda llevar a una posible decodicacion con
exito.
27
5. Etiquetado y ltrado de regiones
(a) (b) (c)
Figura 5.7.: Resultado del proceso de deteccion del codigo de barras ante diversas situaciones:
(a) codigo de barras rayado; (b) el mismo codigo que en la imagen anterior, pero al
que se le han a nadido mas modicaciones; (c) misma imagen que la anterior, pero
a nadiendo un elemento ajeno al codigo de barras sobre el
(a) (b) (c)
Figura 5.8.: Conjunto de imagenes a las que se les ha aplicado una transformacion geometrica:
(a) rotacion de 30

; (b) espiral de 45

; (c) espiral de 100

Para una mayor comprobacion, en cuanto al buen funcionamiento de este proceso, se ha


transformado una imagen digitalmente para ver que ocurre cuando introducimos alg un tipo de
transformacion geometrica en la misma, esto se observa en la Figura 5.8. En la imagen (a) se
ha aplicado una rotacion con un cierto angulo, de esta forma en la imagen aparece ademas
del propio codigo a decodicar, un trozo del mismo en una esquina. La region que obtenemos
contiene tanto el codigo, como el trozo que aparece en la esquina inferior. Esto es debido a la
forma en que agrupamos los pixels con una orientacion parecida seg un un cierto umbral. Como
28
5.3. Resultados
vemos esto tiene sus ventajas a la hora de capturar la zona donde se encuentra el codigo, como
se observa en la imagen (b) y (c), pero por el contrario provoca que aquellas partes de la imagen
donde la orientacion es muy similar, y que no pertenezcan al propio codigo de barras, tambien
se puedan elegir como posible zona donde se encuentre este.
En la imagen (b) y (c) la transformacion geometrica realizada ha sido la misma en ambas, una
especie de remolino o espiral (((swirl))), pero utilizando angulos distintos. Aunque parezca difcil,
obtenemos unas regiones que contienen el codigo de barras con bastante exactitud, sin embargo
la decodicacion en nuestro caso es imposible. Para poder decodicar el codigo deberamos ir
calculando las distintas orientaciones que el codigo presenta desde la primera barra hasta la
ultima, para as poder ir recticando el codigo con el angulo adecuado en cada momento y
conseguir as su decodicacion.
Despues de poder observar todos estos ejemplos parece que el proceso se comporta bastante
bien, siempre y cuando el codigo no se vea afectado, en gran medida, por alg un tipo de ruido,
como manchas o rayas presentes en el codigo. Ademas incluso aquellas imagenes en las que se
les ha aplicado una transformacion geometrica, la zona donde se encuentra el codigo se detecta,
aunque su posterior decodicacion se complicara, y no se aborda en este proyecto.
Deberamos comentar que se intentaron capturar imagenes que sufrieran alg un tipo de defor-
macion geometrica natural, realista, como puede ser que la hoja donde se encuentre impreso el
codigo de barras este doblada por ejemplo. El proceso de localizacion creemos que igual fun-
cionara en estos casos, el problema de no poder tener imagenes para comprobarlo ha sido por
culpa del enfoque. La imagen del codigo de barras, si tenamos doblada la hoja, presentaba zonas
donde era difcil enfocar y obtener resultados ntidos.
Tambien pudimos comprobar que algunas pruebas en las que el codigo no presentaba ninguna
raya ni mancha el resultado obtenido no era el deseado. Esto es debido a que el proceso se ve
bastante afectado por la calidad de la imagen, por lo que algunas mejoras para incrementar la
robustez del metodo pasaran, posiblemente, por realizar alg un tipo de preproceso de la imagen
con el objetivo de evitar esta dependencia.
29
5. Etiquetado y ltrado de regiones
30
6. Estimacion de la orientacion y recticacion
6.1. Idea general
Todos los pasos realizados hasta este instante nos han permitido poder localizar la region de
la imagen donde se encuentra el codigo de barras. Como es obvio, el codigo de barras puede estar
en cualquier posicion dentro de la imagen, al igual que puede presentar cualquier orientacion, lo
que diculta su localizacion.
Por tanto, debemos calcular la orientacion que presentan los puntos de borde que contiene
la region susceptible de contener al codigo y que hemos obtenido en el paso anterior. Una vez
conocida esta orientacion simplemente debemos recticar la imagen y conseguir a continuacion
una imagen que solo contenga el codigo. Esta subimagen sera binarizada para su posterior
decodicacion.
6.2. Procedimiento
El procedimiento utilizado para averiguar el angulo que debemos aplicar en la rotacion de
la imagen y que de esta manera se nos quede en sentido horizontal, es decir, con las barras
verticales, ha sido el siguiente: de todos los puntos de borde que se encuentran en la region que se
ha seleccionado, que es donde se encuentra el codigo, nos quedamos con el valor de la orientacion
de cada uno de ellos y calculamos la mediana para conseguir el valor mas representativo de la
orientacion en esa zona. Se calcula la mediana en vez de la media, ya que esta primera resulta
ser mas robusta.
Una vez obtenemos la orientacion que representa a todo el conjunto de puntos que conforman
la zona donde se encuentra el codigo, simplemente tenemos que utilizarla para rotar la imagen
original una cantidad igual al angulo estimado.
(a) (b) (c)
Figura 6.1.: Rotaciones con la orientacion estimada usando la mediana: (a) imagen original; (b)
imagen original rotada; (c) region donde hemos estimado que se encuentra el codigo
Una vez realizada la rotacion, lo que se pretende es obtener una imagen de tama no igual a la
caja de mnima inclusion [13] que contiene el trozo de imagen original rotada que se corresponde
31
6. Estimacion de la orientacion y recticacion
al codigo de barras. Para ello debemos basarnos en la region obtenida en el paso anterior y en la
imagen original rotada, siendo el resultado el que se muestra en la imagen (a) de la Figura 6.2.
Una vez obtenida esta nueva imagen, solo nos queda binarizarla para facilitarnos su posterior
decodicacion. Con el objetivo de obtener una mejor binarizacion realizaremos una ecualizacion
del histograma [12] que nos permitira conseguir un mayor constraste entre las barras negras y
los espacios como se puede observar en la imagen (b) de la Figura 6.2.
(a) (b)
Figura 6.2.: Caja de mnima inclusion que incluye la region donde hemos determinado que se
encuentra el codigo: (a) antes de la ecualizacion del histograma; (b) despues de la
ecualizacion del histograma
Para la obtencion del umbral a partir del cual realizar la binarizacion existen diversos metodos
automaticos de b usqueda de este [11], como el algoritmo de Otsu [8], que es el empleado en
nuestro caso. El umbral que se obtiene con este metodo se considera aquel punto que parte los
pixels de una imagen en dos clases de niveles de gris C
0
= {0, 1, . . . , t} y C
1
= {t+1, t+2, . . . , L},
siendo L el valor maximo de niveles de gris y t el umbral optimo que maximiza la separabilidad
de estas dos clases. El metodo se explica con mas detalle en el Apendice C.
De esta manera, el resultado que se obtiene despues de la binarizacion, utilizando como umbral
el obtenido con el algoritmo de Otsu, es el que aparece en la Figura 6.3.
Figura 6.3.: Binarizacion utilizando el algoritmo de Otsu
Tanto la ecualizacion del histograma como la b usqueda automatica del umbral, mejoran los
resultados de la binarizacion, ya que en un primer momento no usabamos estas tecnicas, siendo
ademas el umbral un valor jo, con lo cual se obtenan unos resultados bastante peores. Esto se
podra comprobar, con mayor detalle, en el siguiente captulo.
32
7. Decodicacion
7.1. Introduccion
Durante la fase de decodicacion surgieron bastantes problemas que nos hicieron pensar que
la decodicacion no es un proceso tan trivial como en un principio pueda parecer, una vez
conseguida la localizacion del codigo dentro de la imagen.
Mientras se pensaba en un procedimiento que nos permitiese decodicar el codigo obtenido
en las fases anteriores, surgio la idea de utilizar tecnicas relacionadas con el reconocimiento del
habla. Dentro de estas tecnicas encontramos los modelos de Markov [25], que a base de entre-
namiento consiguen identicar palabras de una frase analizando los fonemas que las caracterizan.
Sin embargo dominar esta tecnica requiere de mucho tiempo, ademas una vez determinados los
automatas que conforman el modelo se necesita de un aprendizaje, con el consiguiente gasto de
tiempo que ello conlleva y sobretodo, no se tena la certeza de que fuera a funcionar en nuestro
caso. Debido a estas razones, y a la limitacion del tiempo que tenamos para la realizacion de
nuestro proyecto, se descarto su uso.
Otra tecnica relacionada con la anterior es la tecnica DTW (Dynamic Time Warping) [23, 15].
Este metodo intenta el reconocimiemto de palabras conectadas en una frase, pero al contrario
que en los modelos de Markov no requiere de entrenamiento. Llego a implementarse un algoritmo
representativo de esta tecnica, pero adaptado a nuestro caso en particular, es decir, en vez de
conseguir descifrar palabras dentro de una frase intentamos descifrar dgitos de una secuencia
binaria. Los resultados no fueron los deseados y se desestimo esta opcion.
Otro motivo que provoco que desestimaramos estas dos opciones es que son metodos dema-
siado generales para lo que se pretende en este proyecto. Tiene sentido reconocer palabras con
estas tecnicas, ya que las palabras pueden sufrir deformaciones seg un quien las pronuncia, el
acento, etc. Nosotros no vamos a alargar nuestro codigo, ni sufrira deformaciones similares a las
indicadas, solo nos afecta la correcta estimacion de la orientacion para la recticacion del codigo
de barras. Por tanto tendra sentido utilizar estas tecnicas, si nuestro codigo si que sufriese esa
serie de transformaciones que provocasen su alargamiento, por ejemplo.
Incluso se penso en utilizar la tecnica de crestas y valles (ridges and valleys) [21], utilizada en
ciertos campos, como la medicina o en el procesamiento de huellas digitales. Para ello se utilizan
estas crestas o valles que aparecen en la imagen como caractersticas geometricas utiles en el
analisis de imagenes.
Uno de los trabajos relacionados con los codigos de barras [28], del cual obtuvimos bastante
informacion y que mencionamos en el primer captulo de esta memoria, intentaba decodicar
el codigo de barras de la siguiente forma: una vez obtenida la region de interes se extraa de la
misma una onda donde apareceran crestas y valles correspondientes a los espacios y las barras
del codigo. La onda se umbraliza para conseguir que los elementos de las barras y espacios del
codigo se distingan con claridad. Se extraen elementos de la onda seg un las anchuras que estos
presentan en el tipo de codigo a interpretar. Finalmente, conociendo lo que ocupa un caracter
seg un el tipo de codicacion, se van obteniendo los distintos caracteres que contienen el codigo
y se decodican.
33
7. Decodicacion
7.2. Procedimiento
La decodicacion se basa en el conocimiento del tipo concreto de codigo de barras que se
utiliza, en nuestro caso el codigo EAN-13. Por este motivo recordar que la forma de codicacion
del codigo EAN-13 se explica en el Apendice D pagina 57 de esta memoria, por lo que en caso
de duda, ante algunos de los comentarios que vamos a mencionar sobre el tipo de codicacion,
sirva este apartado como gua o ayuda.
En cuanto a la decodicacion del codigo de barras podemos aprovechar las posibles ventajas
que se nos presenten, es decir, podemos utilizar el conocimiento ((a priori)) que tenemos, para
simplicar el problema. En nuestro caso en particular, la ventaja primordial es que nosotros pre-
tendemos decodicar codigos de barras utilizados para codicar la numeracion ISBN de los libros
y, debido a ello, conocemos de antemano que los codigos de barras de este tipo de publicaciones
empiezan con los dgitos 978. Sabemos pues que el primer dgito es el 9 y, consecuentemente,
la disposicion en cuanto al tipo de codicacion que presentara la primera parte del codigo, es
decir, el dgito 9 se corresponde con la secuencia ABBABA. Por todo ello podemos determinar que
nuestro codigo presentara la siguiente forma (Tabla D.4 pagina 59):
9 ABBABA CCCCCC
donde cada dgito se codica seg un el tipo de codicacion que se ha determinado.
Para decodicar nuestro codigo vamos a trazar una serie de lneas imaginarias horizontales
sobre la imagen binaria centrada en el codigo obtenida en la fase anterior, a modo de los lectores
laser, quedandonos con el valor de cada pxel por el que se atraviesa. El trazar mas de una lnea
persigue una mayor seguridad a la hora de que la decodicacion sea correcta, por ello el n umero
de lneas que vamos a realizar sera igual a la altura de la imagen.
Las lneas que obtengamos debemos poder dividirlas en segmentos correspondientes a cada
uno de los posibles patrones que debemos encontrar, es decir, patron inicial y nal, el patron
intermedio y el correspondiente a cada uno de los dgitos que componen el codigo. El patron
inicial y el nal estan formados por tres modulos (101), donde un modulo como se explico en el
apartado 2.2 (pagina 7), es la unidad mnima o basica de un codigo. El patron intermedio, por su
parte, esta formado por cinco modulos (01010) y cada uno de los dgitos esta compuesto por 7
modulos. Con esta informacion, si sabemos que en el codigo nos aparecen 12 dgitos codicados,
ya que el primero no lo esta, tendremos una cantidad total de modulos de 95:
Inicio Seis dgitos Intermedio Seis dgitos Fin N umero de modulos
3 6 7 5 6 7 3 95
Pero las lneas que calculemos van a tener una cantidad de pixels que dependera de la escala
a la que este el codigo dentro de la imagen. Por ello debemos calcular esta deformacion y ver
como nos afecta en nuestro caso, calculando cuantos pixels por modulo tenemos, es decir:
=
n
M
donde n es la cantidad total de pixels que conforman el codigo en nuestra imagen, sera el
n umero de pixels por modulo y M es la cantidad total de modulos que aparecen en un codigo,
que en nuestro caso, como hemos visto, vale 95.
Una vez obtenemos este dato podemos averiguar la relacion de pixels que se corresponde con
cada uno de los patrones antes mencionados, simplemente multiplicando el n umero de modulos
por el n umero de pixels por modulo , es decir, el tama no de un dgito sera el valor que se
obtenga de multiplicar el n umero de pixels por modulo por 7 modulos que forman un dgito.
34
7.2. Procedimiento
Con estos datos podemos ir dividiendo la lnea y quedarnos con los pixels correspondientes
a cada dgito dentro de la lnea e intentar averiguar cual es este dgito. Actuaremos de la
siguiente manera: si sabemos que un dgito codicado con la codicacion de tipo A va a seguir
un determinado patron, teniendo una cantidad de ceros seguida de otra de unos, luego mas ceros
y por ultimo otra vez unos, podemos determinar el tama no maximo que nos va a ocupar un
dgito de la siguiente manera:
= m ,
si (n umero de pixels por modulo) es 2 y m = 7, siendo m el n umero de modulos que forma
un dgito, = 14, siendo el n umero maximo de pixels que ocupara un dgito. Dentro de este
tama no buscaremos el patron que hemos comentado (0101, con una cierta cantidad en cada caso
de ceros y unos). Podemos encontrar este patron dentro de los 14 pixels y que el ultimo pxel
sea el n umero 14 o no, y sea el 13 o el 12, simplemente donde nos quedemos sera el pxel de
comienzo del siguiente dgito y a partir de este empezaremos a buscar el patron correspondiente
al siguiente dgito en los 14 pixels que le siguen. Para un mejor entendimiento veamos este
ejemplo,
. . . 11 00001111000111
. .
14
0001100001111
. .
13
0
. .
14
000 . . .
Como se observa, el primer dgito ocupa los 14 pixels que puede tener como maximo, sin
embargo el segundo dgito no ocupa los 14 pixels sino 13, luego la posicion en la que empezara el
siguiente dgito sera el pxel que se encuentra dentro de una caja y no el subrayado, como hubiese
sido si el dgito ocupase el maximo n umero de pixels posible.
Vemos que, a pesar de determinar las cantidades de pixels que cogemos para un dgito concreto,
este valor puede tener una peque na variacion con lo que realmente ocupa el patron correspon-
diente al dgito, debido a la perdida de informacion con los decimales y sus redondeos. Por esta
razon buscamos los diferentes patrones o cambios que deben aparecer en cada caso dentro de la
cantidad de pixels que hemos calculado y si se encuentra antes del tama no maximo que se ha
determinado, entonces ese punto en concreto sera el principio del siguiente dgito.
Una vez tenemos el conjunto de unos y ceros correspondiente a cada dgito, como sabemos
con que tipo de codicacion, A, B o C, se ha codicado, simplemente tenemos que averiguar con
que dgito se corresponde. Para ello vamos a calcular la distancia que presenta este conjunto con
cada uno de los dgitos del tipo correspondiente de la siguiente forma: podemos representar la
forma de codicacion de un dgito en vez de como un patron de unos y ceros, como un patron
de n umero de modulos que representan estos unos y ceros, es decir,
Dgito Codicacion A N umero de modulos
0 0001101 3211
Como vemos, tenemos tres modulos correspondientes a un espacio ancho, dos modulos corres-
pondientes a una barra ancha, un modulo para un espacio estrecho y un modulo para una barra
estrecha.
Siguiendo esta idea lo mismo haremos nosotros para el conjunto de ceros y unos que obtenga-
mos de la lnea calculada y que representan un dgito, para a continuacion emplear la formula
de la suma de cuadrados y calcular para que dgito esta distancia es menor.
n

i=1
(x
i
y
i
)
2
35
7. Decodicacion
siendo x
i
cada uno de las cantidades correspondientes al n umero de modulos del conjunto de
unos y ceros obtenidos de la lnea calculada, y
i
cada una de las cantidades de modulos de un
dgito en la codicacion correspondiente y la variable n que se corresponde al valor 4 ya que
tenemos este n umero de cambios en un dgito.
Para que se entienda mejor este paso vamos a explicarlo con un ejemplo. Si tenemos el siguiente
conjunto de pixels para un dgito en concreto:
00001111000111
calculamos el n umero de unos y de ceros que contiene el conjunto de la siguiente manera,
0000
..
4
1111
..
4
000
..
3
111
..
3
a continuacion dividimos el n umero de unos y ceros por el n umero de pixels por modulo , de
esta forma obtendremos el valor equivalente de modulos en cada caso.
0000
..
4

1111
..
4

000
..
3

111
..
3

Suponiendo que = 2 obtendramos,


0000
..
2
1111
..
2
000
..
1,5
111
..
1,5
Ahora simplemente debemos aplicar la formula de la suma de cuadrados con los 10 dgitos con
los que debemos comparar y con aquel que el resultado sea menor, sera el dgito representado
por el conjunto de unos y ceros que se esta analizando.
Para todas las lneas que realizamos, una vez decodicadas, calculamos el checksum o caracter
de vericacion seg un la codicacion EAN-13, con el objetivo de asegurarnos que la decodicacion
es correcta. En caso de no ser as ese resultado se descarta por no ser correcto y solo se tienen
en cuenta para el resultado nal aquellas lneas donde el checksum sea correcto. Un peque no
problema que se nos presenta es que en ocasiones aparecen combinaciones de dgitos que con-
siguen que el checksum sea correcto, pero sin embargo el codigo no representa al que aparece en
la imagen, provocando que el resultado nal no sea correcto.
Como explicaremos a continuacion, los dgitos nales que elegiremos como resultado se pueden
obtener mediante diferentes metodos, teniendo en cuenta todas las lneas obtenidas con un
checksum correcto.
Una forma es calcular el n umero de veces que aparece un dgito en una determinada
posicion y elegir como mas probable aquel que mas veces se repite en esa posicion en
concreto.
Otra posible opcion es utilizando probabilidades, es decir, calcularemos a partir de las
distancias que hemos calculado previamente la probabilidad que presenta un dgito de ser
el correcto y nos quedaremos con aquel dgito cuya probabilidad sea mas alta. La obtencion
de estas probabilidades se realiza a partir de la siguiente formula:
p = e
d

2
donde p sera la probabilidad que presentara un valor de ser el correcto, d es la distancia
obtenida con la suma de cuadrados para ese determinado valor y
2
es la varianza del
conjunto de valores obtenidos con la suma de cuadrados para cada uno de los dgitos con
los que se ha realizado la operacion.
36
7.3. Resultados
Otra forma de obtener el resultado es combinando la probabilidad con la conanza, me-
diante su producto y eligiendo aquel dgito para el cual se obtenga un mayor valor de esta
operacion. Cuando nosotros trazamos una lnea, esta puede cruzar por una zona que no se
haya elegido como perteneciente al codigo, por ser una mancha o cualquier otra clase de
ruido, pero que, sin embargo, puede ser una zona mnima que igual permita al resto de la
lnea obtener un codigo valido. Ademas los pixels que conforman esta zona estan etiqueta-
dos como puntos de la imagen que no contienen informacion valida del codigo. Por tanto
cuando realizamos las distintas divisiones de la lnea para compararlas con los dgitos del
tipo de codicacion que se corresponda para cada posicion en concreto, puede ocurrir que
un conjunto de esos pixels contenga algunos etiquetados como puntos con informacion no
valida. Por ello la conanza nos vendra dada por el porcentaje de puntos con informacion
valida dentro del conjunto de pixels.
Como ultima opcion estudiada es una igual que la anterior pero en vez de coger el valor
maximo, calculamos la mediana y nos quedamos con el valor que se obtenga.
Como existen diferentes caractersticas o informacion a la hora de la decodicacion del codigo,
se debe de alguna forma intentar clasicar y combinar esta informacion [19], con la intencion de
ofrecernos ayuda a la hora de interpretar el codigo. En nuestro caso ha sido una tarea bastante
complicada y se opto por lo siguiente: una vez calculados los cuatro, elegimos aquel resultado
cuyo codigo sea correcto en cuanto al calculo del checksum y ademas empiece por 978 que, como
comentamos al principio de este apartado, son los tres primeros dgitos con los que empieza un
codigo ISBN. Veamos un ejemplo:
Tabla 7.1.: Ejemplo de posibles resultados seg un la opcion elegida
Tecnica N.
o
decodicado Checksum Inicio 978?
N.
o
veces aparicion 9788428323086 Correcto S
Maxima probabilidad 9478228323088 Correcto No
Maxima probabilidad conanza 9488428323086 Incorrecto No
Mediana probabilidad conanza 9788428323085 Incorrecto S
En este ejemplo vemos el resultado obtenido con cada una de las opciones antes mencionadas,
por tanto seg un estos resultados elegiramos la primera opcion.
7.3. Resultados
A continuacion se muestra una serie de imagenes junto al codigo que hemos conseguido de-
codicar. En caso de haber alg un dgito del codigo erroneo, este aparece dentro de una caja
indicando que no era el correcto. As, de esta manera, se podra apreciar aquellos casos en los
que el metodo funciona correctamente y en cuales falla uno o varios dgitos.
Como podemos observar en la Figura 7.1, se ha conseguido para cada una de esas imagenes
decodicar el codigo y obtener los distintos dgitos que lo componen sin ning un error. Pero estas
imagenes pertenecan a codigos sin ning un tipo de deterioro provocado por rayas o manchas,
por ello vamos a analizar como se comporta el metodo ante situaciones menos favorables.
El comportamiento del metodo ante codigos deteriorados lo podemos observar en la Figura 7.2
donde nos aparecen codigos con alg un tipo de marca que diculta su decodicacion, sin embargo
la solucion obtenida ha sido la deseada sin ning un tipo de error. Esto es debido a que las manchas
que presenta el codigo de barras no son lo sucientemente fuertes como p o marcadas para evitar
la correcta decodicacion del mismo. En cambio, en ciertos casos como los que mostramos en la
37
7. Decodicacion
9788428323086 9789706860507 9788428328647
Figura 7.1.: Distintas imagenes con el codigo que se ha obtenido al aplicar nuestro metodo
Figura 7.3, el resultado nal s que presenta alg un dgito que no se corresponde con el dgito del
c odigo en cuestion.
9788428324304 9788428326360 9788428326360
Figura 7.2.: Una serie de imagenes en las que el codigo sufre alguna alteracion en cuanto a
presentar rayas o manchas sobre el, pero la decodicacion nal es completamete
correcta
9788428326 8 77 978842 79 27336 97884 1 8328111
Figura 7.3.: Conjunto de imagenes en las que la decodicacion del codigo de barras presenta
alg un dgito erroneo
Pero no siempre el resultado que se obtiene es aceptable. A veces, el resultado conseguido
presenta un n umero de dgitos la mayora de ellos erroneo, como se observa en la Figura 7.4.
Este mal funcionamiento es debido a la intensidad de las marcas que presenta el codigo, que
como comentamos en apartados anteriores, afecta a la hora de la deteccion de la zona donde se
encuentra este. Esta mala deteccion provoca que esta ultima fase de decodicacion sea erronea
al no tener la region que contiene al codigo la suciente informacion, de manera que permita la
decodicacion del codigo de barras con exito.
38
7.4. Analisis de robustez
9 0 8 7 42 4 3 42 3 63 978 51121 2864 0 9 34747551 8 301
Figura 7.4.: Imagenes donde el metodo no consegua los resultados deseados
De forma global, los resultados que se han obtenido, basandonos en un conjunto de imagenes
de prueba, han sido los que se muestran en la Tabla 7.2. Solo comentar, que de las 15 imagenes
en las que no se consiguio obtener el codigo correcto, casi la mitad de ellas, mas exactamente en
7, el codigo solo presentaba un dgito erroneo.
Tabla 7.2.: Comportamiento del metodo
Resultados
Caso analizado N.
o
imagenes Correcto Incorrecto Porcentaje
Limpia 10 7 3 70
Da nada 24 12 12 50
Total 34 19 15 56
7.4. Analisis de robustez
En este apartado se van a presentar una serie de ejemplos o experimentos para comprobar
hasta que punto el metodo puede ser able, o simplemente con el proposito de dejar claro ciertos
aspectos que creemos pueden resultar de interes.
Automatizacion del proceso de binarizacion
Como comentamos en el captulo anterior, previamente a la binarizacion se realiza una ecua-
lizacion del histograma, Este paso junto a la utilizacion del metodo de Otsu para encontrar el
umbral a partir del cual binarizar, mejoran dicha binarizacion y por consiguiente, la posterior
decodicacion. En la Figura 7.5 se muestra el resultado que se obtiene tanto sin ecualizar y
con un umbral jo, como el mismo resultado ecualizando el histograma y aplicando Otsu para
encontrar dicho umbral.
Se puede observar que la subimagen que se obtiene del codigo de barras sin haber realizado
la ecualizacion y con un umbral jo, es peor que en el otro caso comentado. Ademas la decodi-
cacion no tiene exito, debido a que la imagen binarizada no es lo bastante buena para poder
ser decodicada correctamente. De ah la importancia, tanto de la ecualizacion previa de la
imagen como del calculo automatico del umbral a partir del cual binarizar, ya que si este es jo,
en ciertas imagenes nos va a resultar adecuado, pero en otras no. Debido a esto no podamos
encontrar un valor que fuese adecuado para todos los casos, por lo que se penso en el metodo
de Otsu para evitar este contratiempo.
39
7. Decodicacion
9789687529714 9769687 0151 1 5 978968752914
(a) (b) (c)
Figura 7.5.: Obtencion de la subimagen binarizada centrada en el codigo de barras: (a) Imagen
original; (b) obtenida sin ecualizar el histograma y con un umbral jo de 110; (c)
previamente se ha ecualizado el histograma y se ha aplicado Otsu para calcular el
umbral con el cual binarizar
Inuencia del error de la estimacion de la orientacion
Otro aspecto que resultara de interes analizar es hasta que punto inuye el valor que se estima
de la orientacion con el cual se rectica la imagen. Es decir, si la estimacion de la orientacion es
muy exacta podremos conseguir rotar la imagen de manera que se obtenga el codigo totalmente
horizontal, la variacion que este valor presente nos llevara a obtener un codigo de barras con
una cierta inclinacion hacia un lado o hacia el otro como se puede observar en la Figura 7.6.
(a) (b)
e
= 0 (c) |
e
| = 10

Figura 7.6.: Subimagenes que se obtienen seg un el error en la estimacion de la orientacion (


e
)
realizada: (a) imagen original; (b) estimacion de la orientacion practicamente per-
fecta; (c) estimacion de la orientacion erronea en unos 10

Por ello se ha realizado un experimento con el objetivo de comprobar cual es el intervalo en


el que nos podemos mover en cuanto a la estimacion de la orientacion. De esta forma podremos
conocer tambien la robustez del metodo cuando se tiene que decodicar un codigo que no se
encuentra totalmente horizontal, sino que presenta una cierta inclinacion mas o menos exagerada.
En la Figura 7.7 se muestra una graca que relaciona el nivel de inclinacion que puede pre-
sentar el codigo una vez recticado con respecto al n umero de dgitos acertados a la hora de la
decodicacion. Como es logico, en el eje de abcisas, el valor 0 se corresponde a una estimacion
de la orientacion perfecta, con lo que se obtendra un codigo de barras totalmente horizontal.
El resto de valores se corresponde al aumento del error en la estimacion de la orientacion que
presenta el codigo de barras, hacia un lado o hacia el otro.
En la graca se observa que podemos tener un error en la orientacion bastante elevado, de
alrededor de 10 grados, tanto en un sentido como en otro. A partir de este error el n umero
40
7.4. Analisis de robustez
0
2
4
6
8
10
12
14
-20 -15 -10 -5 0 5 10 15 20
a
c
i
e
r
t
o
s

[
d
i
g
i
t
o
s

c
o
r
r
e
c
t
o
s
]
error orientacion [grados]


Figura 7.7.: Efecto que provoca una estimacion de la orientacion erronea a la cantidad de dgitos
acertados en la decodicacion
de dgitos acertados disminuye, viendose mas afectado el resultado en un sentido que en el
otro. Suponemos que la razon por la cual puede suceder esto es debido a la imagen utilizada
para realizar el experimento, la imagen (a) de la Figura 7.6, en la cual podemos observar que
nos falta un trozo de codigo de barras en la parte inferior derecha. Como en la decodicacion
trazamos lneas horizontales para obtener la secuencia binaria que despues decodicamos, llega
un momento que la orientacion estimada es tan erronea que conlleva una inclinacion excesiva
del codigo, provocando que las lneas que nosotros trazamos no consiguan atravesar totalmente
este, es decir, no consigan pasar por todas las barras y espacios que lo forman. Esta situacion
se ve agravada cuando el codigo de barras se inclina hacia el lado contrario del trozo de codigo
que nos falta, provocando as su mala decodicacion.
Inuencia del tama no relativo del codigo de barras
Pero nuestro metodo tambien se puede ver afectado por la inuencia del tama no relativo del
codigo de barras dentro de la imagen. Por esta razon se ha realizado un escalado de la imagen
con distintos factores, con el objetivo de aumentar o disminuir el tama no del codigo y poder
comprobar as, hasta que punto el metodo implementado consigue ser efectivo, en cuanto a la
obtencion de la region que contiene al codigo en la fase de localizacion del mismo.
En la graca presente en la Figura 7.8 se observa no solo hasta que nivel podemos aumentar o
disminuir el tama no del codigo y que la localizacion sea buena, sino tambien el n umero de dgitos
acertados que tenemos en cada caso. La lnea discontinua corresponde al n umero de dgitos
acertados, mientras que la lnea continua representa la validez de la localizacion conseguida.
Cabe destacar que la determinacion de que una localizacion es buena o no, es cualitativa y
subjetiva, mientras que el n umero de dgitos acertado es una variable cuantitativa y objetiva.
Por esta razon, cuando la localizacion es buena, se le asigna el maximo valor de dgitos acertados
13 y cuando no lo es su valor es 0, es como si 13 se correspondiese a ((OK)) y 0 a ((no OK)). Este
41
7. Decodicacion
paso se ha realizado para poder tener las dos comparativas en una misma graca.
0
2
4
6
8
10
12
14
0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8
l
o
c
a
l
i
z
a
c
i
o
n

[
O
K
-
n
o

O
K
}
,
a
c
i
e
r
t
o
s

[
d
i
g
i
t
o
s

c
o
r
r
e
c
t
o
s
]
factor de escala

localizacion codigo
digitos acertados
Figura 7.8.: Estudio para comprobar como afecta el escalado a la localizacion del codigo de
barras y a la cantidad de dgitos acertados en la decodicacion
Seg un estos resultados se tiene mejor funcionamiento de la localizacion de la region candidata
de contener al codigo, si se reduce el tama no del mismo que si este se ve aumentado. Esto es
debido a que si aumentamos el tama no del codigo tambien aumentamos el tama no de las barras y
los espacios, con lo cual, a la hora de extender la orientacion, estas distancias existentes entre los
bordes provoca que la orientacion de los puntos de borde no se extiendan a todos los puntos de la
zona del codigo que no lo son, y por tanto, provoca que se falle en la fase de localizacion. Ademas,
tambien se observa que en cuanto al intervalo donde la localizacion es correcta, no siempre se
aciertan todos los dgitos del codigo, por lo que se deduce que una acertada localizacion del
c odigo no siempre provoca una acertada decodicacion del mismo. Esto nos lleva a pensar que
la decodicacion debera ser mejorada de alguna forma, para que no ocurriese esto y sucediera
lo contrario, que una buena localizacion provocara una decodicacion correcta.
Tambien recalcar que pese a todo, la localizacion consigue funcionar incluso con cambios de
escala tan importantes como los que se consiguen aplicando un factor de 0.7 y 1.2.
En la Figura 7.9 se puede observar la misma imagen a la cual se le ha aplicado dos factores
de escala distintos, unos de ellos aumenta la imagen y el otro la disminuye, junto al codigo que
posteriormente se consigue decodicar.
Inuencia del n umero de lneas empleadas en la decodicacion
Para nalizar, resultara tambien interesante conocer como afecta a la hora de la decodicacion
el n umero de lneas que se realizan para la misma. Con este motivo se han utilizado las dos
imagenes presentes en la Figura 7.10, en las cuales se observa como, una de las dos, presenta
una mancha, mientras que la otra se encuentra totalmente limpia sin ning un tipo de mancha
o raya. Realizaremos un experimento y que consistira en utilizar para la decodicacion un
porcentaje de las lneas que conforman la altura de la subimagen centrada en el codigo. El
42
7.4. Analisis de robustez
(a) (b)
9788428323086 978 3661402308
(c) (d)
Figura 7.9.: Imagenes escaladas: (a) se ha aplicado un factor de 0.8, con lo que se reduce el codigo
de barras; (b) se ha aplicado un factor de 1.3, con lo que se aumenta el codigo de
barras; (c) region obtenida al realizar el proceso de localizacion del codigo junto
al conjunto de dgitos del codigo de barras decodicado correctamente; (d) region
obtenida para la imagen junto al codigo decodicado erroneamente
resultado del experimento se puede observar en la graca que aparece en la Figura 7.11. La lnea
continua pertenece al resultado obtenido para la imagen (a) de la Figura 7.10, mientras que la
otra pertenece al resultado obtenido para la imagen (b) de la misma gura.
9788428323086 9788497320658
(a) (b)
Figura 7.10.: Imagenes analizadas: (a) limpia; (b) presenta una mancha
Como podemos observar en una imagen limpia no importa la cantidad de lneas que utilicemos
a la hora de la decodicacion, ya que tanto con un n umero elevado de lneas (en este caso el
100 % se corresponde a 118 lneas) como con un n umero mas peque no conseguimos decodicar el
43
7. Decodicacion
c odigo correctamente. Sin embargo, cuando la imagen se ve da nada por alg un tipo de mancha,
esto no ocurre as, y s que afecta el n umero de lneas que analicemos. Hasta que no llegamos
a un 40 % (en este caso el 100 % se corresponde a 79 lneas) no se obtiene la decodicacion del
c odigo de barras con exito. Por tanto, podemos concluir que para no malgastar recursos con un
40 % de lneas que se utilicen en la fase de la decodicacion sera suciente, pero como nosotros
no conocemos que tipo de manchas van a presentar los codigos que se analicen, debemos realizar
el maximo n umero de lneas posible para su correcta decodicacion.
0
2
4
6
8
10
12
14
10 20 30 40 50 60 70 80 90 100
a
c
i
e
r
t
o
s

[
d
i
g
i
t
o
s

c
o
r
r
e
c
t
o
s
]
numero de lineas [%]

imagen 7.10 (a)
imagen 7.10 (b)
Figura 7.11.: Efecto que provoca el n umero de lneas empleado para la decodicacion a la can-
tidad de dgitos acertados en la misma
44
8. Sistema experimental
En este punto simplemente vamos a comentar el material utilizado para la realizacion del
proyecto, al igual que mencionaremos ciertas restricciones que se han adoptado durante la im-
plementacion del mismo. Tambien creemos necesario comentar los valores que se han jado para
algunas parametros utilizados en los algoritmos y el motivo por el cual se ha adoptado ese valor.
Por ultimo mostraremos el tiempo de ejecucion del algoritmo, desglosado para cada una de las
fases que lo componen.
8.1. Informacion general
En primer lugar comentar que las imagenes de los codigos de barras empleadas en el proyecto
han sido tomadas del catalogo universitario de libros de matematicas, ciencias, ingeniera y
computacion del a no 2004 de la editorial THOMSON. La camara con la cual se ha recopilado este
conjunto de imagenes era una camara SONY DFW-VL500 de color digital. Como caracterstica
a destacar comentar que la propia camara contiene unos botones que permiten realizar un zoom
y un enfoque de la imagen de forma manual, sin tener que determinar ning un parametro desde la
aplicacion con la que se este utilizando la camara. Tambien se hicieron pruebas con otra camara,
una camara digital IEEE 1394, y usando para la visualizacion de las imagenes la aplicacion
Coriander 1.0.0 [1], pero nalmente solo se ha usado una de las imagenes que de esta forma se
tomaron.
Para la adquisicion de imagenes se ha empleado un conjunto de funciones de Matlab 7.0 y
que se explican en su correspondiente manual [17]. A continuacion se presenta un ejemplo de las
funciones utilizadas para la captura de una imagen, con el objetivo de poder grabarla luego a
disco:
vid=videoinput{dcam,Y422_320x240);
vid.ReturnedColorSpace=RGB;
preview(vid);
im=getSnapShot(vid);
imshow(im);
imwrite(im,barcode.pgm);
Por ultimo solo comentar que el metodo presentado en este proyecto se ha implementado
en C++ bajo el sistema Suse Linux 9.2. Como cabe pensar, se ha utilizado en el mismo una
librera de procesamiento de imagenes, en este caso la CImg [29] en su version 1.0.8, al igual que
un conjunto de programas de visualizacion y conversion de imagenes como el xv o el convert.
El convert se ha utilizado sobretodo para conversion de imagenes y para la realizacion de las
transformaciones geometricas que se pueden ver en la Figura 5.8 (pagina 28).
45
8. Sistema experimental
8.2. Restricciones
Aunque como se ha comentado, el codigo de barras puede presentar cualquier orientacion, una
restriccion que se ha jado en cuanto a nuestro proyecto, ha sido que la orientacion del codigo
debe encontrarse en un intervalo de entre 90

y 90

. Esto es debido a que si no fuera as se


diculta en gran medida la decodicacion del codigo de barras. El motivo es que a la hora de
la rotacion, la orientacion que presentan las barras puede provocar que el codigo se quede en
sentido inverso, es decir, boca abajo, y la decodicacion de esta forma se complica bastante.
Debemos recalcar que no es lo mismo la orientacion del codigo de barras que la orientacion
de las barras presentes en el mismo, ya que cuando el codigo de barras se encuentra en sentido
horizontal la orientacion del mismo son 0

, pero por el contrario las barras presentan un angulo


de 90

.
El tama no de todas las imagenes con las cuales se ha probado el metodo era de 320 240
pixels, simplemente para tener un tama no base y por simplicidad, aunque se han hecho pruebas
con unas pocas imagenes de tama no superior obteniendo resultados similares. Para nalizar
comentar que el tama no del codigo de barras con respecto a la imagen siempre ha sido mas o
menos parecido dentro de un intervalo.
8.3. Valores por defecto
Durante todo el proceso un conjunto de parametros, que creemos importantes, han mantenido
un valor jo debido a una serie de razones que explicamos en este apartado. Estos valores se
muestran a continuacion en la siguiente tabla:
Tabla 8.1.: Parametros con valores por defecto
Fase Parametro Signicado Valor
Deteccion de bordes Varianza 0.5
Deteccion de bordes t
1
Umbral usado en la histeresis 20
Deteccion de bordes t
2
Umbral usado en la histeresis 40
Etiquetado y ltrado de regiones U Umbral (dif. max. en orientacion) 10
Para los parametros , t
1
y t
2
utilizados en el algoritmo de Canny para deteccion de bordes, se
ha jado un determinado valor despues de realizar una serie de pruebas con el objetivo de obtener
los mejores resultados posibles. Se consulto diferente bibliografa para comprobar cuales eran
los valores mas adecuados a utilizar en estas variables, sin embargo no se consiguio determinar
que valores a usar eran los mas acertados ni conocemos procedimientos automaticos para su
seleccion. Por este motivo se realizaron distintas pruebas, con diferentes valores e imagenes, y
nos quedamos con aquellos valores que presentaban unos mejores resultados.
El parametro U, que aparece en el algoritmo 3 (pagina 24) de esta memoria, es el umbral que
se utiliza para determinar cual es la diferencia maxima que pueden presentar dos pixels entre
s, para determinar si son parecidos o no, durante el proceso de binarizacion de un determinado
nivel de la piramide de imagenes. Su valor es el que se indica en la tabla, simplemente porque se
creyo adecuado para obtener el resultado que se pretenda, ademas de ser un valor con el cual
los resultados eran buenos.
46
8.4. Tiempo de ejecucion
8.4. Tiempo de ejecucion
El tiempo de ejecucion del metodo implementado, desglosado para cada una de las fases y
expresado en milisegundos, es el que se observa en la Tabla 8.2. El tiempo de ejecucion se ha
determinado despues de realizar una media entre 10 ejecuciones distintas del algoritmo, tomando
en cada una de ellas, una de las 10 imagenes que tenamos donde el codigo aparece sin ning un
tipo de mancha. El ordenador con el cual se han realizado cada una de las mediciones es un Intel
Pentium 4 a 1.70 GHz con 376 MB de RAM.
Como vemos el tiempo que tarda en ejecutarse el programa no es muy elevado, aunque este
se vera incrementado si se aumenta el tama no de la imagen a analizar.
Tabla 8.2.: Tiempo de ejecucion de cada una de las fases
Fase Tiempo (ms)
Deteccion de bordes 339
Deteccion de regiones candidatas 27
Etiquetado y ltrado de regiones 39
Estimacion de la orientacion y recticacion 633
Decodicacion 28
Tiempo Total 1066
En la etapa de estimacion de la orientacion y recticacion el tiempo es bastante mas elevado
que en las otras fases, cuando parece que las operaciones que en ella se realizan no deban costar
tanto. Este aumento en el tiempo es debido a que, para la estimacion de la orientacion, calculamos
la mediana de los puntos de borde de la subimagen centrada en el codigo que se obtiene en fases
anteriores, y esta operacion requiere que los valores de los puntos de bordes esten ordenados,
utilizando para ello el metodo de la burbuja, que es el causante de este incremento del tiempo.
Se utiliza este metodo de ordenacion por simplicidad, sin embargo si quisieramos conseguir un
metodo mas eciente tendramos que implementar otro metodo de ordenacion mas eciente.
Por ultimo, rese nar que el tiempo que emplea el metodo, como hemos comentado, no es muy
elevado, incluso sin haber dedicado mucho tiempo a la optimizacion del mismo teniendo en
cuenta la eciencia. Con lo cual se puede decir que es un metodo que se presta a ser utilizado
en aplicaciones para decodicacion de codigos de barras, en las que se requiera resultados al
instante.
8.5. Duracion del proyecto
En la siguiente tabla vamos a mostrar el tiempo que hemos empleado en la realizacion de
nuestro proyecto, tanto en semanas como en horas. Se ha desglosado el mismo en un conjunto de
etapas generales que incluye desde la recopilacion inicial de informacion sobre codigos de barras
hasta la composicion de esta memoria. Simplemente recalcar que el tiempo que se muestra en
estas fases no solo incluye la implementacion del proceso empleado en esa fase, sino tambien el
tiempo empleado pensando la idea de como hacerlo, al igual que las posibles modicaciones que
se hayan podido realizar de lo que en un principio se tena pensado. Con esto queremos recalcar
que normalmente se utiliza mas tiempo en pensar como hacer las cosas que en la implementacion
de las mismas. Ademas siempre surgen contratiempos que provocan ciertos retrasos que no se
haban previsto.
47
8. Sistema experimental
Tabla 8.3.: Tiempo empleado en la realizacion del proyecto
Etapa Semanas (5 dias) Horas/semana
Recopilacion de informacion 2 40
Dise no e implementacion de la localizacion 10 300
Dise no e implementacion de la decodicacion 4 120
Documentacion y redaccion memoria 4 120
Total 20 580
En la tabla el calculo de horas/semana se ha realizado teniendo en cuenta que para la etapa
de recopilacion de informacion se utilizaron 4 horas/dia y para el resto de etapas 6 horas/dia.
48
9. Conclusiones
El metodo implementado para la decodicacion de codigos de barras podemos concluir que
presenta un buen funcionamiento cuando las imagenes que se analizan no contienen codigos de
barras da nados o afectados por alg un tipo de ruido, como rayas o manchas, pero por el contrario
si los codigos que aparecen en las imagenes si que presentan ruido, el metodo no resulta ser
sucientemente robusto. Ademas esta tecnica se ve afectada de manera negativa por la calidad
de la imagen, ya que si esta no cumple unas condiciones bastante buenas, el proceso tiende
a fallar y por tanto la decodicacion no es posible. La solucion pasara seguramente por un
preproceso de la imagen a tratar.
Otra caracterstica a considerar de este metodo es que realiza los calculos de forma eciente,
aunque este tiempo depende en gran medida del tama no de la imagen. Sin embargo en nuestro
caso, donde se ha utilizado un tama no de imagen jo, el resultado se obtena con bastante
rapidez.
En el proceso de la decodicacion, la imagen binaria en la cual nos basamos para posterior-
mente interpretar el codigo se obtiene despues de una serie de pasos de la imagen original. Sera
a lo mejor mas conveniente utilizar la imagen de bordes de alguna forma, ya que de esta manera
seramos capaces de decodicar no solo codigos de barras con espacios blancos y barras negras,
sino que podramos decodicar codigos donde las barras y espacios fuesen de cualquier color a
parte del blanco y negro. Esto es debido a que la obtencion de bordes nos indica los cambios de
intensidad que aparecen en la imagen y no depende del color de las barras ni espacios, aunque
suponemos que sera necesario de igual manera recurrir a la imagen de niveles de gris, pero solo
a nivel consultivo sin depender de ella, simplemente para conocer en cada cambio que se produce
de que nivel venimos y a cual nos dirigimos.
Recalcar que el proceso de localizacion del codigo de barras dentro de la imagen es independi-
ente del tipo de codigo de barras, es decir, cualquier codigo de barras cuya simbologa sea la de
barras y espacios puede ser localizado mediante la tecnica de deteccion utilizada en este metodo.
Sin embargo, para la fase de decodicacion, s que se explota el conocimiento previo que se tiene
del tipo de codicacion que se utiliza, todo ello con el objetivo de simplicar esta operacion.
Tambien mencionar que sera interesante realizar pruebas con una batera de imagenes mucho
mayor, para de esta forma mejorar en cuanto a la deteccion y decodicacion de codigos de barras
en imagenes de poca calidad y con ruido, como manchas, rayas, o cualquier otro factor externo
que modique el codigo.
Como posibles extensiones o trabajos futuros cabra la posibilidad de intentar que el proceso
no solo funcionase con codigos de barras EAN-13, sino que valiese para otros muchos tipos
de codigos que existen en el mercado actual. Sin embargo hay que tener en cuenta la posible
dicultad que ello conlleva, ya que cada codigo utiliza una codicacion distinta y por tanto, que
el mismo procedimiento funcionase para una gran variedad de codigos puede ser complicado.
Ademas se presenta el problema de, una vez captada la imagen, reconocer que tipo de codigo
se esta tratando para utilizar en su decodicacion una serie de pasos que podran ser diferentes
seg un el tipo o generalizar el proceso de decodicacion.
49
9. Conclusiones
50
A. Detector de bordes de Canny
Como se ha comentado en esta memoria, se penso en la deteccion de bordes como una posible
tecnica para la localizacion del codigo de barras dentro de una imagen, debido a las caractersticas
que este presenta. Por esta razon, se utiliza para tal objetivo, el algoritmo de deteccion de bordes
de Canny, ya que este es presentado en la bibliografa en general como uno de los mejores metodos
para la deteccion de bordes y con el cual se obtienen unos buenos resultados.
El algortimo de Canny [24] se fundamenta en la teora de operadores primera derivada para
la extraccion de bordes y se desglosa en tres grandes pasos:
1. Obtencion del gradiente (magnitud y orientacion del vector gradiente en cada
pxel)
La entrada es una imagen I corrompida por ruido. Sea H un n ucleo Gaussiano discreto
con media cero y desviacion estandar .
Suavizar la imagen I con dicho n ucleo para obtener una imagen de salida J.
Para cada pxel (i, j) en J obtener la magnitud y modulo del gradiente basandose en
las siguientes expresiones:
El gradiente de una imagen f(x, y) en un punto (x, y) se dene como un vector
bidimensional dado por la ecuacion:
G[f(x, y)] =
_
G
x
G
y
_
=
_

x
f(x, y)

y
f(x, y)
_
siendo un vector perpendicular al borde, donde el vector G apunta en la direccion de
variacion maxima de f en el punto (x, y) por unidad de distancia, con la magnitud y
direccion dadas por:
|G| =
_
G
2
x
+G
2
y
,
(x, y) = tan
1
G
y
G
x
Es una practica habitual aproximar la magnitud del gradiente con valores absolutos
de la siguiente manera:
|G| = |G
x
| +|G
y
|
Obtendremos dos imagenes de salida: E
m
de la magnitud del gradiente y E
o
de la ori-
entacion, de acuerdo a las expresiones anteriores.
2. Supresion no maxima al resultado del gradiente
Con E
m
y E
o
como entradas y una nueva imagen I
N
como salida, considerar las cuatro
direcciones d
1
, d
2
, d
3
, d
4
identicadas por las orientaciones de 0
o
, 45
o
, 90
o
y 135
o
con
respecto al eje horizontal. Para cada pxel (i, j):
Encontrar la direccion d
k
que mejor se aproxima a la direccion E
o
(i, j) (la perpen-
dicular al borde).
51
A. Detector de bordes de Canny
Si E
m
(i, j) es mas peque no que al menos uno de sus dos vecinos en la direccion d
k
,
al pxel (i, j) de I
N
se le asigna el valor 0, I
N
(i, j) = 0 (supresion), de otro modo
I
N
(i, j) = E
m
(i, j).
La salida I
N
(i, j) es una imagen con los bordes adelgazados, es decir, es E
m
(i, j) despues
de la supresion no maxima de puntos de borde.
3. Histeresis de umbral a la supresion no maxima
La salida I
N
(i, j) suele contener maximos locales creados por el ruido. Se podran elimi-
nar los pixels por debajo de un determinado umbral, pero esto presenta problemas. Una
solucion puede ser la histeresis de umbral, cuyo procedimiento es el siguiente:
Tomar como entrada I
N
, que es la salida del proceso anterior, E
o
la orientacion de
los puntos de borde de la imagen, y dos umbrales t
1
y t
2
, tales que t
1
< t
2
.
Para todos los puntos de I
N
y explorando I
N
en un orden jo:
Localizar el siguiente punto de borde no explorado previamente, I
N
(i, j), tal que
I
N
(i, j) > t
2
.
Comenzar a partir de I
N
(i, j), seguir las cadenas de maximos locales conectados
en ambas direcciones perpendiculares a la normal de borde, siempre que I
N
> t
1
.
Marcar todos los puntos explorados y salvar la lista de todos los puntos en el
entorno conectado encontrado.
La salida es un conjunto de bordes conectados de contornos de la imagen, as como
la magnitud y orientacion, describiendo las propiedades de los puntos de borde.
52
B. Algoritmo clasico de etiquetado de
componentes conexas
Durante una de las fases de nuestro metodo, necesitamos poder elegir de entre un conjunto de
regiones aquella que tiene mayor probabilidad de ser la zona donde se encuentra el codigo. Sin
embargo, para llegar a este ltrado, previamente necesitamos etiquetar de alguna manera estas
regiones, y as poder distinguir unas de otras. Pero no solo distinguir, sino poder seleccionar la
que nosotros queramos. Para esta tarea un algoritmo de etiquetado de componentes conexas se
presentaba como una buen opcion.
El algoritmo clasico de etiquetado de componentes conexas [24] se caracteriza por realizar
solamente dos pasadas a traves de la imagen y necesita mantener durante todo el proceso una
tabla de equivalencias de etiquetas.
El primer paso del algoritmo consiste en la propagacion de etiquetas, es decir, como en la
mayora de algoritmos de este tipo, procesa en cada instante una la de la imagen y asigna
nuevas etiquetas al primer pxel de cada componente, intentando ademas propagar la etiqueta
de cada pxel a sus pixels vecinos, que se encuentran a su derecha o por debajo de el.
Cuando se llega a la situacion en la que dos etiquetas distintas se propagan al mismo pxel,
prevalece la mas peque na y cada equivalencia que se encuentra es introducida en una tabla de
equivalencias. Cada una de las entradas de la tabla esta formada por un par ordenado, donde
los valores de sus componentes son las etiquetas equivalentes halladas durante el proceso.
Una vez realizado este paso, se calculan las clases de equivalencias tomando el cierre transitivo
del conjunto de equivalencias almacenadas en la tabla de equivalencias. A cada una de las clases
de equivalencia encontradas se le asigna una etiqueta, generalmente la mas peque na (o la mas
antigua de la clase).
En el segundo paso se asigna a cada pxel la etiqueta de la clase de equivalencia correspondiente
calculada en el paso anterior.
El algoritmo clasico de etiquetado de componentes conexas se describe en el Algoritmo 4.
La funcion Vecinos() devuelve el conjunto de los vecinos ya etiquetados de un determinado
pxel en su misma lnea o en la lnea previa. La funcion NuevaEtiqueta() genera una nueva
etiqueta con valor entero cada vez que es llamada. La funcion Etiquetas() recibe como entrada un
conjunto de pixels ya etiquetados y devuelve el conjunto de sus etiquetas. Por ultimo la funcion
ClasesEquivalencia() simplemente encuentra las clases de equivalencia de entre el conjunto de
equivalencias almacenadas en la tabla correspondiente.
53
B. Algoritmo clasico de etiquetado de componentes conexas
Algoritmo 4 Metodo clasico de etiquetado de componentes conexas
Entrada: Una imagen binaria I de tama no M N
Salida: Una imagen etiquetada E, donde E(i, j) es la etiqueta de I(i, j)
1: Inicializar la tabla de equivalencias T
2: for i 1 to M do
3: for j 1 to N do
4: E(i, j) 0
5: if I(i, j) = 1 then
6: V Vecinos(i, j)
7: if V = then
8: e NuevaEtiqueta()
9: else
10: e mn(Etiquetas(V ))
11: E(i, j) e
12: for all e

Etiquetas(V ) e

= e do
13: T T (e

, e)
14: C ClasesEquivalencia(T)
15: for all c C do
16: Equivalente[c] mn(Etiquetas(c))
17: for i 1 to M do
18: for j 1 to N do
19: if I(i, j) = 1 then
20: E(i, j) Equivalente[Clase(E(i, j)]
54
C. Metodo de Otsu
Con el objetivo de poder calcular de forma automatica un umbral a partir del cual binarizar
una imagen y evitar as los inconvenientes que presenta la eleccion de un umbral jo, se penso en
la utilizacion del metodo de Otsu como opcion acertada para tal n.
El metodo de Otsu [8], propuesto en 1979, es un algoritmo para la determinacion automatica
de un umbral de binarizacion a partir del histograma de una imagen. Si consideramos que el
conjunto de niveles de gris que conforman una imagen son G = {0, 1, 2, . . . , L}, siendo L el valor
maximo de niveles de gris, el umbral que vamos a obtener se considera el punto que parte los
pixels de una imagen en dos clases de niveles de gris C
0
= {0, 1, . . . , t} y C
1
= {t+1, t+2, . . . , L},
donde t es el umbral optimo que maximiza la separabilidad de estas dos clases.
El metodo esta basado en un analisis discriminante. Un umbral optimo puede ser determinado
minimizando algunas de las siguientes funciones con respecto a t:
=

2
B

2
W
, =

2
B

2
T
, k =

2
T

2
W
De los tres criterios a minimizar, el segundo es el mas simple. Por tanto, el umbral optimo se
dene como:
t

= arg mn
tG
(t)
donde

2
T
=
L

i=0
(i
T
)
2
P
i
,
T
=
L

i=0
iP
i
,

2
B
= w
0
w
1
(
1

0
)
2
, w
0
=
t

i=0
P
i
, w
1
= 1 w
0
,

1
=

T

t
1 w
0
,
0
=

t
w
0

t
=
t

i=0
iP
i
, P
i
=
n
i
n
donde n
i
es el n umero de pixels con nivel de gris i y n es el n umero total de pixels en la imagen
dada denido por n =

L
i=0
n
i
. Ademas, P
i
es la probabilidad de aparicion del nivel de gris i
denido como P
i
=
n
i
n
.
Por ultimo, solo recalcar que la bibliografa encontrada acerca de este metodo presentaba
erratas y nalmente el metodo que aqu se presenta y que es el implementado en la memoria,
surge de la combinacion de las distintas fuentes consultadas [10, 8].
55
C. Metodo de Otsu
56
D. Caractersticas del codigo EAN-13
Existe una gran variedad de codigos de barras en el mercado, sin embargo en nuestro proyecto
nos hemos dedicado a trabajar con una sola clase de ellos, el codigo EAN-13 [20], uno de los
mas famosos y utilizados hoy en da.
El sistema de codicacion Universal Product Code (UPC) fue adoptado en los EE.UU. por
la industria de la alimentacion en los a nos 70. Presentaba una serie de ventajas como eran su
rapidez, precision y abilidad al entrar informacion de stock en las computadoras. Este triunfo
tan repentino llevo al desarrollo del European Article Numbering System (EAN), una simbologia
similar a la UPC, que esta ampliamente difundida por Europa y el resto del mundo.
Existen varias versiones de estos codigos, siendo el codigo de barras EAN-13 el mas utilizado.
Esta formado por: un margen izquierdo, un dibujo normalizado de separacion, un dibujo que re-
presenta directamente seis dgitos e indirectamente un septimo, un dibujo central de separacion,
un dibujo de barras y espacios que representa directamente seis dgitos, un dibujo normalizado
de separacion y un margen derecho. De forma graca lo podemos observar en la Figura D.1.
Figura D.1.: Formato codigo EAN-13
Cada codigo de barras contiene 13 valores, desde las posiciones 1 a la 13. El signicado de
estos dgitos es el que se muestra en la Tabla D.1.
En el codigo de barras existen dos separadores izquierdo y derecho, y una lnea intermedia
mas larga. Estas tres lineas son mas largas que el resto y son usadas para ((calibrar)) el escaner a
la dimension del codigo de barras. El formato de estos separadores se muestra en la Tabla D.2.
La primera posicion cae a la izquierda del borde izquierdo y tiene un signicado especial, los
otros doce dgitos estan escritos dentro del codigo y estan divididos en dos grupos por la lnea
intermedia. Cada valor esta codicado a traves de 7 modulos: negro=1 y blanco=0, formando
dos parejas de barras de diferentes gruesos. Por tanto, cada dgito se representa mediante dos
barras y dos espacios que tienen una anchura total de siete unidades o modulos, donde cada
57
D. Caractersticas del codigo EAN-13
Tabla D.1.: Signicado de los dgitos del codigo seg un la posicion
Posicion Signicado
1, 2 identicacion del pas donde se comercializa el producto
3 identicacion del pas (a veces del fabricante)
4, 5, 6, 7 identicacion del fabricante del producto
8, 9, 10, 11, 12 identicacion del producto
13 dgito de vericacion (su valor es calculado)
Tabla D.2.: Caractersticas de los separadores
Separador Caractersticas
Izquierdo 3 modulos (2 barras con 1 espacio al medio, codicado: 101)
Derecho 3 modulos (2 barras con 1 espacio al medio, codicado: 101)
Central 5 modulos (3 espacios con 2 barras intercaladas, codicado: 01010)
barra y cada espacio pueden tener una anchura de una, dos, tres o cuatro unidades.
En la simbologa EAN pueden elegirse tres formas distintas de codicacion A, B y C para
representar cada dgito. Estas formas se utilizan para codicar los caracteres numericos ubicados
entre las posiciones 2 y 13.
Para representar la primera mitad del codigo de barras se emplea una combinacion de los
conjuntos numericos A y B, donde el orden de los conjuntos numericos utilizados representa a
su vez un septimo dgito, que aparece al principio de la secuencia de caracteres situada debajo
del codigo de barras. El conjunto numerico C se emplea solo para la segunda mitad del codigo
de barras, lo que provoca que el dispositivo lector pueda leer el codigo en cualquier sentido y
decodicarlo correctamente.
Por tanto los caracteres del tipo A y B estaran a la izquierda del separador central, mientras
que los del tipo C se ubican a la derecha del separador central, como se puede observar en la
Figura D.2.
Figura D.2.: Tipo de codicacion seg un la posicion
La codicacion para cada uno de los tres diferentes posibilidades se muestran en la Tabla D.3,
teniendo en cuenta que 1=negro y 0=blanco.
Las secuencias A y B de los caracteres ubicados en las posiciones de la 2 a la 7, determinan
el caracter numerico ubicado en la posicion 1. Este caracter no esta representado por barras ni
espacios y generalmente se imprime en la zona de la izquierda. En este punto hemos encontrado
58
Tabla D.3.: Representacion de cada dgito seg un el tipo de codicacion
Dgito Codicacion A Codicacion B Codicacion C
(Parte izquierda) (Parte izquierda) (Parte derecha)
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100
una cierta controversia en cuanto a que, seg un la fuente consultada, el caracter numerico de la
posicion 1 depende de la combinacion de los caracteres de la primera parte del codigo teniendo
en cuenta el tipo de codicacion como hemos comentado o por el contrario, es el primer caracter
el que determina la combinacion para cada uno de los seis primeros dgitos. Aunque por logica
parece mas probable la primera opcion, ya que el primer dgito no se encuentra codicado
dentro del codigo y por tanto los lectores no pueden saber de que dgito se trata. Las posibles
combinaciones que determinan el valor del primer dgito son las que se muestran en la Tabla D.4.
Tabla D.4.: Posibles combinaciones de los seis primeros dgitos del codigo
Posicion 1 Posicion 2 Posicion 3 Posicion 4 Posicion 5 Posicion 6 Primer dgito
A A A A A A 0
A A B A B B 1
A A B B A B 2
A A B B B A 3
A B A A B B 4
A B B A A B 5
A B B B A A 6
A B A B A B 7
A B A B B A 8
A B B A B A 9
Por ultimo, el dgito de vericacion se calcula siguiendo este procedimiento:
1. Multiplicar el valor de cada caracter en posicion par por 3.
2. Sumar entre s los 6 productos anteriores, cada uno de valor entre 0 y 27, mas los valores
de cada caracter en posicion impar, excepto la posicion 13, obteniendo as un valor que se
llama ((Suma de Productos)) (SP).
3. Dividir la suma de productos por 10 (constante), obteniendo un cociente (C) y un resto
(R), o sea C = [
SP
10
] y R = SP 10C.
4. Restarle a 10 el resto, obteniendo el valor del caracter de vericacion (CV ) que se ubicara en
la posicion 13 del codigo, es decir, CV = 10 R.
59
D. Caractersticas del codigo EAN-13
La autovericacion del caracter (CV ) recien calculado se realiza con el valor de la posicion
13. Si el valor obtenido coincide con el de la posicion 13, queda conrmado y vericado.
60
Bibliografa
[1] Aplicacion para manejo y visualizacion de imagenes. http://www.tele.ucl.ac.be/
PEOPLE/DOUXCHAMPS/ieee1394/coriander.

Ultimo acceso: Junio 2005.
[2] History of barcodes. http://www.basics.ie/History.htm.

Ultimo acceso: Junio 2005.
[3] Informacion general sobre codigos de barras. http://www.serebella.com/encyclopedia/
article-Barcode.html.

Ultimo acceso: Junio 2005.
[4] Informacion general sobre impresoras de codigos de barras. http://www.dimension-x.
com/cf-onsprn2.htm.

Ultimo acceso: Junio 2005.
[5] Kjersti Aas and Line Eikvil. Decoding bar codes from human-readable characters. Pattern
Recognitions Letters (PRL), 18:15191527, 1997.
[6] Russ Adams. Informacion general sobre codigos de barras. http://www.barcode-1.com.

Ultimo acceso: Junio 2005.


[7] Jorge Badenas Carpio, Jose Luis Llopis Borras, and Oscar Coltell Simon. Curso practico
de programacion en C y C++. Publicacions de la Universitat Jaume I, 1997.
[8] M. Cheriet, J.N. Said, and C. Y. Suen. A recursive thresholding techniques for image
segmentation. IEEE Transactions on Image Processing, 7:918921, 1998.
[9] Secretara de Estado de Cultura. Manual del Usuario, 2.
a
edicion espa nola, 2001. Traduccion
de ISBN Users Manual, 4th ed.
[10] Arturo de la Escalera Hueso. Vision por computador: fundamentos y metodos. Prentice
Hall, 2001.
[11] ivind Due Trier and Anil K. Jain. Goal-directed evaluation of binarization methods. IEEE
Transactions on Pattern Analysis and Machine Intelligence, 17:11911201, 1995.
[12] Nick Eord. Digital Image Processing. A Practical Introduction Using Java. Addison-
Wesley, 2000.
[13] H. Freeman and R. Shapira. Determining the minimum-area encasing rectangle for an
arbitrary closed curve. Communications of the ACM, 18:409413, 1975.
[14] Francisco Ortegon Gallego. L
A
T
E
X, primeros pasos. MASSON, S.A., 1992.
[15] C. Godin and P. Lockwood. DTW schemes for continuous speech recognition: a unied
view. Computer Speech and Language, 3:169198, 1989.
[16] Silicon Graphics. Standard Template Library Programmers Guide. http://www.sgi.com/
tech/stl.

Ultimo acceso: Junio 2005.
61
Bibliografa
[17] The MathWorks Inc. Image Acquisition Toolbox Users Guide. For Use with MATLAB.
20032005.
[18] Eugene Joseph and Theo Pavlidis. Bar code waveform recognition using peak locations.
IEEE Transactions on Pattern Analysis and Machine Intelligence, 16:630640, 1994.
[19] Joseph Kittler, Mohamad Hatef, Robert P.W. Duin, and Jiri Matas. On combining classi-
ers. IEEE Transactions on Pattern Analysis and Machine Intelligence, 20:226239, 1998.
[20] Vault Information Services LLC. EAN-13 Symbology. http://www.barcodeisland.com/
ean13.phtml.

Ultimo acceso: Junio 2005.
[21] Antonio M. Lopez, Felipe Lumbreras, Joan Serrat, and Juan J. Villanueva. Evaluation
of methods for ridge and valley detection. IEEE Transactions on Pattern Analysis and
Machine Intelligence, 21:327335, 1999.
[22] Ruben Mu niz, Luis Junco, and Adolfo Otero. A robust software barcode reader using
the Hough transform. IEEE International Conference on Information, Intelligence, and
Systems, pages 313319, 1999.
[23] Hermann Ney. The use of a one-stage dynamic programming algorithm for connected word
recognition. IEEE Trans. on ASSP, 32:263271, 1984.
[24] Gonzalo Pajares and Jes us M. de la Cruz. Vision por Computador. Imagenes digitales y
aplicaciones. Ra-Ma, 2001.
[25] L.R. Rabiner. A tutorial on hidden Markov models and selected applications in speech recog-
nition. Proceedings of the IEEE, 77:257286, 1989. http://www.ai.mit.edu/courses/6.
867-f02/papers/rabiner.pdf.
[26] Jun Rekimoto, Yuji Ayatsuka, and Kazuteru Hayashi. Augment-able reality: Situated com-
munication through physical and digital spaces. International Symposium on Wearable
Computers (ISWC), pages 6875, 1998.
[27] Stephen Shellhammer, David P. Goren, and Theo Pavlidis. Novel signal-processing tech-
niques in barcode scanning. IEEE Robotics & Automation Magazine, 6:5765, 1999.
[28] Peter Sundstrom. Bar code reader for surface mounting systems. http://www.f.kth.
se/~f96-psu/thesis.html, 2001. Master thesis on KTH - Kungliga Tekniska Hogskolan
[Royal Institute of Technology] (Stockholm).
[29] David Tschumperle. The C++ template image processing library. http://cimg.
sourceforge.net.

Ultimo acceso: Junio 2005.
[30] Todd Wittman. Deblurring and restoration in barcode signal processing. SIAM (Society
for Industrial and Applied Mathematics) News, 37, 2004.
[31] William J. Wolfe, Jim Gunderson, and Matthew E. Walworth. Computer vision barrel
inspection. Mobile Robots VIII, 2058:128133, 1993.
62

También podría gustarte