BLOB分析
分割图像
threshold(Image : Region : MinGray, MaxGray :)
最简单,最快,使用频率最高的方法。
如果目标与背景之间存在灰度差,则threshold首先被使用
binary_threshold(Image : Region : Method, LightDark : UsedThreshold)
黑白对比度足够,可直接使用。
/*自动全局分割*/
auto_threshold(Image : Regions : Sigma : )
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
mean_image(Image : ImageMean : MaskWidth, MaskHeight : )
局部分割,通常和均值滤波一起使用。一般由于背景不一,目标表现为比背景局部亮或者暗,使用局部分割。
形态学处理
膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程。
腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉.
膨胀与腐蚀的主要作用:
(1)消除噪声
(2)分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素
(3)寻找图像中明显的极大值或极小值区域
(4)求出图像的梯度
开运算:先腐蚀后膨胀的过程称为开运算,
作用:去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积.(此处的不改变其面积是有条件的,即结构元素设置的必须要合理)
闭运算:先膨胀后腐蚀的过程是闭运算。
作用:填充物体内细小的空洞,连接临近物体,平滑边界,同时不改变其面积。(此处的不改变其面积是有条件的,即结构元素设置的必须要合理)
膨胀
structelemnt:结构元素(gen_circle,gen_rectangle1,gen_rectangle2,gen_ellipse这些生产的区域)、
dilation_circle(Region : RegionDilation : Radius : )
/*对一个圆形区域膨胀region::要进行膨胀操作的区域。RegionDilation—膨胀获得区域。Radius—圆形结构半径*/
dilation_golay(Region:RegionDilation : GolayElement, Iterations, Rotation:)
dilation_rectangle1(Region : RegionDilation : Width, Height :/*矩形结构元素的宽高*/ )
//矩形
dilation_seq(Region : RegionDilation : GolayElement, Iterations : )
dilation1(region,structelemnt:regiondilation:iterations迭代次数)
dilation2(region,structelement生成的结构元素:regiondilation:row,column设置参考点位置,一般为原点,iterations迭代次数即膨胀次数)
腐蚀
erosion1(Region, StructElement : RegionErosion : Iterations : )
/*
StructElement :生成结构元素
Iterations :迭代次数,腐蚀次数
*/
erosion2(Region, StructElement : RegionErosion : Row, Column, Iterations : )
/*
Row, Column, :设置参考点位置,原点位置。
*/
erosion_circle(Region : RegionErosion : Radius : )
//对一个圆形区域进行腐蚀
erosion_rectangle1(Region : RegionErosion : Width, Height : )
//矩形
开闭运算
opening(region要进行开运算操作的区域,structelement生成的结构元素:regionopening开运算后获得的区域::)
opening_rectangle1(Region : RegionOpening : Width, Height : )
opening_circle(region要进行开运算的区域:regionopening开运算后的区域:radius圆形结构元素的半径)
//开运算
closing(region要进行闭运算操作的区域,structelement生成的结构元素:regionclosing闭运算后的区域::)
closing_rectangle1(Region : RegionClosing : Width, Height : )
closing_circle(region:regionclosing:radius)
参考代码
dev_close_window ()
read_image (Image, 'printer_chip/printer_chip_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 100, 255)
connection (Region, ConnectedRegions)
dev_set_color ('black')
*使用半径为1的圆形结构腐蚀得到区域
erosion_circle (ConnectedRegions, RegionErosion, 1)
*使用长宽均为1的矩形结构元素腐蚀得到区域
erosion_rectangle1 (ConnectedRegions, RegionErosion1,1, 1)
gen_circle (Circle,50, 50, 1)
*使用生成的圆形结构元素腐蚀得到区域
erosion1 (ConnectedRegions, Circle, RegionErosion2, 1)
erosion2 (ConnectedRegions, Circle, RegionErosion3, 0, 0, 1)
形状匹配
- 创建ROI
`
//任意形状
draw_region()
draw_polygon()
//标准形状
draw_rectangle1/2()
draw_circle()
draw_ellipse()
draw_line()
//生成标准ROI
gen_rectangle1/2()
gen_circle()
gen_ellipse()
gen_region_line()
//通过XLD创建AOI
gen_region_contour_xld()
gen_region_polygon_xld()`
ROI修正
//修正函数
erosion() //减小ROI
dilation() //扩大ROI
shape_trans() //形状转换
boundary() //像素级边界
move_region() //移动到新位置
//组合
intersection() //交集
difference() //差集
union1/2() //并集函数分1.2
直接创建模板
create_shape_model(
Template , // 模板图像
NumLevels, // 图像金字塔
AngleStart, // 起始角度
AngleExtent, // 角度范围
AngleStep, // 角度步长:无特殊要求auto,要求精确,步长小,占用内存多 // 速度慢。
Optimization, // 优化算法
Metric, // 极性
Contrast, // 对比度:测量目标与背景灰度值差异
MinContrast, /*最小对比度:减少噪声,纹理。可以通过助手,或这两个函数 estimate_noise(),inspect_shape_model()获得*/
ModelID // 模板ID
)
create_scaled_shape_model()
create_aniso_shape_model()
获得模型轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
模板匹配
让halcon自己填写参数吧,tab tab
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
测试代码
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Testlm, 'C:/Users/vmyf35/Pictures/testlm.jpg')
disp_message (WindowHandle,'灿坤找螺母', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
gen_circle (ROI_0, 179.875, 393.387, 27.9687)
* gen_circle (ROI_0, 329.587, 423.467, 53.6764)
reduce_domain (Testlm, ROI_0, ImageReduced)
create_shape_model (ImageReduced, 'auto', rad(0), rad(1), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours (ModelContours, ModelID, 1)
for Index := 1 to 4 by 1
read_image (Image, 'C:/Users/vmyf35/Pictures/testlm.jpg')
count_seconds (Seconds)
find_shape_model (Image, ModelID, rad(0), rad(1), 0.5, 0, 0.5, 'least_squares', 2, 0.5, Row, Column, Angle, Score)
count_seconds (Seconds1)
Runtime := (Seconds1-Seconds)*1000
gen_cross_contour_xld (Cross, Row, Column, 6, Angle)
dev_display (Image)
dev_display_shape_matching_results (ModelID, 'red', Row, Column, Angle, 1, 1, 0)
dev_set_color ('blue')
disp_message (WindowHandle, Runtime$'.1f'+'ms', 'window', 12, 12, 'black', 'true')
if(Index != 4)
disp_continue_message (WindowHandle, 'black', 'true')
stop()
endif
endfor
clear_shape_model (ModelID)
测试图片
写的差,能看就看吧…