Удалить черную рамку / рамки вокруг текста для лучшего распознавания текста? - PullRequest
0 голосов
/ 09 октября 2018

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

enter image description here

enter image description here

Поэтому я использую javaCV (упаковщик Java для OpenCV), чтобы удалить границы и рамки вокруг текста на изображении.Результаты были вполне удовлетворительными.Но проблема, с которой я сейчас сталкиваюсь, заключается в том, что она удаляет горизонтальные и вертикальные строки текста, как в следующем примере.

enter image description here

ГоризонтальнаяУдаленные линии перерисовываются другим цветом.

Я выполняю следующие шаги для удаления границ

  1. Находим горизонтальные и вертикальные контуры, определяющие высоту и ширину контуров.
  2. Заполните контуры белым цветом.

Я прикрепил свои фрагменты кода ниже.

public void removeBorder( String filePath )
{
    Mat grayImage = Imgcodecs.imread( filePath, Imgcodecs.IMREAD_GRAYSCALE );
    Mat thresholdInverted = new Mat();
    Imgproc.threshold( grayImage, thresholdInverted, 127.0, 255.0, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU );
    Imgcodecs.imwrite( "E:/threholded.jpg", thresholdInverted );


    List<MatOfPoint> horizontalContours = morphOpenAndFindContours( thresholdInverted, new Size( 5, 1 ));


    List<MatOfPoint> verticalContours = morphOpenAndFindContours( thresholdInverted, new Size( 1, 10 ));

    this.drawWhiteContours( verticalContours, grayImage );
    this.drawWhiteContours( horizontalContours, grayImage );
    Imgcodecs.imwrite( "E:/result.jpg", grayImage );
}

private List<MatOfPoint> morphOpenAndFindContours( Mat img, Size kSize)
{
    Mat kernel = Imgproc.getStructuringElement( Imgproc.MORPH_RECT, kSize );

    Mat openedImage = new Mat();
    Imgproc.morphologyEx( img, openedImage, Imgproc.MORPH_OPEN, kernel, new Point( -1, -1 ), 1 );
    Mat dilateKernel = Imgproc.getStructuringElement( Imgproc.MORPH_RECT, new Size( 5, 5 ) );

    Imgproc.dilate( openedImage, openedImage, dilateKernel );

    List<MatOfPoint> contours = new ArrayList<>();

    Imgproc.findContours( openedImage, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE );

    return contours;
}


private void drawWhiteContours( List<MatOfPoint> contours, Mat image )
{
    for ( int i = 0; i < contours.size(); i++ ) {
        Imgproc.drawContours( image, contours, i, new Scalar( 255 ), -1 );
    }
}

Итак, как я могу удалить только границы, не затрагиваятекст?решение на Java предпочтительнее, но я в порядке с python.

1 Ответ

0 голосов
/ 09 октября 2018

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

После этого вы должны найти контуры, соответствующие прямоугольникам.Для этого вы можете сравнить площадь всех контуров и найти наиболее распространенный, который, скорее всего, будет соответствовать площади прямоугольников, поскольку все они одинаковы.

...