halcon培训-形态学分析三部曲[email protected]龙熙视觉李杰## 龙熙视觉
halcon机器视觉之汉字识别[email protected]龙熙视觉李杰## 龙熙视觉
*develop的知识点
- 不初始化窗口 ,有一个默认窗口3600
- 环境变量中涉及到的地址
read_image(bond, ‘die/die_03’) - read_image(Image2, ‘zf4.png’)
get_image_size(bond, Width, height) - get_image_size(Image2, Width2, height2)
dev_close_window()
*Width,height 比例比较协调. Width,height 特别大的时候,除以倍数 3 5
dev_open_window(0, 0, Width,height, ‘black’, WindowHandle1)
dev_display(bond)
*把第2个column 改为上个窗口的 宽度
dev_open_window(0,Width,Width, height, ‘black’, WindowHandle2)
- dev_display(Image2)
*有几个 - dev_close_window()
*关闭当前窗口
*这个有黑色区域 也有白色区域。、
*1.把白色区域 抠图 出来。 ----分割
*常规二值化。 灰度值 。在这个区间范围内 107, 230。挑选为 选中的区域。
*固定阈值 .二值化仅仅是分割的一种。
dev_set_window(WindowHandle1)
threshold (bond, Bright, 107, 230)
- 点击窗口 —》delete —》 鼠标移动到 窗口上 ,右键选取regions。
*后面图像比较多, ‘convex’, ‘ellipse’, ‘inner_center’, ‘inner_circle’, ‘inner_rectangle1’, ‘outer_circle’, ‘rectangle1’, ‘rectangle2’
*‘outer_circle’ 外接圆
*inner_circle’ 内接圆
*‘rectangle2’ 带角度的矩形
*形态学里面的一些算子
dev_set_draw(‘fill’)
*区域转为特定形状
shape_trans(Bright,Die, ‘rectangle2’)
*感兴趣区域的抠图操作
reduce_domain(bond, Die, DieGray)
*1. 固定阈值 -方法1
threshold (DieGray, Wires, 0, 45)
*2. 第2种方法 自动阈值
read_image(Sheet, ‘pic08.png’)
*先做正态分布 RelativeHisto 比值 。
gray_histo (Sheet, Sheet, AbsoluteHisto, RelativeHisto)
*找到频率最高的灰度值
PeakGray := sort_index(AbsoluteHisto)[255]
- 找亮色区域 PeakGray-25,255。 找黑色区域 0 -PeakGray-25
threshold (Sheet, Region, PeakGray,255)
binary_threshold(Sheet, LightRegion, ‘max_separability’, ‘light’, UsedThreshold)
area_center(Region, Area, Row1, Column1)
k:=213656/(1280*1024)
*内部有孔洞 要填充。对1, 100像素面积孔洞进行填充。
fill_up_shape(Wires, RegionFillUp, ‘area’, 1, 100)
*做连通域 ,作用 拆分
- 容易不稳定
- connection(RegionOpening, ConnectedRegions)
- select_shape (ConnectedRegions, SelectedRegions, [‘area’,‘circularity’], ‘and’, [497.82,0.14608], [2387.35,0.5109])
- opening_circle( SelectedRegions, RegionOpening, 13)
*用特征去分选也是可以。
- dev_set_window(WindowHandle2)
- dev_display(bond)
*腐蚀 收缩 一些像素 - erosion_circle(RegionFillUp, RegionErosion, 11)
*膨胀 往外吞并一些像素
-
dev_set_window(WindowHandle1)
-
dev_display(bond)
-
dilation_circle(RegionErosion, RegionDilation, 11)
*外部有噪点 要开运算
*opening_circle = erosion_circle+dilation_circle
dev_display(bond)
opening_circle(RegionFillUp, RegionOpening, 14.5)
count_obj(RegionOpening, Number)
*做连通域 ,作用 拆分
connection(RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, [‘area’,‘circularity’], ‘and’, [505.09,0.81904], [5000,1])
- 把1个区域 打散成碎片
- 圆形度
count_obj(ConnectedRegions, Number1) - select_shape (ConnectedRegions, SelectedRegions, [‘area’,‘circularity’], ‘and’, [497.82,0.14608], [2387.35,0.5109])
dev_set_window(WindowHandle1)
dev_display(bond)
dev_display(SelectedRegions)
count_obj(SelectedRegions, Number2)
*特征提取
*2.把白色区域中的黑色区域提取出来。—二值化分割
*排序处理
sort_region(SelectedRegions, SortedRegions, ‘first_point’, ‘true’, ‘column’)
smallest_circle(SortedRegions, Row, Column, Radius)
for i:=1 to |Radius| by 1
dev_set_color(‘green’)
dev_display(SortedRegions)
dev_set_color(‘red’)
gen_cross_contour_xld(Cross, Row[i-1], Column[i-1], 26, 0.785398)
disp_message(WindowHandle1,Radius[i-1], ‘window’, Row[i-1]+20, Column[i-1], ‘yellow’, ‘flase’)
endfor
*3.把方块黑色区域 剔除掉,保留 圆形黑色区域。—特征提取