Извлечение номерного знака из изображения транспортного средства
Я разрабатываю приложение anpr, и мне удалось найти область номерного знака на изображении автомобиля.
Когда я передаю это изображение в Tesseract OCR engine, оно, кажется, обнаруживает символ " L "перед" C", поэтому я думаю о том, чтобы убрать оставшиеся черные пиксели вокруг области номерного знака. есть ли какой-то особый подход, который я могу использовать, чтобы разобраться в этом? Я использую aforge.net библиотека в этом случае
Ура
1 ответ:
Один из подходов к полуавтоматическому удалению черных пиксельных областей вокруг номерного знака может заключаться в применении фильтра 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. Этот фильтр может только быть применен к изображениям 8bpp, которые вы могли бы решить, например, сначала применив фильтр оттенков серого на исходном изображении. Если перед кодом
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);