【发布时间】:2019-04-25 17:11:34
【问题描述】:
这是一种图像的裁剪示例(大约11x9 像素)(最终实际上都是大小28x28,但存储在内存中,扁平为784-components 数组)我会尝试将算法应用于:
基本上,我希望能够识别何时出现此形状(红线用于强调像素的分离,而周围的黑色边框用于更好地勾勒出StackOverflow的白色背景下的图像) :
它的方向无关紧要:必须在任何可能的表示(旋转和对称)中沿水平和垂直轴检测它(因此,例如,不应考虑 45° 旋转,也不应考虑对角对称:例如,仅考虑 90°、180° 和 270° 旋转)。
在我第一次展示的那张图片上可以找到两种解决方案,但只需要找到一个(忽略白色区域周围的灰色模糊):
以另一个示例为例(这也表明图像中的白色图形并不总是被黑色像素完全包围):
该函数应该返回 True,因为该形状存在:
现在,显然有一个简单的解决方案:
使用诸如pattern = [[1,0,0,0],[1,1,1,1]] 之类的变量,生成其变体,然后沿图像滑动所有变体,直到找到完全匹配的位置,此时整个过程停止并返回True。
然而,在最坏的情况下,这将占用8*(28-2)*(28-4)*(2*4),这对于单个图像来说大约是 40000 次操作,这似乎有点矫枉过正(如果我的快速计算正确的话)。
我猜想使这种天真的方法变得更好的一种方法是首先扫描图像,直到找到第一个白色像素,然后开始寻找比该点早 4 行和 4 列的图案,但即使这样似乎也不够好。
有什么想法吗?也许这种功能已经在某些库中实现了? 我正在寻找一种能够击败我幼稚方法的实现或算法。
作为旁注,虽然是一种 hack,但我猜这是可以转移到 GPU 上的问题,但我对此没有太多经验。 虽然这不是我想要的主要内容,但如果您提供答案,请随时添加与 GPU 相关的注释。
编辑:
我最终实现了接受的答案。你可以在this Gist看到我的代码。
【问题讨论】:
-
当您设法找到解决问题的可行解决方案时,如果您愿意分享,我真的很想看看源代码。
-
我一定会的。您介意分享一下您为这种解决方案考虑的应用程序类型吗?或者你只是因为好奇才想要代码? :)
-
@Jake12342134 你去吧:gist.github.com/payne911/…
-
您好,感谢您的代码!我很高兴去看一看。我只是出于好奇才问的!
-
@Jake12342134 不用担心!我正在使用此代码来检测 28x28 图片是否表示没有任何学习算法的凸图。我最终得到了 >99% 的准确率,这还不错。
标签: python python-3.x image algorithm image-processing