使用Java从图像中检测硬币(没有开源库)

时间:2015-04-12 01:43:15

标签: java image-processing computer-vision

问题:

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

不使用开源库。

我需要知道的事情:

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

  1. 有人可以指导我从初学者角度学习Hugh Transform吗?
  2. 我想说我找到了一种检测圆圈(椭圆)的方法。如何区分不同类型的硬币。

    • 颜色不会有帮助因为只有便士有铜色。所有其他类型的硬币都有银色。
    • 半径或直径不会有帮助,因为照片缩放级别也会影响输出。
    • 最后,我们无法比较其他硬币的原因,图片中可能没有镍或一分钱。
  3. 我知道这是一个开放式的问题。任何初学者级别的帮助和指导将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

首先澄清一些问题

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

我会这样做:

  1. 派生图像以使边缘可见
  2. 添加一些处理以增强边缘并消除噪音
    • 形态学运算符和平滑滤波器适用于此
    • 可能是一些自适应阈值
    • 硬币周边的边缘和压花的内部应该是可见的!!!
  3. 创建二进制图像
    • 所以下面的阈值是黑色
    • 以上是白色......或反向
  4. 找到圆圈/椭圆
    • 代数或通过CHT(圆形霍夫变换)
  5. 处理每个椭圆
    • 通过比较其内部边缘与已知硬币图像
    • 可以使用任何算法:
    • simple OCR
    • polygon comparison
    • 如果发现与已知硬币图像匹配则将其值计入您的总和
    • 您可以尝试比较非显而易见的事情,例如
    • 边缘密度,边缘尺寸直方图等
  6. 这也可以通过找到合适的位置来解决

    • 所以圆圈检测保持原样
    • 但为了比较
    • 从源图片中找到圆圈
    • 转向灰度
    • 标准化尺寸,对比度/光照条件以匹配已知的灰度coint图像
    • 尝试所有轮换
    • substract source and known image
    • 记住已知的图像和旋转角度,其中abs差异最小
    • 最后你应该得到正确的结果
    • 或者如果差异大于阈值,则硬币不是您支持的硬币