一、 形态学概念
1.腐蚀
2.膨胀
3.开操作和闭操作
开操作:先腐蚀后膨胀 (去噪)
闭操作:先膨胀后腐蚀 (填充孔洞)
4.图像处理一般流程
采集->预处理->寻找特征->显示
预处理:滤波、gray、scale…
寻找特征: 形态学、blob分析…
二、例子详解
打开电路板的一个例子(ball.hdev)
操作流程就是 二值化->形态学->select_shape
注意二值化的结果(Bright)是一个区域,不是图像
threshold (Bond, Bright, 100, 255)
补充:halcon中的三大数据类型,图像,区域,xld(亚像素轮廓)
这一步是根据区域获取最小外接矩形的
shape_trans (Bright, Die, 'rectangle2')
选择感兴趣区域(Bond是图像,Die是区域(mask),DieGrey是输出的图片)
reduce_domain (Bond, Die, DieGrey)
通过reduce_domain确实能获得特定区域Region位置的图像,但是,reduce_domain是缩小一个图像的定义域,并不缩小图像的实际尺寸,即新图像ImageReduced尺寸大小并未发生变化。如果使用get_image_size来计算ImageReduced图像的尺寸,其尺寸和 原图Image一样。
并且,包括一系列的domain算子,比如change_domain,均不改变图像矩阵的大小。
将区域面积1~100的进行填充
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)
开操作(圆形结构元素)
最后会保留圆形的居多,15.5是圆形结构元素半径(如果对圆感兴趣,就用圆结构元素,如果对矩形感兴趣,就用矩形结构元素)
opening_circle (WiresFilled, Balls, 15.5)
计算连通域
connection (Balls, SingleBalls)
根据形状特征选择区域(圆度0.85~1.0之间的)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
对区域进行排序(first_point代表区域中列值(col)最小的点,column代表按列排序,true代表从小到大排。也就是说这行代码的意思是,让从区域按列从小到大排列)
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')
对每个区域求最小外接圆(获得Row,Column,Radius)
smallest_circle (FinalBalls, Row, Column, Radius)
可以看到,列确实是从小到到大排列的
显示圆
disp_circle (WindowID, Row, Column, Radius)
完整代码
* ball.hdev: Inspection of Ball Bonding * dev_update_window ('off') dev_close_window () dev_open_window (0, 0, 728, 512, 'black', WindowID) read_image (Bond, 'die/die_03') dev_display (Bond) set_display_font (WindowID, 14, 'mono', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') stop () threshold (Bond, Bright, 100, 255) shape_trans (Bright, Die, 'rectangle2') dev_set_color ('green') dev_set_line_width (3) dev_set_draw ('margin') dev_display (Die) disp_continue_message (WindowID, 'black', 'true') stop () reduce_domain (Bond, Die, DieGrey) threshold (DieGrey, Wires, 0, 50) fill_up_shape (Wires, WiresFilled, 'area', 1, 100) dev_display (Bond) dev_set_draw ('fill') dev_set_color ('red') dev_display (WiresFilled) disp_continue_message (WindowID, 'black', 'true') stop () opening_circle (WiresFilled, Balls, 15.5) dev_set_color ('green') dev_display (Balls) disp_continue_message (WindowID, 'black', 'true') stop () connection (Balls, SingleBalls) select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0) sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column') dev_display (Bond) dev_set_colored (12) dev_display (FinalBalls) disp_continue_message (WindowID, 'black', 'true') stop () smallest_circle (FinalBalls, Row, Column, Radius) NumBalls := |Radius| Diameter := 2 * Radius meanDiameter := mean(Diameter) minDiameter := min(Diameter) dev_display (Bond) disp_circle (WindowID, Row, Column, Radius) dev_set_color ('white') disp_message (WindowID, 'D: ' + Diameter$'.4', 'image', Row - 2 * Radius, Column, 'white', 'false') dev_update_window ('on')
最后补充:
腐蚀和膨胀(结构圆)
erosion_circle (WiresFilled, RegionErosion, 3.5) dilation_circle (RegionErosion, RegionDilation, 3.5)
计算连通域个数
count_obj (SingleBalls, Number)
三、其他
性能评测器
可以打开这个,性能评测器
在最右端就可以看见每条代码的运行时间了
缩放窗口
可以根据鼠标位置来查看放大的图
绘制ROI区域
点击编辑ROI,绘制平行矩形
左键选择感兴趣区域,选取完后,点击右键,确定选取
选择完成后,可以进行插入代码
查看特征(特征检测)
对区域进行特征检测
可以查看一些特征的属性