análisis de imágenes: reconocimiento de letras
Post on 08-Jul-2015
130 Views
Preview:
TRANSCRIPT
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
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina1
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ísticas Clasificación
Resultado/ diagnóstico
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina2
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].
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina3
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].
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina4
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:
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina5
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);
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina6
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.
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina7
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.
Análisis de imágenes. CICATA – IPN, Unidad Qro.
Pág
ina8
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).
top related