OCR Preprocessing: удаление символов, пересекающих строки - PullRequest
0 голосов
/ 04 июня 2019

В настоящее время я пытаюсь улучшить скорость распознавания GoogleCloud Vision , поэтому я создаю конвейер предварительной обработки.

В настоящее время я могу создать маску, которая накладывает символы на изображении, но, как вы можете видеть в примерах ниже, он также показывает линии.Теперь, поскольку эти строки могут пересекать символы, я бы хотел удалить их из маски, не удаляя символы, если это возможно.

Текущие шаги:

Обнаружение линии: InputImage -> Grayscale -> Blackhat -> GaussianBlur -> Threshhold (OTSU) -> HoughLinesP

Генерация маски: InputImage -> Grayscale -> Blackhat -> GaussianBlur -> Threshhold (OTSU) -> ConnectedComponents

Примеры изображений:(Из-за защиты конфиденциальности обмен полным изображением невозможен)

Region in original image Current Mask Recognized lines

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

Mat picture = Imgcodecs.imread(path);
Imgproc.cvtColor(picture, picture, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("/home/meik/Pictures/asdfGray.png", picture);
Mat blackhatElement = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, new Size(7, 7));

Imgproc.morphologyEx(picture, picture, Imgproc.MORPH_BLACKHAT, blackhatElement);
Imgproc.GaussianBlur(picture, picture, new Size(5, 3), 0);
Imgproc.threshold(picture, picture, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);

/**
 * Line Detection with Canny and HoughLines(P)
 */
Mat lines = new Mat();
Mat linesResult = Mat.zeros(picture.rows(),picture.cols(), CvType.CV_8UC1);
Imgproc.HoughLinesP(picture, lines,1, Math.PI/180,100, 20, 0);
System.out.println("lines rows:" + lines.rows());
for (int x = 0; x < lines.rows(); x++) {
    double[] l = lines.get(x, 0);
    Imgproc.line(linesResult, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(255, 255, 255), 1, Imgproc.LINE_8, 0);
}
/**End of line detection*/
Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_CROSS, new Size(3,3));
Imgproc.dilate(linesResult,linesResult,kernel);
Core.bitwise_not(linesResult,linesResult);

Я нашел в этой статье , где говорится о проблеме, но я пытаюсь понять их методологию.

Как мне продолжить удаление строк, не уничтожая символы?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

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

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

используйте эту информацию для создания маскирующего изображения.

Затем используйте opencv inpaint, чтобы удалить его.

https://docs.opencv.org/2.4/modules/photo/doc/inpainting.html

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

enter image description here

0 голосов
/ 04 июня 2019

Как насчет простой предварительной обработки изображений?
Например, использование порога для поддержания только определенного цветового диапазона (вместо непосредственного преобразования изображения в оттенки серого).

Что-то подобное интегрировано в GIMP,см. https://docs.gimp.org/2.8/en/gimp-tool-threshold.html

Возможно, вы хотите поэкспериментировать с различными пороговыми значениями.

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