我目前正在尝试提高GoogleCloud Vision的识别率,因此我正在建立预处理管道。
我目前可以创建一个遮罩图像中的字符的遮罩,但是正如您在下面的示例中看到的那样,它也显示了线条。现在,由于这些行可以穿过字符,因此,如果可能的话,我想将它们从蒙版中删除而不破坏字符。
当前步骤:
线路检测: InputImage->灰度->黑帽->高斯模糊->阈值(OTSU)-> HoughLinesP
蒙版生成:InputImage->灰度-> Blackhat-> GaussianBlur->阈值(OTSU)-> ConnectedComponents
ImageExamples :(由于受到隐私保护,因此无法共享完整的图像)
图像显示原始图像,蒙版和识别的线条。 以下代码用于生成遮罩并找到线段
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);
我发现this paper在谈论这个问题,但正在努力了解他们的方法。
如何从这里开始删除行而不破坏字符?
答案 0 :(得分:1)
我真的不认为您需要参考纸才能做到这一点。
只需使用颜色信息或粗线即可找出很长的直线
使用该信息创建蒙版图像。
然后使用opencv inpaint将其删除。
https://docs.opencv.org/2.4/modules/photo/doc/inpainting.html
例如您想要的与下图类似。它要求拆除交通信号灯杆。并且您希望删除写作指南。本质上是同一件事
答案 1 :(得分:0)
一些简单的图像预处理怎么样?
例如,使用阈值仅保持一定的颜色范围(而不是直接将图像转换为灰度)。
GIMP中集成了类似的内容,请参见 https://docs.gimp.org/2.8/en/gimp-tool-threshold.html
您可能想尝试各种阈值。