我有一个巨大的电路图,其中包含二极管,电阻,晶体管等符号。
我必须从此图像中选择符号(基于输入模板)并使用矩形边界框突出显示这些符号。符号可以旋转(和缩放) - 但是现在让我们不考虑缩放/旋转。同一列/行中可能有多个符号和行。
图像尺寸为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
我还想补充一点,来自skimage的match_template与从较大图像中提取的较小图块完美配合
答案 0 :(得分:2)
您正在寻找的术语是“template matching”。
通常假设由于图像噪声和其他因素,模板不会完全匹配。相反,您会查找具有最小错误分数的图像区域。
您可以在scikit-image中找到使用normalized cross-correlation的实现:
如果您添加现有代码以及示例图像和模板,将会有所帮助。
答案 1 :(得分:2)
你试过Sum of Absolute Difference吗?它是进行模板匹配的最简单方法之一,但它也是一种强力方法。
我将其应用于文档图像(A4,300 dpi,2500 * 3500像素)中的徽标定位。它很慢但不需要45分钟!为了加快速度,您可以分割图像(选择重叠区域以避免错过符号)。
答案 2 :(得分:1)