【发布时间】:2013-02-02 00:01:18
【问题描述】:
在图形屏幕上寻找东西,我目前不知道如何在图像中找到给定的形状。图像中的形状可能有不同的比例,当然会在某个未知的 x,y 偏移处。
除了不同尺度导致的像素伪影之外,两张图像中也有一点点噪点,所以我需要稍微宽容的搜索。
这是我要找的图片。
它应该显示在我的(双)屏幕缓冲区的屏幕转储中,大小约为 3300 x 1200 像素。我当然希望在浏览器窗口中找到它,但不需要这些信息。
这个练习的目的(到目前为止)是想出一个结果:
- 是的,在我的屏幕上(或没有)找到了木制框架(颜色近似,形状可能略有截断);和
- 游戏的客户区(框架内的黑色区域)占据了从
(x1,y1)到(x2,y2)的矩形。
我希望对缩放和抖动可能引入的噪声具有鲁棒性。另一方面,我可以排除一些常见的 CV 挑战,例如旋转或非刚性。这种框架形状对于人脑来说非常容易辨别,对于专用软件来说有多难?这是一个 Adobe Flash 应用程序,直到最近我还认为从游戏 GUI 中感知图像应该很容易。
我正在寻找一种算法,该算法能够找到针和干草堆之间发生最大可能重叠的 x、y 平移,并且如果可能的话,无需遍历一系列可能的比例因子。理想情况下,该算法可以以一种独立于比例的方式抽象出图像的“形状”。
我已经阅读了一些关于傅立叶变换的有趣内容以完成类似的操作:给定相同比例的目标图像,FFT 和一些矩阵数学在更大的图像中产生了与搜索模式相对应的点。但我没有将其付诸实践的理论背景,也不知道这种方法是否能优雅地处理规模问题。帮助将不胜感激!
技术:我正在使用 Clojure/Java 编程,但可以采用其他语言的算法。我认为我应该能够与遵循 C 调用约定的库进行交互,但我更喜欢纯 Java 解决方案。
您也许能够理解我为什么回避展示实际图像。这只是一个愚蠢的游戏,但事实证明,它的屏幕阅读任务比我想象的更具挑战性。
显然,我可以在屏幕缓冲区中彻底搜索构成图像的像素(不包括黑色),甚至可以在一分钟内完成搜索。但我的目标是找到使用一种技术来匹配形状的木制框架,而不管缩放和抖动可能产生的差异。
事实上,抖动是我在这个项目中遇到的诸多挫折之一。我一直在努力通过边缘提取来提取一些有用的向量,但是边缘非常难以捉摸,因为任何给定区域的像素具有广泛不一致的颜色 - 所以很难从局部抖动伪影中分辨出真正的边缘。我不知道这么简单的游戏会产生软件难以感知的图形。
在开始寻找特征之前,是否应该先对像素进行局部平均?我应该通过丢弃像素颜色值的最低有效位来减少颜色深度吗?
我正在尝试纯 Java 解决方案(实际上是在 Clojure/Java 混合中编程),所以我对 opencv(它使用 C 代码安装 .DLL 或 .so)并不感兴趣。请不要担心我的语言选择,学习体验对我来说比表演更有趣。
【问题讨论】:
-
不清楚您提到的频域使用类型。考虑到这个问题,我最好的猜测是用傅里叶描述符进行比较。这些可以很容易地使旋转、平移和比例不变,从而有助于解决您的问题。您首先提取二进制图像中连接分量的每个轮廓,然后对每个进行采样并确定傅立叶描述符。 “针”图像也是如此。然后,您可以尝试使用这些描述符匹配形状。但是,此任务还有许多其他方法,具体取决于其他隐藏(被遗忘)的要求。
-
如果您不熟悉这些算法,也可以查看 SIFT 和 SURF; Gary Bradski 的《Learning OpenCV》一书可以提供一些指导。几个商业视觉库 ($$) 实现了简化设置的“稳健形状匹配”。 en.wikipedia.org/wiki/SURF
-
Carl,您能否发布一些原始示例图像(和/或示例图像存档的链接)?您是在寻找一个强大的解决方案、一个简单的解决方案、一个有趣/复杂的解决方案来测试,还是“最佳”解决方案(针对某些问题领域/市场)?有统计描述符、傅里叶描述符等,但也有一些技术可能更容易让你理解,并且可以很好地满足你的目的。 (我还重新标记了您的问题以添加“opencv”和“图像处理”,以便获得更多关注。)
-
@Rethunk,感谢您的关注和投入!我已经编辑了我的问题,以使任务的目的和参数更加清晰。希望这会有所帮助!
-
@CarlSmotricz:对于该领域的人来说,提出一个基于重量级库的超通用解决方案是微不足道的,但是找到一个不过度使用的简单解决方案是一个有趣的问题 - 请参阅我的回答以获取建议.
标签: opencv image-processing computer-vision fft image-recognition