区域处理综合例程
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)
S2:再通过min_max_gray找出黑色的区域,然后fill_up
S3:用圆去openning,打散之后选出矩形框,然后从原region减去矩形框
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)
S3:对于接下来的每张图片,都把版面摆正到对应的框中去,然后reduce_domain
S4:使用var_treshould分割图像,该函数类似于dyn_treshould,使用掩膜在图像上移动,使用掩膜内的像素均值做二值化的阈值,然后再选取药丸区域
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
3.芯片灰尘检测,找到白色灰尘点相对于芯片内部黑色区域的坐标
S1:先定位芯片位置,使用bin_treshould分割,该方法自动使用全局阈值,分割出来的图像非黑即白,然后使用外接矩形的长和宽进行select_shape从而选出芯片位置
S2:因为只要处理中间黑色区域,且周围有一圈白色的,所以使用mean_image和dyn_treshould将周围的白色的圈进行分割,
S3:然后找到白色胶区域的内圈,先膨胀腐蚀去除掉白色圈不完整的连接,然后将白色的区域填充形成完整矩形,然后再用完整矩形减去白色区域,得到中间的矩形
S4:寻找左和下边界所在的直线
①intersection,通过移动区域然后和原区域相交的方式得到边界
②skelenton,得到边界区域的骨架,即边界region的中心线
③gen_countours_xld,生成该中心线的轮廓xld
④smooth_contours_xld,将轮廓平滑
⑤segment_contours_xld,将轮廓分割为直线
⑥然后连接,再生成直线
S5:找灰尘,大灰尘直接用阈值,小灰尘用mean+dyn_treshould分割
S6:判断是否是真的灰尘,还是是杂质,先膨胀灰尘,然后和原灰尘region作intersection,得到环形区域
S7,使用intensity判断外环和内部的平均像素值的差,如果该差值大于某个值则认为该位置确实是一个灰尘