2014-02-24 70 views
2

我有一个巨大的电路图,其中包含二极管,电阻器,晶体管等符号。高效检测大图像的形状

我必须从此图像中选择符号(基于输入模板),并使用矩形边界框突出显示这些符号。这些符号可能会旋转(和缩放) - 但现在我们不考虑缩放/旋转。在同一列/行中可能有多个符号和行。

图片尺寸为5600x3600。它是灰度,转换为b/w,然后整个事物可以被提及为0和1s,其中1 ==黑色像素。我认为白色像素可以视为“不在乎”

什么是正确和快速的方法来做到这一点?

我有从较大的图像中提取的模板图像 - 例如“diode.png”。假设至少有一个符号完全匹配,而无需缩放或旋转。

蛮力模板/矩阵比较方法适用于我 - 但它非常缓慢..需要45分钟(在最新的MBP-2.4ghz-英特尔i5/8GB上)来检测一个完全匹配。我正在使用numpy,只要我可以 - 但可能我没有使用某些numpy迭代器。

不幸的是,我不能在python外执行此操作,并且无法将图像尺寸减小到5600x3600以下,而不会使符号无法识别。

解决此问题的另一种方法是:从大矩阵中查找所有匹配的子矩阵。

什么是实现上述目标的正确和执行方法? 我不太了解信号处理 - 但这可以帮助吗?这里的模板大小(子矩阵)是最小的50x50

编辑:OpenCV不是我的选择 - skimage可用。但是,请不要让这些停止输入。

我不能分享实际图表,但示例在这里。例如,二极管在这里标记为D1和D2。完整的图是一样清楚这一点,但5600 X 3600在画布上

http://www.controlcircuitdiagram.com/diagramcircuitelectronic.com/wp-content/uploads/2011/08/electronic-circuits.jpg

我还想补充一点,match_template从skimage从较大的图像

+1

你可以提供一个示例图像,这样有人可能会有更好的想法,他会在该图像上实现它。 –

回答

2

你要找的术语是 “template matching”。

通常认为,由于图像噪声和其他因素,模板将不会完全匹配。相反,您可以用最小的错误分数查找图像区域。

你可以在scikit图像使用normalized cross-correlation的实现:

,如果您添加现有的代码和样本图像和模板这将有助于。

+0

谢谢,我早些时候使用过 - 由于某种原因,它不适用于完整(大)图像。但对于从较大图像中提取的较小样本来说,它是完美的。 我从来没有想过可能导致这个问题的图像噪声因子: ij = np.unravel_index(np.argmax(result),result.shape)。我会给“匹配结果”另外看看结果,看看是否有隐藏在那里的东西。感谢提示 – anups

+0

没有看到您的代码很难给出具体的建议。如果您发布当前的方法,您将得到更多更好的答案:http://stackoverflow.com/help/mcve – YXD

+0

大图像花了很多时间来做模板匹配(和旋转)。缩放也是一个参数 - 我使用图像金字塔。但为了处理大量的噪音和减少搜索空间,我使用了绝对差和来找出给定模板的图像的最佳尺度(结合我自己的一些参数来确定尺度)。然后使用模板匹配和概率来选择最佳结果。总体而言,它正确地检测到95%的图像具有零错误检测。时间不是40分钟 - 但1-2分钟(仍然巨大)。 – anups

1

我摘录了更小的砖完美的作品建议你使用opencv,它也适用于python。 有你需要使用基本功能:

findContours

然后通过每个轮廓

每个(轮廓)迭代

获得点的序列轮廓,由变量'轮廓'指向

approxPoly

Here,你会发现一个有趣的例子

+0

谢谢,我忘了提及openCV不适合我。 Skimage没问题。我会更新这个问题,并会尝试这些选项在skimage – anups

2

你试过Sum of Absolute Difference?这是做模板匹配最简单的方法之一,但它也是一种强力方法。

我将它应用于文档图像(A4,300 dpi,2500 * 3500像素)的徽标斑点。这很慢,但不需要45分钟!为了加快你可以分割图像(选择重叠区域,以便不要错过你的符号)。