Halcon实战——基于NCC模板匹配的芯片检测(附源码)
关于作者
作者:小白熊
作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。
联系邮箱:xbx3144@163.com
科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~
在机器视觉中,模板匹配是用于检测图像中目标物体的核心技术。归一化互相关(NCC,Normalized Cross Correlation)是模板匹配中的经典方法。它通过计算模板图像与测试图像对应区域的归一化相关系数来判断匹配程度。归一化操作的目的是消除图像亮度变化的影响,使得模板匹配对不同光照条件具有更强的鲁棒性。在芯片检测任务中,模板匹配技术尤其适用于精确定位和检测芯片上的特定图案或结构。本文结合一段Halcon代码,详细讲解如何通过NCC模板匹配完成图像中目标物体的识别。
1、图像读取
读取模板图像和测试图像是进行图像处理的第一步。read_image
算子能够加载不同格式的图像(如 BMP、JPEG 等)。在这个示例中,我们分别加载了模板图像和待检测的测试图像。
read_image (ReferImage, 'template.bmp')
read_image (TestImage, 'test.bmp')
2、图像灰度化
灰度图像是图像处理中的常见格式。在进行模板匹配时,将彩色图像转换为灰度图像能减少计算复杂度,从而提高匹配效率。Halcon 提供的 rgb1_to_gray
算子能够快速完成这一操作。灰度化的图像只包含亮度信息,不再包含颜色信息,这使得处理起来更加简单、快速。
rgb1_to_gray(ReferImage,ReferGrayImage)
rgb1_to_gray(TestImage,TestGrayImage)
3、定义模板区域
模板匹配的关键之一在于选择合适的模板区域。为了更精确地进行匹配,我们可以通过 draw_rectangle1
算子手动绘制一个矩形,定义图像中需要用作模板的区域。在芯片检测任务中,如何定义模板非常关键。芯片上的很多结构可能是规则性的,定义一个合适的模板区域可以显著提高检测效率。通过手动选择芯片的关键区域作为模板,可以减少无关区域的干扰,并提高匹配的精度和速度。
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
4、创建NCC模板
在 create_ncc_model
算子中,Halcon 会根据裁剪后的模板区域创建一个NCC模板。该模板能够在指定的角度范围内进行旋转匹配,使得它在寻找旋转不变的物体时表现出色。在本例中,模板在 -180° 到 180° 之间的旋转范围内进行匹配。
create_ncc_model (ImageReduced, 'auto', -rad(180), rad(180), 'auto', 'use_polarity', ModelID)
5、查找匹配
find_ncc_model
算子通过搜索测试图像中与模板相匹配的区域,返回匹配区域的行、列坐标、角度和匹配得分。在该命令中,我们设置了匹配的最小得分为 0.5,意味着只有匹配置信度大于50%的区域才会被认为是有效匹配。此外,30
限制了最多返回 30 个匹配结果,0.5
则规定了匹配区域的重叠比例不能超过50%。
find_ncc_model (TestGrayImage, ModelID, -rad(180), rad(180), 0.5, 30, 0.5, 'true', 0, Row, Column, Angle, Score)
6、显示结果
匹配结果通过返回的 Row
、Column
和 Angle
向量表示。如果没有匹配结果,程序将清除创建的NCC模板并退出。否则,程序将关闭当前窗口,重新打开一个用于显示测试图像的窗口,准备绘制匹配区域。找到匹配后,程序使用 gen_rectangle2()
生成矩形,以标记测试图像中的匹配区域,并通过 dev_display()
将其显示出来。每个匹配区域都会用红色边框绘制,线条宽度为 3,这使得匹配的结果直观可见。
* 如果没有找到匹配的模板
if (|Row| == 0)* 清除NCC模板,释放内存clear_ncc_model (ModelID)* 退出程序return ()
else* 如果找到匹配,关闭当前窗口并打开一个新的窗口显示测试图像dev_close_window ()dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)dev_display (TestImage)* 设置绘图模式为边缘模式dev_set_draw ('margin')* 设置绘图颜色为红色dev_set_color ('red')* 设置线条宽度为3dev_set_line_width (3)* 对每个找到的匹配位置进行绘制for Index := 1 to |Row| by 1* 生成矩形以标记在测试图像中找到的匹配区域gen_rectangle2 (Rectangle1, Row[Index-1], Column[Index-1], Angle[Index-1], width/2, height/2)* 显示矩形dev_display (Rectangle1)endfor* 清除NCC模板,释放内存clear_ncc_model (ModelID)
endif
7、完整代码
* 禁用自动更新显示,避免在过程中不断刷新窗口,提高效率
dev_update_off ()* 关闭之前可能已经打开的显示窗口,确保窗口的正确初始化
dev_close_window ()* 读取模板图像和测试图像
read_image (ReferImage, 'template.bmp')
read_image (TestImage, 'test.bmp')* 将模板图像和测试图像转换为灰度图像
rgb1_to_gray(ReferImage,ReferGrayImage)
rgb1_to_gray(TestImage,TestGrayImage)* 获取模板图像的尺寸(宽度和高度)
get_image_size (ReferImage, Width, Height)* 窗口缩放比例
n := 1.0/2* 打开一个显示窗口,用于显示模板图像
dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)* 显示参考图像
dev_display (ReferImage)* 在窗口中手动绘制一个矩形,用于定义模板区域
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)* 根据绘制的矩形生成一个矩形区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)* 计算矩形的宽度和高度
width := Column2 - Column1
height := Row2 - Row1* 将模板图像在矩形区域内进行裁剪,减少计算域
reduce_domain (ReferGrayImage, Rectangle, ImageReduced)* 创建NCC(归一化互相关)模板,用于在测试图像中查找匹配
* 模板会在 -180° 到 180° 的旋转范围内进行匹配
create_ncc_model (ImageReduced, 'auto', -rad(180), rad(180), 'auto', 'use_polarity', ModelID)* 在测试图像中查找与模板匹配的区域
find_ncc_model (TestGrayImage, ModelID, -rad(180), rad(180), 0.5, 30, 0.5, 'true', 0, Row, Column, Angle, Score)* 如果没有找到匹配的模板
if (|Row| == 0)* 清除NCC模板,释放内存clear_ncc_model (ModelID)* 退出程序return ()
else* 如果找到匹配,关闭当前窗口并打开一个新的窗口显示测试图像dev_close_window ()dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)dev_display (TestImage)* 设置绘图模式为边缘模式dev_set_draw ('margin')* 设置绘图颜色为红色dev_set_color ('red')* 设置线条宽度为3dev_set_line_width (3)* 对每个找到的匹配位置进行绘制for Index := 1 to |Row| by 1* 生成矩形以标记在测试图像中找到的匹配区域gen_rectangle2 (Rectangle1, Row[Index-1], Column[Index-1], Angle[Index-1], width/2, height/2)* 显示矩形dev_display (Rectangle1)endfor* 清除NCC模板,释放内存clear_ncc_model (ModelID)
endif
8、总结
NCC模板匹配是一种基于统计相关性的方法。通过计算模板与测试图像对应区域的相关系数,能够准确地定位目标位置。由于NCC对亮度变化具有较强的鲁棒性,因此特别适合在光照条件变化或图像噪声较大的环境下使用。本文通过Halcon代码演示了如何实现高效的图像匹配。