有效地检测大图像中的形状

时间:2014-02-24 07:49:14

标签: python image-processing numpy matrix scipy

我有一个巨大的电路图,其中包含二极管,电阻,晶体管等符号。

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

图像尺寸为5600x3600。它是灰度,转换为黑白,然后整个事物可以提到0和1,其中1 ==黑色像素。我认为白色像素可以被视为“不关心”

执行此操作的正确和快速方法是什么?

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

蛮力模板/矩阵比较方法对我有用 - 但它非常慢..需要45分钟(在最新的MBP-2.4ghz-Intel 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

我还想补充一点,来自skimage的match_template与从较大图像中提取的较小图块完美配合

3 个答案:

答案 0 :(得分:2)

您正在寻找的术语是“template matching”。

通常假设由于图像噪声和其他因素,模板不会完全匹配。相反,您会查找具有最小错误分数的图像区域。

您可以在scikit-image中找到使用normalized cross-correlation的实现:

如果您添加现有代码以及示例图像和模板,将会有所帮助。

答案 1 :(得分:2)

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

我将其应用于文档图像(A4,300 dpi,2500 * 3500像素)中的徽标定位。它很慢但不需要45分钟!为了加快速度,您可以分割图像(选择重叠区域以避免错过符号)。

答案 2 :(得分:1)

我建议你使用opencv,它也适用于python。  在那里你需要使用基本功能:

  

findContours

然后遍历每个轮廓

  

每个(轮廓)

获得一系列轮廓点,由变量'contour'指出

  

approxPoly

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