2011-04-24 40 views
12

Necesito saber cómo alinear una imagen en Matlab para seguir trabajando.Cómo alinear la imagen - Matlab

por ejemplo tengo la siguiente imagen de matrícula y quiero reconocer todos los dígitos .

enter image description here

mi programa funciona para imágenes rectas lo tanto, necesito para alinear la imagen y luego preforma el sistema de reconocimiento óptico.

El método debe ser tanto como universal que se adapte a todo tipo de placas y en todo tipo de ángulos.

EDIT: Intenté hacer esto con Hough Transform pero no tuve éxito. ¿alguien puede ayudarme a hacer esto?

cualquier ayuda será muy apreciada.

+3

si esto fuera yo diría que OpenCV encontrar el más prominente línea de Hough casi horizontal, calcular su ángulo, a continuación, hacer una transformación afín con una matriz de rotación con el ángulo calculado previamente. ¿Esto tiene algún equivalente en matlab? Entonces puede que le sea útil. – AruniRC

Respuesta

15

La solución se dio a entender primero a por @AruniRC en los comentarios, a continuación, implementado por @belisarius en Mathematica. La siguiente es mi interpretación en MATLAB.

La idea es básicamente la misma: detectar bordes utilizando el método de Canny, encontrar líneas prominentes usando Hough Transform, calcular ángulos de línea, finalmente realizar una transformación de corte para alinear la imagen.

%# read and crop image 
I = imread('http://i.stack.imgur.com/CJHaA.png'); 
I = I(:,1:end-3,:);  %# remove small white band on the side 

%# egde detection 
BW = edge(rgb2gray(I), 'canny'); 

%# hough transform 
[H T R] = hough(BW); 
P = houghpeaks(H, 4, 'threshold',ceil(0.75*max(H(:)))); 
lines = houghlines(BW, T, R, P); 

%# shearing transforma 
slopes = vertcat(lines.point2) - vertcat(lines.point1); 
slopes = slopes(:,2) ./ slopes(:,1); 
TFORM = maketform('affine', [1 -slopes(1) 0 ; 0 1 0 ; 0 0 1]); 
II = imtransform(I, TFORM); 

Ahora vamos a ver los resultados

%# show edges 
figure, imshow(BW) 

%# show accumlation matrix and peaks 
figure, imshow(imadjust(mat2gray(H)), [], 'XData',T, 'YData',R, 'InitialMagnification','fit') 
xlabel('\theta (degrees)'), ylabel('\rho'), colormap(hot), colorbar 
hold on, plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2), hold off 
axis on, axis normal 

%# show image with lines overlayed, and the aligned/rotated image 
figure 
subplot(121), imshow(I), hold on 
for k = 1:length(lines) 
    xy = [lines(k).point1; lines(k).point2]; 
    plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2); 
end, hold off 
subplot(122), imshow(II) 

canny_edges hough_transform lines_overlayed_image_aligned

+0

Fantástica respuesta. Gracias Amro. +1. – rayryeng

3

Si está utilizando algún tipo de caja de herramientas de aprendizaje automático para el reconocimiento de texto, intente aprender de TODAS las placas, no solo de las alineadas. Los resultados del reconocimiento deberían ser igualmente correctos si transforma el plato o no lo hace, ya que mediante la transformación, ninguna información nueva de acuerdo con el número real mejorará la imagen.

0

Si todas las imágenes tienen un fondo oscuro como ese, puede binarizar la imagen, ajustar las líneas en la parte superior o inferior del área brillante y calcular una matriz de proyección afín desde el degradado de línea.

+0

gracias por su respuesta. Estoy ejecutando binarización en todas las imágenes, así que sí, el fondo sería así. ¿Cómo puedo ajustar las líneas? –

6

En Mathematica, usando detección de bordes y transformada de Hough:

enter image description here

+0

gracias por su respuesta. ¿sabes cómo hacer eso en Matlab? mis habilidades de Matlab no son tan buenas ... –

+2

@Michael Lo sentimos, no Matlab aquí. Pero tienes las palabras clave: Hough Transform, Edge Detection, Shearing Transform. –

+1

@Michael, @belisarius: publiqué una solución en MATLAB inspirada en esta – Amro

Cuestiones relacionadas