Извлечение номерного знака из изображения автомобиля

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

когда я загружаю это изображение в механизм распознавания текста tesseract, он, кажется, обнаруживает символ «L» перед «C», поэтому я думаю об удалении оставшихся черных пикселей вокруг области номерного знака. есть ли особый подход, который я могу предпринять, чтобы разобраться в этом? В этом случае я использую библиотеку aforge.net.

Ваше здоровье


person Mr.Noob    schedule 03.08.2012    source источник
comment
хорошо, если перед вашим результатом всегда стоит 1 L, почему бы просто не игнорировать первую L? :-)   -  person mtijn    schedule 03.08.2012
comment
Ну, это всего лишь один номерной знак и один случай. Я полагаю, что механизм OCR считает черную область частью персонажа. поэтому моя проблема состоит в том, чтобы устранить область черных пикселей вокруг номерного знака.   -  person Mr.Noob    schedule 03.08.2012


Ответы (1)


Один из подходов к полуавтоматическому удалению областей черных пикселей вокруг номерного знака может заключаться в применении .htm" rel="nofollow noreferrer">PointedColorFloodFill фильтрует четыре раза, размещая начальные точки заливки в четырех углах изображения.

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

var filter = new PointedColorFloodFill();
filter.FillColor = Color.White;
filter.Tolerance = Color.FromArgb(60, 60, 60);

filter.StartingPoint = new IntPoint(0, 0);
filter.ApplyInPlace(image);
filter.StartingPoint = new IntPoint(image.Size.Width - 1, 0);
filter.ApplyInPlace(image);
filter.StartingPoint = new IntPoint(image.Size.Width - 1, image.Size.Height - 1);
filter.ApplyInPlace(image);
filter.StartingPoint = new IntPoint(0, image.Size.Height - 1);
filter.ApplyInPlace(image);

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

Заливной номерной знак

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

ОБНОВЛЕНИЕ Я наткнулся на BradleyLocalThresholding, который может дать вам еще лучшую отправную точку для распознавания OCR. Этот фильтр можно только применять к изображениям с разрешением 8 бит/с, что можно решить, например, сначала применив Оттенки серого на исходном изображении. Если вы добавите следующие четыре строки перед кодом PointedColorFloodFill:

var grayFilter = new Grayscale(0.3, 0.3, 0.3);
var image = grayFilter.Apply(originalImage);

var bradleyfilter = new BradleyLocalThresholding();
bradleyfilter.ApplyInPlace(image);

и уменьшите допуск PointedColorFloodFill, например, до 10 для каждого компонента RGB:

filter.Tolerance = Color.FromArgb(10, 10, 10);

полностью отфильтрованный номерной знак теперь будет выглядеть так:

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

person Anders Gustafsson    schedule 03.08.2012
comment
попробовал, но, похоже, выдает исключение, говорящее, что исходный формат пикселей не поддерживается. любая идея об этом? - person Mr.Noob; 03.08.2012
comment
Согласно документации поддерживаются 8-битные изображения в оттенках серого и 24-битные цветные изображения. Чтобы быть в безопасности, возможно, вы можете клонировать изображение в изображение 8bpp перед применением фильтра: var clonedImg = Image.Clone(origImg, PixelFormat.Format8bppIndexed); - person Anders Gustafsson; 03.08.2012
comment
Я немного потерялся с этой штукой. Можете ли вы посоветовать мне, какие цветовые диапазоны я должен использовать для удаления окружающих черных пикселей? - person Mr.Noob; 05.08.2012
comment
@hypertunes Я добавил код, чтобы проиллюстрировать фильтрацию заливки. Надеюсь, что достаточно. - person Anders Gustafsson; 06.08.2012
comment
Вау, это выглядит многообещающе для меня @Anders. Я сейчас на работе, проверю и сообщу. Большое спасибо за ваши усилия, друг! - person Mr.Noob; 06.08.2012
comment
фильтр по-прежнему выдает исключение, говорящее, что формат исходного пикселя не поддерживается этим фильтром. любая идея об этом? - person Mr.Noob; 06.08.2012
comment
Можете ли вы сделать исходное изображение доступным для скачивания где-нибудь? Какой фильтр жалуется прямо сейчас? Я понимаю, что порядок моего кода может немного сбивать с толку; убедитесь, что вы сначала передаете исходное изображение фильтру в градациях серого, а затем уже работаете с отфильтрованным в градациях серого изображением. - person Anders Gustafsson; 06.08.2012
comment
Эй, Андерс, мне удалось разобраться. что-то было не так с индексацией пикселей. это, кажется, работает как шарм, я также добавил несколько операций закрытия и открытия, чтобы удалить оставшийся черный пиксель вокруг текста. - person Mr.Noob; 07.08.2012
comment
просто быстрый вопрос, можете ли вы сказать мне причину использования image.size.width-1 и с высотой аналогично. Как вы сказали, фильтр заливки нужно делать со всех четырех углов изображения. так как эти аргументы будут работать с ним? Я просто пытаюсь понять логику его использования. - person Mr.Noob; 07.08.2012
comment
image.Size.Width - 1 и image.Size.Height - 1 — это максимальные координаты по ширине и высоте изображения соответственно, поскольку минимальные координаты — (0, 0). Я просто размещаю свои начальные пиксели в четырех углах, используя комбинации этих координат, и заливаю заливкой в ​​тех направлениях, которые ему доступны. - person Anders Gustafsson; 07.08.2012
comment
давайте продолжим это обсуждение в чате - person Mr.Noob; 07.08.2012