【问题标题】:image enhancement of plots and other line diagrams绘图和其他折线图的图像增强
【发布时间】:2012-07-11 11:22:03
【问题描述】:

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

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

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

这些具有以下特点:

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

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

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

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

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

【问题讨论】:

  • 简单/高斯模糊能否满足您的需求? en.wikipedia.org/wiki/Noise_reduction#Linear_smoothing_filters 此处描述的平滑可以通过 java.awt 包中的类轻松实现和调整,而无需使用第三方库。
  • 简单/高斯模糊能否满足您的需求? - 我不知道!我会很感激如何做到这一点的例子。
  • @Yura 开箱即用的 Canny 方法(见下文)可以满足我的更多需求
  • 很好,很高兴您找到了解决方案 :)
  • @Yura。不,我没有:-) 我已经完成了一半。我仍然需要适应线条和字符

标签: java image-processing


【解决方案1】:

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

我发现在另一个 SO 帖子中提到了 Canny edge-detection algorithm,然后发现:

[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 范围内,我相信我可以构建启发式映射。

请参阅How do I properly load a BufferedImage in java? 以了解在 Java 中加载位图

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 我已授予此奖金,因为尽管我研究了霍夫变换,但我还没有意识到 PHT 的强大功能。它看起来非常适合我需要的东西(虽然我还没有尝试过 - 答案才刚刚出现)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 2020-06-16
      • 2019-05-24
      • 2016-07-31
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多