3

我正在寻找用于(科学)绘图和图表的图像增强的库例程。典型例子显示在

http://www.jcheminf.com/content/pdf/1758-2946-4-11.pdf

http://en.wikipedia.org/wiki/Anti-aliasing的图 3

它们具有以下特点:

  • 他们通常使用极少数的图元(线、字符、圆、矩形)
  • 它们通常是单色(黑色/白色)或具有非常少量的块色
  • 原件没有渐变或图案。

我希望重建基元,并正在寻找一种算法来在下一阶段分析之前恢复图像中的清晰线条(可能包括线条检测和 OCR)。噪音通常来自:

  • 使用 JPG(通常会看到接近原始图元的噪点)
  • 抗锯齿

我需要免费/开源解决方案,并且最好喜欢现有的 Java 库。如果有任何已经完成了一些工作或重建线路,那将是一个奖励!对于字符识别,我很乐意在此阶段隔离每个字符并推迟 OCR,尽管对此的指针也将不胜感激。

更新:令我惊讶的是,即使有赏金,也没有对这个问题做出实质性答复。因此,我正在亲自调查它。我仍然邀请答案,但它们应该超出我自己的答案。

4

3 回答 3

4

自己的问题的答案由于近一周后没有答案,我现在的计划是:

我在另一个 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 中加载位图

于 2012-07-08T07:51:13.260 回答
1

我希望重建基元,并正在寻找一种算法来在下一阶段分析之前恢复图像中的清晰线条(可能包括线条检测和 OCR)。

你看过jaitools吗?(http://code.google.com/p/jaitools/)。

他们有用于矢量化图形的 API,非常快速和灵活;在此处查看 API 和文档:http: //jaitools.org/

于 2012-07-10T15:21:10.340 回答
1

Java 库

OpenCV 是此类计算机视觉任务的首选库。这里有 Java 绑定:http ://code.google.com/p/javacv/ 。OpenCV 涵盖了从基本图像处理过滤器到高级对象和运动检测算法的所有内容。

线路检测

要检测直线,请尝试 Hough 变换。OpenCV 教程有一个很好的解释: http: //opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html#how-does-it-work

经典的霍夫变换输出无限的线,但 OpenCV 还实现了一种称为概率霍夫变换的变体,它输出线段。它应该给你所需要的。原始学术论文在这里:http ://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.9440&rep=rep1&type=pdf

检测到线段后,您可能希望检测链接的线段并将它们连接在一起。对于您的简单图像,您可能会很好地对所有段端点进行蛮力比较。如果您在小半径内检测到多个端点,例如 2 个像素,请将它们连接在一起以确保您的线是连续的。您还可以测量连接线段之间的角度以检测多边形。

圆检测

还有另一个版本的霍夫变换可以检测圆圈,在这里解释:http: //opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html#hough-circle

于 2012-07-11T03:22:03.833 回答