【问题标题】:Detect coins from the image using Java (no open source libraries)使用 Java 从图像中检测硬币(无开源库)
【发布时间】:2015-06-17 13:35:02
【问题描述】:

问题:

编写一个 Java 应用程序,让用户捕获/上传任何图像。之后,程序将从图像中检测便士、镍、一角硬币和四分之一硬币,并显示硬币的总和(例如 1.21 美元)。任何其他现金形式(如账单、票据、支票)都将被忽略。

不得使用开源库。

我需要知道的:

经过大量研究后,我发现 Hugh Transform 实施可以提供帮助。就个人而言,我学习过商业经济学,但对复杂数学的了解非常有限。

  1. 谁能指导我从初学者的角度学习休变换的来源?
  2. 假设我想出了一种检测圆(椭圆)的方法。如何区分不同种类的硬币。

    • 颜色无济于事,因为只有便士有铜色。所有其他类型的硬币都是银色的。
    • 半径或直径也无济于事,因为照片缩放级别也会影响输出。
    • 最后,我们无法与其他硬币进行比较,因为图片中可能没有镍或便士。

我知道这是一个开放式问题。任何初学者级别的帮助和指导将不胜感激。

【问题讨论】:

  • 是闭源库好吗?

标签: java image-processing computer-vision


【解决方案1】:

你有两个不同的问题。第一个是简单地找到图像上的任何圆圈。这就是霍夫变换所做的。第二个是将找到的圆圈与硬币相关联。您将需要非常复杂的特征检测算法,我不确定您是否必须从头开始编写所有代码并且不使用任何开放库。所以我建议你停止对霍夫变换的研究或改变你的任务条件。至于霍夫变换,它是一种非常简单的算法,没有任何复杂的数学运算。如果您对其实现有任何问题,您可以查看 opencv 库及其开放的source code,并将其用作您自己实现的起点。

【讨论】:

    【解决方案2】:

    首先是一些澄清问题

    • 硬币可以相互重叠吗?
    • 源图像的分辨率下限是多少?

    我会这样处理:

    1. 派生图像以使边缘可见
    2. 添加一些处理以增强边缘并去除噪点
      • 形态学算子和平滑过滤器对此很有用
      • 可能是一些自适应阈值
      • 硬币周边的边缘和里面的浮雕应该是可见的!!!
    3. 创建二进制图像
      • 所以下面的阈值是黑色的
      • 及以上为白色...或相反
    4. 查找圆/椭圆
      • 代数或 CHT(圆霍夫变换)
    5. 处理每个椭圆
      • 通过将其内部边缘与已知硬币图像进行比较
      • 可以使用任何算法,例如:
      • simple OCR
      • polygon comparison
      • 如果发现与已知硬币图像匹配,则将其价值计入您的总和
      • 您也可以尝试比较不明显的东西,例如
      • 边缘密度、边缘大小直方图等

    这也可以通过找到硬币的正确位置来解决

    • 所以圆圈检测保持原样
    • 但为了比较
    • 从源图像中取出找到的圆圈
    • 转灰度
    • 标准化大小、对比度/照明条件以匹配已知的灰度硬币图像
    • 通过某个步骤尝试所有旋转
    • 减去来源和已知图像
    • 记住绝对差异最小的已知图像和旋转角度
    • 最后你应该得到正确的结果
    • 或者如果差异更大,那么阈值硬币不是您支持的硬币

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多