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

Python 有效地检测大型图像中的形状,python,image-processing,numpy,matrix,scipy,Python,Image Processing,Numpy,Matrix,Scipy,我有一个巨大的电路图,包含二极管、电阻器、晶体管等符号 我必须从这个图像中选择符号(基于输入模板),并使用矩形边界框高亮显示这些符号。符号可以旋转(缩放)-但现在让我们不考虑缩放/旋转。同一列/行中可能有多个符号和行 图像大小为5600x3600。它是灰度,转换成黑白,然后整个东西可以称为0和1,其中1==黑色像素。我认为白色像素可以被认为是“不在乎” 做这件事的正确和快速的方法是什么 我从较大的图像中提取了一个模板图像-例如“diode.png”。假设至少有一个符号在没有缩放或旋转的情况下完全

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

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

图像大小为5600x3600。它是灰度,转换成黑白,然后整个东西可以称为0和1,其中1==黑色像素。我认为白色像素可以被认为是“不在乎”

做这件事的正确和快速的方法是什么

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

蛮力模板/矩阵比较法对我很有效,但速度非常慢。。检测一个精确匹配需要45分钟(在最新的MBP-2.4ghz-Intel i5/8GB上)。我尽可能地使用numpy,但可能我没有使用某些numpy迭代器

不幸的是,我无法在python之外做到这一点,也无法在不使符号无法识别的情况下将图像大小减小到5600x3600以下

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

实现上述目标的正确执行方法是什么? 我不太懂信号处理,但这能帮上忙吗?此处的模板大小(子矩阵)最小为50x50

编辑:OpenCV对我来说不是一个选项-浏览是可用的。但是,请不要因此而停止您的输入

我不能分享实际的图表,但这里有一个示例。例如,二极管在这里标记为D1和D2。完整的图表与此一样清晰,但在5600 x 3600的画布上


我还想补充一点,skimage中的match_模板可以完美地处理从较大图像中提取的较小图像块

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

然后遍历每个轮廓

每个(等高线)

获取由变量“轮廓”指向的轮廓点序列


,您会发现一个有趣的示例

您要查找的术语是“”

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

您可以在scikit映像中找到使用的实现:

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

您尝试过吗?这是进行模板匹配的最简单方法之一,但也是一种蛮力方法


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

谢谢,我忘了提到openCV不是我的选项。撇渣是可以的。我会更新这个问题,并在skimageyou中尝试这些选项。您可以提供一个示例图像,这样某人可能会有更好的想法,他会在该图像上实现它。谢谢,我之前使用过此选项-出于某种原因,它不适用于完整(大)图像。但是,对于从大图像中获取的较小样本,它非常有效。我从未考虑过可能导致此问题的图像噪声因素:ij=np.unravel_index(np.argmax(result),result.shape)。我将对“匹配结果”进行另一次查看,以查看其中是否隐藏了某些内容。感谢hintIt在没有看到代码的情况下很难给出具体的建议。如果您发布当前的方法,您将得到更好的答案:大型图像需要花费大量时间进行模板匹配(以及旋转)。缩放也是一个参数——我使用了图像金字塔。但是为了处理大量的噪声和减少搜索空间,我使用了绝对差之和来为给定模板的图像找到最佳比例(结合我自己的一些参数来确定比例)。然后利用模板匹配的概率来选择最佳结果。总的来说,它正确地检测到了95%的图像,没有错误检测。计时时间没有40分钟那么长,但只有1-2分钟(仍然很长)。