1、blob(Binary Large Object)是指二值图像中连通区域。
预处理通常包括一系列步骤,例如去噪、形态学操作、特征提取等。
read_image(Image,'claudia')
get_image_size(Image,Width,Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display(Image)
* 高斯分布
gauss_distribution (60, Distribution)
* 添加高斯噪声分布
add_noise_distribution (Image, ImageNoise, Distribution)
* 生成图像(保存到本地)这里保存的使‘bmp’格式的图片,第三个参数是保存的路径
* 生成图像保存到本地
* 参数一:句柄
* 参数二:保存的图片格式
* 参数三:保存的路径
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/高斯噪声')
* 均值平滑 (对图像进行平均滤波处理,以降低图像中的噪声。)
* 参数一:原始图像
* 参数二:输出图像
* 参数三、四:计算局部均值时使用的窗口的宽高
mean_image (ImageNoise, ImageMean, 5,5)
dump_window (WindowHandle, 'bmp', 'D:/Halcon课程/绘制图形/均值平滑')
* 中值滤波
* 参数一:输入图像,
* 参数二:输出图像,
* 参数三:滤波器形状(圆circle、正方形square)
* 参数四:尺寸,
* 参数五:'mirrored' 表示边缘处理方式,当窗口超出图像边界时,使用镜像方式进行处理
median_image (ImageMean, ImageMedian, 'circle', 1, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波1')
median_image (ImageMean, ImageMedian, 'square', 5, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波5')
median_image (ImageMean, ImageMedian, 'square', 7, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波7')
* 椒盐噪声分布
* 参数一、二:生成噪声的宽度和高度
sp_distribution (5, 5, Distribution)
* 生成的随机噪声添加到图像中
add_noise_distribution (ImageMedian, ImageNoise1, Distribution)
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/椒盐噪声')
参考文章:median_image
2、将彩图转化为灰度图
read_image (Image, 'patras')
*将彩色图像转成灰色图像
rgb1_to_gray (Image, GrayImage)
dev_display (GrayImage)
* 将RGB彩色图像分解为单独的通道(红色、绿色、蓝色)
decompose3 (Image, R, G, B)
* 将RGB彩色图像的红、绿、蓝通道合并为灰度图像
rgb3_to_gray (R, G, B, ImageGray)
dev_display (ImageGray)
3、全阈值分割 threshold(二值化)
* 获取当前活动窗口的句柄(handle)
dev_get_window (WindowHandle)
read_image (Image, 'pellets.png')
* 全局阈值分割,适用于环境稳定,目标与背景存在明显的灰度差的情况
* 参数一、二:输入图像和输出区域
* 参数三、四:阈值上限和下限
threshold (Image, Region, 128, 255)
* connection 连通性,对区域进行链接操作
* 参数一:输入的二值化或分割后的图像区域。
* 参数二:输出链接
connection (Region, Connection)
* select_shape 根据形状的特征选择目标区域
* 参数一:输入图像链接或区域
* 参数二:输出的选择后的区域
* 参数三:选择区域的特征,'area'表示区域的面积
* 参数四:多个条件的逻辑关系,'and'表示满足所有条件的区域
* 参数五、六:表示选择面积的最大值和最小值
select_shape (Connection, SelectedRegions, 'area', 'and', 550, 99999)
* erosion_circle 对选定的区域进行圆形腐蚀操作,断开链接区域
* 参数一:输入选定区域
* 参数二:输出腐蚀后的区域
* 参数三:腐蚀半径大小
erosion_circle (SelectedRegions, RegionErosion, 7.5)
* connection 连通性
connection (RegionErosion, ConnectedRegions2)
* 膨胀:对每个连通域做圆形膨胀操作,还原轮廓大小,目的是为了绘制边缘(半径越大,膨胀越明显)
dilation_circle (ConnectedRegions2, RegionDilation, 7.5)
* 设置绘制操作,'margin' 参数表示设置绘图模式为绘制边缘。
dev_set_draw ('margin')
dev_display (Image)
dev_display (RegionDilation)
* area_center 用于计算给定区域的面积以及重心的位置
* 参数一:要计算属性的输入区域
* 参数二:表示计算得到的区域的面积
* 参数三、四:计算得到的区域中心的行和列坐标
area_center (RegionDilation, Area, Row, Column)
* gen_cross_contour_xld 生成一个由两条相互垂直的线段组成的轮廓,形成一个十字形状。
gen_cross_contour_xld (Cross, Row, Column, 15, 0.785398)
* count_obj 计数器:出现一次++ RegionDilation出现一次++,加的值在Number
count_obj (RegionDilation, Number)
* 设置绘图颜色
dev_set_color('green')
* 设置显示字体属性
* 参数一:句柄
* 参数二:字体大小
* 参数三:'mono' 表示选择单色字体
* 参数四:表示字体是否加粗
* 参数五:表示是否设置字体倾斜
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 设置文本放的位置
set_tposition (WindowHandle,10,240)
* 设置文本的内容
write_string (WindowHandle, '数量:'+Number)
参考文章:select_shape
4、局部阈值分割
read_image (Image, 'clip')
* 全自动阈值分割,主要原理是两个波峰图像的自动阈值分割
* 参数一:输入的灰度图像
* 参数三: max_separability(最大限度的可分型) 和 smooth_histo(直方图平滑)
* 参数四:'dark'表示目标为暗色物体
* 参数五:输出的阈值
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
* 计算图像的平均值图像(可以通过对图像中每个像素周围的邻域进行像素值的平均来生成一个平均值图像。)
mean_image (Image, ImageMean, 7, 7)
* 根据图像的局部特性和平均值图像进行动态阈值分割,可以根据图像的不同区域自适应地选择阈值进行分割。
* 参数一:输入的图像
* 参数二:平均值图像
* 参数三:输出的动态阈值分割的结果区域
* 参数四:指定斑点的大小,用于控制动态阈值计算的斑点尺寸
* 参数五:'light'表示目标为亮色物体(目标像素灰度值较大)
* dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'light')
* 根据图像的局部方差和均值进行阈值分割。它可以根据图像局部区域的方差和均值来选择合适的阈值,从而实现图像的分割。主要是用来区分目标和背景
* 参数一:输入的平均值图像
* 参数二:输出的阈值分割结果区域
* 参数三、四:指定邻域的宽高
* 参数五:指定方差缩放因子,用于调整方差的权重
* 参数六:'dark' 表示目标为灰色物体
var_threshold (ImageMean, Region1, 15, 15, 0.2, 2, 'dark')
* 自动计算图像的阈值,并将图像分割成不同的区域
* 2代表sigma,数值越大代表提取区域越小
auto_threshold (ImageMean, Regions, 2)
* 快速全局阈值分割类似于threshold,速度更快
* 参数三、四:指定阈值的下限和上限
* 参数五:指定阈值类型
fast_threshold (ImageMean, Region2, 128, 255, 20)
* 基于阈值的分水岭算法对图像进行分割
* 参数三:指定阈值
watersheds_threshold (ImageMean, Basins, 10)
参考文章:dyn_threshold
5、blob斑点检测案例
read_image (Image, 'progres')
get_image_size(Image,Width,Height)
dev_open_window(0,0,Width,Height,'black',WindowHandle)
dev_display(Image)
dev_set_color ('green')
dev_set_draw ('margin')
* 创建旋转矩形
gen_rectangle2 (ROI_0, 308, 212, rad(4.15129), 124, 36)
* 裁剪
reduce_domain (Image, ROI_0, ImageReduced)
* 阈值分割
threshold (ImageReduced, Region, 0, 160)
* 连接区域
connection (Region, ConnectedRegions)
* 根据面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 30)
* 计算选定区域的椭圆轴参数
* 参数二:椭圆的半长轴长度。
* 参数三:椭圆的半短轴长度。
* 参数四:椭圆的旋转角度。
elliptic_axis (SelectedRegions, Ra, Rb, Phi)
* 获取区域面积与中心点
area_center (SelectedRegions, Area, Row, Column)
dev_display (Image)
dev_set_color ('red')
dev_display (SelectedRegions)
6、形态学调整
* 关闭窗口更新
dev_update_window ('off')
* 清空显示窗口内容
dev_clear_window ()
dev_open_window (0, 0, 730, 520, 'black', WindowID)
read_image (Bond, 'die/die_03.png')
dev_display (Bond)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
* 在窗口中显示消息
* 参数二:表示消息的颜色为黑色
* 参数三:显示消息时是否等待用户确认
disp_continue_message (WindowID, 'black', 'true')
* 停止程序执行
stop ()
* 用于进行图像阈值分割
threshold (Bond, Bright, 100, 255)
* 将二值化区域转化成一个带方向的矩形。主要的用途是定位,将来也可以做orc识别
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, DieGray)
* 对输入图像进行阈值处理
threshold (DieGray, Wries, 0, 50)
* 填充具有给定形状特征的区域中的空,限定条件是面积在1~100的孔进行填充。
fill_up_shape (Wries, 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)
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* 把整个区域断开
* connection (Balls, ConnectedRegions)
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 0, 2000)
* count_obj(SelectedRegions, Number)
* area_center(SelectedRegions, Area, Row, Column)
* for i:=1 to |Number| by 1
* a:=sqrt(Area/3.14)
* b:=Row[i]+20
* c:=Column[i]-10
* dev_set_color ('red')
* set_tposition (WindowID, b, c)
* write_string (WindowID, '半径:'+a)
* endfor
* 把整个区域断开
connection (Balls, ConnectedRegions)
* 选择圆的相似度在0.9~1之间
select_shape (ConnectedRegions, SelectedRegions, 'circularity', 'and', 0.9, 1)
* 如果不进行 connection 断开,则是整个区域,没办法使用
* connection (SelectedRegions, ConnectedRegions1)
* 对输入的区域进行排序操作
* 参数三:指定排序的依据,'first_point' 按照区域的第一个点的坐标进行排序。
* 参数四:是否采用升序排序
* 参数五:排序的方式,这里是按照列的顺序进行排序。
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
dev_display (Bond)
dev_display (SortedRegions)
* 找到包围输入区域的最小圆
* 参数二、三:最小圆的圆心的XY坐标。
* 参数四:最小圆的半径
smallest_circle (SortedRegions, Row, Column, Radius)
* 准备元组取出来Radius
NumBalls:=|Radius|
* 直径
Diameter:=2*Radius
* 最小值
minDiameter := min(Diameter)
* 最大值
maxDiameter := max(Diameter)
* 平均值
meanDiameter := mean(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i:=1 to NumBalls by 1
* 1.输入窗口句柄 2.输入要打印的信息 3.参考的位置 4&&5.打印的位置 6.颜色 7.边框
disp_message (WindowID, '直径:'+Diameter, 'window', Row, Column, 'black', 'true')
endfor
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()
7、开运算、闭运算
* read_image (Image, 'claudia')
* 转灰度
* rgb1_to_gray (Image, GrayImage)
* 设置阈值
* threshold (GrayImage, Regions, 32, 113)
* 阈值分割
* connection (Regions, ConnectedRegions)
* 选择区域
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20377.7, 83996)
* area_center (SelectedRegions1, Area, Row, Column)
* 形态学操作 圆形膨胀
* dilation_circle (SelectedRegions1, RegionDilation, 3.5)
* dilation_rectangle1
* 形态学操作 腐蚀
* erosion_circle (RegionDilation, RegionErosion, 3.5)
********** 开运算(先腐蚀后膨胀)
* read_image (Image, 'pellets')
* 全局阈值分割
* threshold (Image, Regions, 106, 255)
* connection (Regions, ConnectedRegions1)
* select_shape(ConnectedRegions1,SelecteRegions,'area','and',500,9999)
* 腐蚀
* erosion_circle (SelecteRegions, fushi, 7.5)
* connection 分割区域:将所关联的像素区域连成一组
* connection (fushi, ConnectedRegions)
* 膨胀
* dilation_circle (ConnectedRegions, pengzhang, 7.5)
* dev_display (Image)
* dev_display (pengzhang)
********** 闭运算(先膨胀后腐蚀)
* 结构元素半径:边长越大,膨胀或腐蚀越明显
* 增加像素:使用膨胀或闭运算
* 减少像素:使用腐蚀或开运算
read_image (Image, 'pellets')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
dilation_circle (SelectedRegions, pengzhang, 3.5)
connection (pengzhang, ConnectedRegions1)
erosion_circle (ConnectedRegions1, fushi, 3.5)
dev_display (Image)
dev_display(fushi)