Реализация алгоритма обнаружения номерных знаковJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Реализация алгоритма обнаружения номерных знаков

Сообщение Anonymous »

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

Первым шагом является обнаружение, для которого я решил реализовать недавнюю статью под названием «Надежный и эффективный подход к обнаружению номерных знаков». В статье очень хорошо представлена ​​их идея и использованы довольно простые методы обнаружения. Помимо некоторых деталей, отсутствующих в статье, я реализовал билинейную понижающую дискретизацию, преобразование в шкалу серого, а также окантовку + адаптивную пороговую обработку, как описано в разделах 3A, 3B.1 и 3B.2.
К сожалению, я не получаю результат, представленный в этой статье, например. рисунки 3 и 6.

Для тестирования я использую следующее изображение:

Изображение


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

Изображение


Далее первоначальное обнаружение границ с использованием описанного фильтра Собеля. В результате получается изображение, подобное изображениям, представленным на рисунке 6 статьи.

[img]https://i. sstatic.net/VswGc.png[/img]


И наконец, чтобы удалить «слабые края», они применяют адаптивное пороговое определение с использованием окна 20x20. Вот где все идет не так.

[img]https://i.sstatic. net/f6hcp.png[/img]


Как видите, он не работает должным образом, хотя я использую заявленные значения параметров. Кроме того, я попробовал:
  • Изменение бета-параметра.
  • Используйте массив 2d int вместо Растровые объекты для упрощения создания целостного изображения.
  • Попробуйте увеличить параметр «Гамма», чтобы при первоначальном обнаружении краев было больше «краев».
  • Измените окно. например 10x10.
Однако ни одно из изменений не привело к улучшению; он продолжает создавать изображения, как показано выше. Мой вопрос: что я делаю иначе, чем описано в статье? и как я могу получить желаемый результат?

Код

Код (очищенный), который я использую:

public int[][] toGrayscale(Bitmap bmpOriginal) {

int width = bmpOriginal.getWidth();
int height = bmpOriginal.getHeight();

// color information
int A, R, G, B;
int pixel;

int[][] greys = new int[width][height];

// scan through all pixels
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
// get pixel color
pixel = bmpOriginal.getPixel(x, y);
R = Color.red(pixel);
G = Color.green(pixel);
B = Color.blue(pixel);
int gray = (int) (0.2989 * R + 0.5870 * G + 0.1140 * B);
greys[x][y] = gray;
}
}
return greys;
}


Код для обнаружения краев:

private int[][] detectEges(int[][] detectionBitmap) {

int width = detectionBitmap.length;
int height = detectionBitmap[0].length;
int[][] edges = new int[width][height];

// Loop over all pixels in the bitmap
int c1 = 0;
int c2 = 0;
for (int y = 0; y < height; y++) {
for (int x = 2; x < width -2; x++) {
// Calculate d0 for each pixel
int p0 = detectionBitmap[x][y];
int p1 = detectionBitmap[x-1][y];
int p2 = detectionBitmap[x+1][y];
int p3 = detectionBitmap[x-2][y];
int p4 = detectionBitmap[x+2][y];

int d0 = Math.abs(p1 + p2 - 2*p0) + Math.abs(p3 + p4 - 2*p0);
if(d0 >= Gamma) {
c1++;
edges[x][y] = Gamma;
} else {
c2++;
edges[x][y] = d0;
}
}
}
return edges;
}


Код для адаптивного определения порогов. Реализация SAT взята отсюда:

private int[][] AdaptiveThreshold(int[][] detectionBitmap) {

// Create the integral image
processSummedAreaTable(detectionBitmap);

int width = detectionBitmap.length;
int height = detectionBitmap[0].length;

int[][] binaryImage = new int[width][height];

int white = 0;
int black = 0;
int h_w = 20; // The window size
int half = h_w/2;

// Loop over all pixels in the bitmap
for (int y = half; y < height - half; y++) {
for (int x = half; x < width - half; x++) {
// Calculate d0 for each pixel
int sum = 0;
for(int k = -half; k < half - 1; k++) {
for (int j = -half; j < half - 1; j++) {
sum += detectionBitmap[x + k][y + j];
}
}

if(detectionBitmap[x][y] >= (sum / (h_w * h_w)) * Beta) {
binaryImage[x][y] = 255;
white++;
} else {
binaryImage[x][y] = 0;
black++;
}
}
}
return binaryImage;
}

/**
* Process given matrix into its summed area table (in-place)
* O(MN) time, O(1) space
* @param matrix source matrix
*/
private void processSummedAreaTable(int[][] matrix) {
int rowSize = matrix.length;
int colSize = matrix[0].length;
for (int i=0; i

Подробнее здесь: https://stackoverflow.com/questions/480 ... -algorithm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»