代码之家  ›  专栏  ›  技术社区  ›  Arun Gowda

删除文本周围的黑色边框/框以获得更好的OCR?

  •  1
  • Arun Gowda  · 技术社区  · 7 年前

    如下图所示,文本的边界给OCR带来了非常糟糕的结果。

    enter image description here

    enter image description here

    所以我使用javaCV(javawrapperforopencv)删除图像中文本周围的边框和框。结果相当令人满意。但我现在面临的问题是,它正在删除文本的水平和垂直行,就像下面的例子一样。

    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 回复  |  直到 7 年前
        1
  •  0
  •   marco romelli    7 年前

    我认为一种更稳健的方法是首先检测边缘和轮廓。

    在这之后,你应该找到对应于矩形的轮廓。要做到这一点,你可以比较所有轮廓的面积,找到最常见的一个,这将最有可能对应于矩形的面积,因为它们都是相同的。

    推荐文章