自己的问题的答案由于近一周后没有答案,我现在的计划是:
我在另一个 SO 帖子上发现了Canny 边缘检测算法的提及,然后发现:
[http://www.tomgibara.com/computer-vision/canny-edge-detector][2]
来自汤姆吉巴拉。
这在默认模式下很容易使用,主程序是:
public static void main(String[] args) throws Exception {
File file = new File("c.bmp");
//create the detector
CannyEdgeDetector detector = new CannyEdgeDetector();
//adjust its parameters as desired
detector.setLowThreshold(0.5f);
detector.setHighThreshold(1f);
//apply it to an image
BufferedImage img = ImageIO.read(file);
detector.setSourceImage(img);
detector.process();
BufferedImage edges = detector.getEdgesImage();
ImageIO.write(edges, "png", new File("c.png"));
}
ImageIO 在这里读取和写入位图。未处理的图像被读取为 24 位 BMP(ImageIO 似乎因颜色范围较低而失败)。默认设置是 Gibara 的开箱即用。
边缘检测非常令人印象深刻,勾勒出所有的线条和字符。这个位图
转换为边缘
所以现在我有两个任务:
- 将直线拟合到轮廓,这基本上是干净的“电车线”。我希望这对于干净的图表来说是直截了当的。如果提到 Java 库以使线条原语适合轮廓,我将不胜感激。
- 识别字符。Gibara 在分离它们方面做得非常出色,因此这是一个识别单个字形的练习。我可以使用轮廓来隔离每个字形的单个像素图,然后将它们传递给JavaOCR。或者,轮廓可能足以直接识别字符。我不知道字体是什么,但大多数字符都在 32-255 范围内,我相信我可以建立启发式地图。
请参阅如何在 java 中正确加载 BufferedImage?用于在 Java 中加载位图