Как выровнять изображение - Matlab - PullRequest
12 голосов
/ 24 апреля 2011

Мне нужно знать, как выровнять изображение в Matlab для дальнейшей работы.

Например, у меня есть следующее изображение номерного знака, и я хочу распознать все цифры.

enter image description here

моя программа работает с прямыми изображениями, поэтому мне нужно выровнять изображение и затем отформатировать систему оптического распознавания.

Метод должен быть таким же, какуниверсальный, который подходит для всех видов пластин и под разными углами.

РЕДАКТИРОВАТЬ: Я пытался сделать это с Hough Transform, но я не добился успеха.Кто-нибудь может помочь мне сделать это?

любая помощь будет принята с благодарностью.

Ответы [ 4 ]

15 голосов
/ 03 июля 2011

Решение было сначала указано в комментариях @ AruniRC , а затем реализовано @ belisarius в Mathematica.Следующее - моя интерпретация в MATLAB.

Идея в основном та же: обнаружить края с помощью метода Canny, найти заметные линии с помощью преобразования Hough, вычислить углы линий, наконец выполнить преобразование сдвига для выравнивания изображения.

%# 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);

Теперь давайте посмотрим результаты

%# 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

6 голосов
/ 05 июня 2011

В Mathematica, с использованием распознавания краев и преобразования Хафа:

enter image description here

3 голосов
/ 24 апреля 2011

Если вы используете какой-то набор инструментов машинного обучения для распознавания текста, попробуйте учиться на ВСЕХ пластинах - не только на выровненных.Результаты распознавания должны быть одинаково хорошими, если вы преобразуете пластину или не делаете этого, поскольку при преобразовании никакая новая информация в соответствии с истинным числом не улучшит изображение.

0 голосов
/ 12 мая 2011

Если все изображения имеют темный фон, подобный этому, вы можете преобразовать изображение в двоичную форму, расположить линии сверху или снизу светлой области и рассчитать матрицу аффинной проекции из градиента линии.

...