Impact of international standardization in Mexico/ Impacto de normas internac...
Análisis de imágenes: reconocimiento de letras
1. Sandra Lucía de la Fuente Bermúdez
Análisis de imágenes
Dr. José Joel González Barbosa.
CICATA – IPN Unidad Querétaro.
2014-06-01
Tarea. Reconocimiento de Letras
2. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página1
Resumen. El presente documento, reporta una metodología para la detección de letras T
y Y, utilizando diversas herramientas vistas en el curso de análisis de imágenes.
Introducción
La detección y reconocimiento de objetos/características por medio de
imágenes, es una técnica muy utilizada, debido a su alta efectividad y a que es un
método no abrasivo. Es utilizado en la industria (i.e. en la detección de fallas y
esfuerzos mecánicos), en medicina (i.e. en la detección de lesiones y
enfermedades), y en la construcción (i.e. en la detección de fallas en el
pavimento), por mencionar algunas aplicaciones. Este reporte sugiere el
reconocimiento de letras T y Y, por medio de detección de líneas mediante la
transformada de Hough. Esta solución es muy sencilla, debido al alcance de la
tarea.
Desarrollo
La imagen se procesa como se muestra en el diagrama de la figura 1.
Figura 1. Diagrama de procesamiento digital de imágenes.
Obtención de la
imagen
Preprocesamiento Segmentación
Detección de
CaracterísticasClasificación
Resultado/
diagnóstico
3. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página2
La imagen (figura 2) utilizada fué editada en CorelDraw® en formato .PNG para
una mejor detección de contornos.
Figura 2. Imagen original.
Para el pre-procesamiento, se binarizó la imagen (figura 3), mediante la detección
automática del umbral mediante la técnica de Otsu [1,2], preparando la imagen
para la segmentación.
Figura 3. Imagen binarizada.
Para la segmentación, antes identifico los objetos, es decir la cantidad de letras,
en la imagen mediante la función bwconncomp (bw,n), donde bw es la imagen
binaria, y n es el parámetro de conectividad (4, 8, o arbitrario). La función
bwconncomp encuentra todos los objetos conectados en una imagen binaria [3].
4. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página3
Seguido de la detección de objetos, cada objeto es etiquetado con el mismo valor
entero, para este caso, lo llamamos image (ver código). Posteriormente, es
mostrado gráficamente cada objeto, para ser recortado de manera personalizada
(figura 4) y hacer más eficiente en tiempo y memoria la ejecución del código.
Figura 4. Recorte personalizado de la letra detectada.
Seguido de esto, se procede a la detección de bordes mediante el cálculo del
gradiente del objeto, para simplificar el proceso (figura 5).
Figura 5. Borde del objeto.
Para la detección de características, se obtiene el número de líneas de longitud
mínima a la mitad del largo de la letra, basado en la transformada de Hough [4-6].
5. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página4
Código
%% Limpieza del código
clear all; close all; imtool close all; clc; warning off
%% Inicialización de variables
Ix=[-1,0,1; -1,0,1;-1,0,1]; Iy=Ix';
n_t=0; n_y=0;
%% Obtención de la imagen
I=imread('Letras.png');
%% Pre-procesamiento
level=graythresh(I);
Ibin = im2bw(I, level); % Binarización de imagen
set(0,'DefaultFigureWindowStyle','docked'),
figure(1), imshow(Ibin), title(['fontsize{20}{color[rgb]{0 .5 .4}Imagen
original binarizada}']);
%% Segmentación
% Detección de objetos
cc=bwconncomp(Ibin,8); % Detección de objetos con 8 vecindades
cc.NumObjects; % Número de objetos detectados
% Etiquetado de objetos
for (n=1:cc.NumObjects)
image{n} = false(size(Ibin));
image{n}(cc.PixelIdxList{n}) = true;
figure, imshow(image{n}),
title(['fontsize{20}{color[rgb]{.2 .5 .2}Seleccione la zona de interés
de la imagen}']);
image{n}=imcrop; %Recorte de imagen (para incrementar la rapidez de
procesamiento).
end
close all, clc % Limpieza
%% Detección de características:
figure(1), imshow(Ibin), title(['fontsize{20}{color[rgb]{0 .5 .4}Imagen
original binarizada}']);
for (n=1:cc.NumObjects)
ima = double(image{n});
% Detección de bordes:
Convf_x= conv2(ima,Ix,'same');
Convf_y= conv2(ima,Iy,'same');
Gradientef{n}=sqrt((power(Convf_x,2))+(power(Convf_y,2)));% Gradiente de
la imagen
% figure ('Name', 'Gradiente'), imshow(Gradientef{n}), title('Detección
de contornos: Gradiente');
BW=Gradientef{n};
%% Identificación de línea mayor en el objeto, por medio de Hough, para
establecer un patrón de umbral en la detección de líneas (esto permite
detectar líneas en base a la proporción del tamaño particular del
objeto/letra de estudio):
[H,T,R] = hough(BW); % Transformada de Hough
P = houghpeaks(H,6,'threshold',ceil(0.3*max(H(:))));% Identificación de
picos/ puntos de inflexión en la transformada de Hough
x = T(P(:,2)); y = R(P(:,1));
% Extracción de segmentos de líneas en base a la transformada de Hough
lines = houghlines(BW,T,R,P,'FillGap',100,'MinLength',200); % Find lines
and plot them
max_len = 0;
%% Identificación de líneas por medio de Hough:
6. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página5
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
len = norm(lines(k).point1 - lines(k).point2); % Determine the
endpoints of the longest line segment
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
BW=Gradientef{n}; %% Ajuste de detección de líneas para cada imagen:
[H,T,R] = hough(BW); % Transformada de Hough
P = houghpeaks(H,6,'threshold',ceil(0.3*max(H(:)))); % Identificación de
picos/ puntos de inflexión en la transformada de Hough
x = T(P(:,2)); y = R(P(:,1));
% Extracción de segmentos de líneas en base a la transformada de Hough
lines = houghlines(BW,T,R,P,'FillGap',100,'MinLength',max_len/2); %Ajuste
de detección de líneas: el umbral es la mitad de la longitud de la línea
mayor detectada.
figure, imshow(BW), hold on
max_len = 0;
%% Representación gráfica de las líneas detectadas:
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); % Plot
beginnings and ends of lines
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
len = norm(lines(k).point1 - lines(k).point2); % Determine the
endpoints of the longest line segment
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
%% Clasificación
if(length(lines)==4) %Si existen cuatro líneas, se trata de una T, en
otro caso, se trata de una Y.
title(['fontsize{18}{color[rgb]{.3 .3 .7}Tenemos una T}'])
Str=sprintf('Nota: el número de líneas detectadas para la figura
%g=%g. La letra detectada es una T!',n,length(lines));
n_t=n_t+1;
else
title(['fontsize{18}{color[rgb]{.3 .3 .7}Tenemos una Y}'])
Str=sprintf('Nota: el número de líneas detectadas para la figura
%g=%g. La letra detectada es una Y!',n,length(lines));
n_y=n_y+1;
end
annotation('textbox', [0,0,0.1,0.1],...
'String', Str);
end
%% Resultado
Str_f=sprintf('Tenemos un total de %g letras T y %g letras Y en la
figura.',n_t,n_y);
figure (1),
annotation('textbox', [0,0,0.1,0.1],...
'String', Str_f);
7. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página6
Resultados
Después de extraer el número de líneas de cada objeto, se procede a su
clasificación. Se tiene la característica principal que, para cada letra T involucrada
en el procesamiento, sin excepción, presenta cuatro líneas (figura 6), mientras
que para cada letra Y procesada, sin excepción, presenta 6, y en un caso singular,
5 líneas (figura 7). De aquí se definen los términos para clasificar la letra T y Y.
Figura 6. Detección de letra T.
Figura 7. Detección de letra Y.
8. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página7
La clasificación anterior nos permite definir la cantidad de letras T y Y en la imagen
(figura 8).
Figura 8. Resultado de imagen 1.
Como estudio adicional, genero una imagen similar con rotaciones en las letras y
variaciones en las proporciones típicas, el resultado es satisfactorio (figura 9).
Figura 9. Resultado de la imagen 2.
9. Análisis de imágenes. CICATA – IPN, Unidad Qro.
Página8
Conclusiones
Después de analizar varias características (detección de la zona de cruce de
líneas en cada letra por máscara, transformada particular de Fourier, y número de
líneas), se decidió conveniente y práctico analizar la imagen clasificando la letra
según la cantidad de líneas en el objeto de estudio; este método es funcional,
rápido, y eficiente. Se cubrió la necesidad del alcance planteada, de manera
robusta, siempre y cuando la imagen esté en formato PNG.
Si la imagen se encuentra en formato JPEG, se deberá adaptar el código para una
correcta detección de líneas.
No se realizaron pruebas en imágenes con otros caractéres.
Referencias
[1] X. Xu, S. Xu, L. Jin, and E. Song. “Characteristic analysis of Otsu threshold and its
applications,” ELSEVIER. China, 2010.
[2] MathWorks. “Im2bw,” Matlab Documentation Center (mathworks.com).
[3] MathWorks. “Image Processing Toolbox 7. User’s Guide,” MATLAB.
[4] MathWorks. “hough,” Matlab Documentation Center (mathworks.com).
[5] MathWorks. “houghpeaks,” Matlab Documentation Center (mathworks.com).
[6] MathWorks. “houghlines,” Matlab Documentation Center (mathworks.com).