Сдвинуть символы в двоичном изображении

Я работаю над распознаванием номерных знаков. Проблема в том, что мне нужно устранить перекос символов в двоичном изображении, чтобы повысить точность сопоставления с шаблоном.

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

Из ... преобразования оттенков серого в двоичный

введите описание изображения здесь

Затем .. методы предварительной обработки ..

введите описание изображения здесь

После сегментации ..

введите описание изображения здесь

Как видно на последнем изображении, символы перекошены, и это приведет к неточности сопоставления с шаблоном для выполнения целей распознавания.

Большинство исследователей используют преобразование Хафа для выполнения операции устранения перекоса, но есть ли более простой способ сделать это?


person Wong Wengkeong    schedule 16.05.2015    source источник


Ответы (2)


Есть способы справиться с этим. Некоторые на совпадающей части, чтобы избежать самой операции снятия перекоса, например:

Но вы хотите снять перекос так:

  1. определить угол поворота / наклон

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

    обзор алгоритма

  2. повернуть / повернуть назад

    Таким образом, либо используйте atan2 для получения угла, либо напрямую создайте двумерную однородную матрицу преобразования 3x3 на основе базисных векторов (одна - это линия, а вторая - ее перпендикулярный вектор). Для получения дополнительной информации см .:

  3. Теперь повернутое / не перекосившееся изображение будет по-прежнему перекошено с гораздо меньшей скоростью

    поэтому вы можете применить # 1, # 2 и к горизонтальной оси, но на этот раз вам нужно только открутить (не используйте вращение). Обычно коэффициент перекоса остатков невелик, поэтому в этом шаге нет необходимости.

[примечания]

Вы можете повысить точность, отфильтровав неправильные точки или тщательно выбрав начальную точку строк развертки, чтобы они попадали в нужное место символов (вы, очевидно, знаете количество символов).

[edit1] небольшой пример

Вот небольшой пример вывода для вашего изображения (отрицательный, поскольку мои функции ожидают белую бумагу и черный шрифт):

пример

Как видите, поворот и перекос намного меньше.

person Spektre    schedule 16.05.2015
comment
разве вращение изображения и выполнение компенсации перекоса не отличается? @Spektre - person Wong Wengkeong; 16.05.2015
comment
@WongWengkeong да, Deskew сдвигает точки вдоль одной оси, вращение изменяет будку x и y - person Spektre; 16.05.2015
comment
Итак ... если я собираюсь использовать функцию imrotate, будет ли она устранять асимметрию символов, если я состоит из прямого угла из вашего решения? @Spektre - person Wong Wengkeong; 16.05.2015
comment
@WongWengkeong Это зависит от изображения, если искажение связано с вращением между автомобилем и камерой FOV, тогда да (но вам нужно восстановить все вращения, а не только один в плоскости xy), если это вызвано чем-то еще, например, съемкой на бегу (каждая строка изображения сканируется в разное время, поэтому она смещается по скорости движения), то только частично. В любом случае, если вы восстановите наибольшее вращение / перекос, тогда остальное должно быть немного искажено, поэтому в большинстве случаев вы можете игнорировать его (если вы не сравниваете символы, сравнивая пиксели напрямую) - person Spektre; 17.05.2015
comment
Большое вам спасибо за ваше решение. в настоящее время я разработал ваше решение, и теперь у меня есть 4 точки координат (2 строки уравнения) .. Я пытаюсь получить для него тету. Я пытаюсь использовать atan2, но не могу получить точный угол. не могли бы вы показать мне, как это сделать? Мне очень жаль, что я задавал столько вопросов, кстати, @Spektre - person Wong Wengkeong; 17.05.2015
comment
@WongWengkeong 1. визуально нарисуйте найденные точки, чтобы убедиться, что они верны 2. atan2 в порядке, но я все равно использую atanxy вместо этого просто убедитесь, что ваш угол в радианах или градусах, и если вы указали правильный порядок операндов 3. вы можете использовать линейную регрессию / подгонку в 2D или вычислить наклон линии непосредственно из пар точек и выбрать наиболее часто встречающийся уклон (это должно устранить неправильные точки) - person Spektre; 17.05.2015

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

Вот код:

% load image
img = imread('skewed.png');
img = img(:, :, 1);
img = double(img);

% perform pca on cloud of white points
[r, c] = find(img);
coeff = pca([r,c]);
angle = atan2(coeff(1,1), coeff(1,2));

% rotate back
img = imrotate(img, angle / pi * 180);
imwrite(img > 0, 'deskewed.png');

Вход:

введите описание изображения здесь

Выход (угол поворота ~ 10,3 град.):

введите описание изображения здесь

person Trilarion    schedule 19.09.2016