24. 区域处理综合例程

区域处理综合例程


1.ball_seq,焊点检测
S1:先找出板子所在的区域。通过min_max_gray找到灰度图像的最大/最小灰度值,再根据最大最小灰度值二值化,然后通过shape_trans找到板子所在区域

    min_max_gray (Bond, Bond, 0, Min, Max, Range)
    threshold (Bond, Bright, Max - 80, 255)
    shape_trans (Bright, Die, 'rectangle2')
    reduce_domain (Bond, Die, DieGrey)

24. 区域处理综合例程_第1张图片

S2:再通过min_max_gray找出黑色的区域,然后fill_up
24. 区域处理综合例程_第2张图片
S3:用圆去openning,打散之后选出矩形框,然后从原region减去矩形框
24. 区域处理综合例程_第3张图片
S4:使用灰度膨胀expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, ‘image’, 6),即沿着黑色区域向外界黑色的部分膨胀几个像素,然后再使用开运算转化成一个圆

expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, 'image', 6)
    opening_circle (RegionExpand, RoundBalls, 15.5)

2.Check_blister,药丸检测
S1:分割出药丸版面,shape_trans成矩形,然后获取矩形的角度和中心位置,然后根据角度和中心位置使用vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)将图像摆正

access_channel (ImageOrig, Image1, 1)
threshold (Image1, Region, 90, 255)
shape_trans (Region, Blister, 'convex')
orientation_region (Blister, Phi)
area_center (Blister, Area1, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')

S2:生成每个药丸对应的位置框,因为药丸的相对位置是固定的,所以可以直接生成位置框,然后将药丸版面region也摆正

gen_empty_obj (Chambers)
for I := 0 to 4 by 1
    Row := 88 + I * 70
    for J := 0 to 2 by 1
        Column := 163 + J * 150
        gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
        concat_obj (Chambers, Rectangle, Chambers)
    endfor
endfor
affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')
difference (Blister, Chambers, Pattern)
union1 (Chambers, ChambersUnion)
orientation_region (Blister, PhiRef)
PhiRef := rad(180) + PhiRef
area_center (Blister, Area2, RowRef, ColumnRef)

24. 区域处理综合例程_第4张图片
S3:对于接下来的每张图片,都把版面摆正到对应的框中去,然后reduce_domain
24. 区域处理综合例程_第5张图片
S4:使用var_treshould分割图像,该函数类似于dyn_treshould,使用掩膜在图像上移动,使用掩膜内的像素均值做二值化的阈值,然后再选取药丸区域
24. 区域处理综合例程_第6张图片
S5:生成空的错误药丸和没有药丸obj数组,然后对药丸位置region和药丸分割region作intersection,然后以此对药丸进行判定,如果像素面积小于阈值或者灰度值小于阈值,这说明装错了,如果没有药丸面积,则说明空了,最后使用颜色标记

    count_obj (Chambers, Number)
    gen_empty_obj (WrongPill)
    gen_empty_obj (MissingPill)
    for I := 1 to Number by 1
        select_obj (Chambers, Chamber, I)
        intersection (Chamber, Pills, Pill)
        area_center (Pill, Area, Row1, Column1)
        if (Area > 0)
            min_max_gray (Pill, ImageB, 0, Min, Max, Range)
            if (Area < 3800 or Min < 60)
                concat_obj (WrongPill, Pill, WrongPill)
            endif
        else
            concat_obj (MissingPill, Chamber, MissingPill)
        endif
    endfor

24. 区域处理综合例程_第7张图片
3.芯片灰尘检测,找到白色灰尘点相对于芯片内部黑色区域的坐标
24. 区域处理综合例程_第8张图片
S1:先定位芯片位置,使用bin_treshould分割,该方法自动使用全局阈值,分割出来的图像非黑即白,然后使用外接矩形的长和宽进行select_shape从而选出芯片位置
24. 区域处理综合例程_第9张图片
S2:因为只要处理中间黑色区域,且周围有一圈白色的,所以使用mean_image和dyn_treshould将周围的白色的圈进行分割,
24. 区域处理综合例程_第10张图片
S3:然后找到白色胶区域的内圈,先膨胀腐蚀去除掉白色圈不完整的连接,然后将白色的区域填充形成完整矩形,然后再用完整矩形减去白色区域,得到中间的矩形
24. 区域处理综合例程_第11张图片

24. 区域处理综合例程_第12张图片
24. 区域处理综合例程_第13张图片
S4:寻找左和下边界所在的直线
①intersection,通过移动区域然后和原区域相交的方式得到边界
②skelenton,得到边界区域的骨架,即边界region的中心线
③gen_countours_xld,生成该中心线的轮廓xld
④smooth_contours_xld,将轮廓平滑
⑤segment_contours_xld,将轮廓分割为直线
⑥然后连接,再生成直线
24. 区域处理综合例程_第14张图片S5:找灰尘,大灰尘直接用阈值,小灰尘用mean+dyn_treshould分割

S6:判断是否是真的灰尘,还是是杂质,先膨胀灰尘,然后和原灰尘region作intersection,得到环形区域
24. 区域处理综合例程_第15张图片
S7,使用intensity判断外环和内部的平均像素值的差,如果该差值大于某个值则认为该位置确实是一个灰尘
24. 区域处理综合例程_第16张图片

你可能感兴趣的:(halcon学习笔记,计算机视觉,图像处理,halcon)