图表和其他线条图的图像增强

3
我正在寻找用于科学图表和图示的图像增强库程序。典型的例子如http://www.jcheminf.com/content/pdf/1758-2946-4-11.pdf以及http://en.wikipedia.org/wiki/Anti-aliasing第3图所示。
这些程序通常具有以下特点:
- 它们通常使用非常少量的基本元素(线条、字符、圆形、矩形)。 - 它们通常是单色(黑白)或只有很少的几种颜色块。 - 原始图像没有渐变或图案。
我希望重建这些基本元素并寻找一种算法来恢复图像中的清晰线条,然后进行下一阶段的分析(可能包括线条检测和OCR)。噪声通常来自:
- 使用JPG格式(噪音通常出现在原始基本元素附近)。 - 抗锯齿。
我需要自由/开源的解决方案,并且最好是现有的Java库程序。如果已经有一些库程序可以完成部分工作或重构线条,那就更好了!对于字符识别,我愿意在此阶段隔离每个字符并推迟OCR,但也希望得到相关建议。
更新:即使有赏金,仍然没有实质性的答案。因此我正在自己调查。我仍然欢迎回答,但它们应该超出我的答案。

简单/高斯模糊是否符合您的需求?可以通过java.awt包中的类轻松实现平滑,如此处所述:http://en.wikipedia.org/wiki/Noise_reduction#Linear_smoothing_filters,无需使用第三方库。 - Yuriy Nakonechnyy
简单/高斯模糊是否适合您的需求?- 我不知道!我希望有如何实现这个功能的示例。 - peter.murray.rust
@Yura,Canny方法开箱即用(见下文)可以满足我更多的需求。 - peter.murray.rust
很好,很高兴你找到了解决方案 :) - Yuriy Nakonechnyy
@Yura。不,我还没有 :-) 我完成了一半。我还需要调整行和字符。 - peter.murray.rust
很遗憾,我没有OCR方面的经验,所以无法在这方面提供帮助。 - Yuriy Nakonechnyy
3个回答

4

回答自己的问题
由于近一个星期没有得到任何答案,这是我现在的计划:

我在另一个SO帖子中发现了Canny边缘检测算法的提及,然后找到了:

[http://www.tomgibara.com/computer-vision/canny-edge-detector][2]

来自Tom Gibara。

默认模式下非常易于使用,主程序是:

    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的开箱即用。
边缘检测非常出色,可以勾勒出所有线条和字符。此位图

raw bit map

被转换为边缘

edges detected

现在我有两个任务:
  • 对轮廓进行拟合,这些轮廓基本上是干净的“电车线”。对于干净的图表,我希望这是直接的。如果有Java库可以将线条原语拟合到轮廓中,请告知,感激不尽。
  • 识别字符。Gibara已经很好地将它们分开了,所以这是一个识别单个字形的练习。我可以使用轮廓来隔离每个字形的单个像素映射,然后将其传递给JavaOCR。或者,轮廓可能足够好,可以直接识别字符。我不知道字体是什么,但大多数字符都在32-255范围内,我相信我可以建立启发式映射。
请参见如何在Java中正确加载位图以加载Java中的位图。

1
我希望重构原始数据,并正在寻找一种算法,在进行下一阶段的分析之前,恢复图像中的清晰线条(可能包括线条检测和OCR)。
你看过jaitools了吗?(http://code.google.com/p/jaitools/)。
他们有用于矢量化图形的API,非常快速和灵活;在这里查看API和文档:http://jaitools.org/

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


我已经授予了此悬赏,因为尽管我研究过Hough变换,但我没有意识到PHT的强大之处。看起来它非常适合我需要的东西(虽然我还没有尝试过——答案刚刚出现)。 - peter.murray.rust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接