我正在 Android 平台上创建数独解决应用程序,并且在处理图像时遇到了问题。我正在尝试使用 OpenCV 使用 Sobel 过滤器找到拼图的水平线,然后使用 Otsu 算法进行阈值处理:
Mat kernaly = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(10,2));
Mat dy = new Mat();
Mat close = new Mat();
Imgproc.Sobel(img, dy, CvType.CV_16S, 0, 2);
Core.convertScaleAbs(dy, dy);
Core.normalize(dy,dy,0,255,Core.NORM_MINMAX);
Imgproc.threshold(dy, close, 0, 255, Imgproc.THRESH_BINARY|Imgproc.THRESH_OTSU);
Imgproc.morphologyEx(close, close, Imgproc.MORPH_DILATE, kernaly);
这种方法实际上适用于大多数图像,例如:
但是,以下图像失败:
有人可以解释为什么结果如此不同,而上面的第二张图片只返回一行吗?另外,我是否应该只使用另一种方法,例如 Canny 或 Hough 线?
提前致谢!
编辑:使用 marol 的建议,我尝试尽可能多地删除黑色边框,而不必扭曲图像。这是将上述相同过程应用于这些重新处理的图像时的结果。
图 1:
图 2:
如您所见,结果更好,因为已检测到大多数行。但是,它仍然不够好。它可以通过添加一个固定的阈值来改进,但是对于每个图像来说必须是不同的。
我可能会使用一种新方法,因为这种方法似乎不够健壮。任何提示将不胜感激。