2011-04-24 6 views
12

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

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

enter image description here

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

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

EDIT: Я попытался сделать это с помощью преобразования Hough, но я не преуспел. кто-нибудь может мне помочь?

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

+3

если бы это было OpenCV я бы сказал, что найти наиболее видную почти горизонтальной линии Хафа, вычислить его угол, а затем делают аффинное преобразование с матрицей вращения с углом, как было рассчитано ранее. Имеет ли это какой-либо эквивалент matlab? Тогда вы можете найти это полезным. – AruniRC

ответ

15

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

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

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

+0

Фантастический ответ. Спасибо Amro. +1. – rayryeng

3

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

0

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

+0

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

6

В Mathematica, с помощью пограничного Обнаружение и Хью Transform:

enter image description here

+0

спасибо за ваш ответ. вы знаете, как это сделать в Matlab? мои навыки Matlab не так хороши ... –

+2

@Michael Извините, нет Matlab здесь. Но у вас есть ключевые слова: Hough Transform, Edge Detection, Shearing Transform. –

+1

@Michael, @belisarius: Я разместил решение в MATLAB, вдохновленное этим – Amro

Смежные вопросы