forest.hdev示例程序的目的是检测图中不同类的物体:树(2种)、草地和道路

halcon 实例分割结果类别概括 halcon示例_特征值

算法流程:
1.读图,将图像分解为三个彩色通道Red,Green,Blue
2.分割道路,由于道路的光谱特征与其他三类物体不同,在Blue通道分割出道路
3.分割第一类树木,在红色通道,根据亮度和最小尺寸分割出第一类树木(原图中较红的那部分)
4.分割出草地,草地的光谱特征与第一类树木接近,但是草地灰度特征似乎更加亮
5.分割松柏类树木,使用带有阈值化的分水岭方法分割松柏类树,避免影子对分割结果的影响
6.显示各类区域

步骤一:

dev_close_window ()
dev_update_window ('off')
read_image (Forest, 'forest_air1')
*读图
get_image_size (Forest, Width, Height)
*获取图像大小
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*打开窗口
decompose3 (Forest, Red, Green, Blue)
*将3通道图像转换为具有相同定义域(ROI)的三个单通道图像
参数:(多通道图像,输出图像1,输出图像2,输出图像3)
dev_display (Red)
///流程1:分解为三个彩色通道

halcon 实例分割结果类别概括 halcon示例_计算机视觉_02


从左到右依次为R、G、B通道图像

步骤二:

threshold (Blue, BlueBright, 80, 255)
*阈值分割(蓝色通道图像)
connection (BlueBright, BlueBrightConnection)
*分割连通域
select_shape (BlueBrightConnection, Path, 'area', 'and', 100, 100000000)
*通过面积进行区域筛选
dev_set_color ('red')
dev_set_draw ('margin')
*定义region填充模式
dev_display (Path)
disp_continue_message (WindowHandle, 'black', 'true')
*在荧幕上显示暂停程序继续操作的信息,即屏幕右下角显示“点击F5运行继续”
参数:(窗口句柄,文本颜色,文本框)参数3如果设置为“true”,文本将被写入一个白框中
stop ()
流程2:在Blue通道图像中分割出道路

halcon 实例分割结果类别概括 halcon示例_halcon 实例分割结果类别概括_03

步骤三:

threshold (Red, RedBright, 120, 255)
*阈值分割(红色通道图像)
connection (RedBright, RedBrightConnection)
*分割连通域
select_shape (RedBrightConnection, RedBrightBig, 'area', 'and', 1500, 10000000)
*通过面积进行区域筛选
closing_circle (RedBrightBig, RedBrightClosing, 7.5)
*使用圆形元素进行闭运算
opening_circle (RedBrightClosing, RedBrightOpening, 9.5)
*使用圆形元素进行开运算
connection (RedBrightOpening, RedBrightOpeningConnection)
*分割连通域
select_shape (RedBrightOpeningConnection, BeechBig, 'area', 'and', 1000, 100000000)
*通过面积进行区域筛选
select_gray (BeechBig, Blue, Beech, 'mean', 'and', 0, 59)
*使用区域的灰度进行区域筛选
参数:(输入待检测的区域,灰度图,被选择出的区域,特征值名称,特征的逻辑关系,特征值下限,特征值上限)
dev_display (Red)
dev_display (Beech)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
流程3:分割出第一类树木/

halcon 实例分割结果类别概括 halcon示例_halcon 实例分割结果类别概括_04

步骤四:

union1 (Beech, BeechUnion)
*联合区域,它是将所有区域变成一个整体,选择一个即为所有
complement (BeechUnion, NotBeech)
*返回区域的补集,即计算给定区域的补集
difference (NotBeech, Path, NotBeechNotPath)
*求取两区域不相交部分,即区域的差集
reduce_domain (Red, NotBeechNotPath, NotBeechNotPathRed)
*缩小图像的定义域
threshold (NotBeechNotPathRed, BrightRest, 150, 255)
*阈值分割(缩小后的区域)
connection (BrightRest, BrightRestConnection)
*分割连通域
select_shape (BrightRestConnection, Meadow, 'area', 'and', 500, 1000000)
*通过面积筛选区域
dev_display (Red)
dev_display (Meadow)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
流程4:分割草地

halcon 实例分割结果类别概括 halcon示例_特征值_05

步骤五:

union2 (Path, RedBrightClosing, BeechPath)
*与前面的union1不同,这里将两个区域合并成一个整体,仅限两个
smooth_image (Red, RedGauss, 'gauss', 4.0)
*递归滤波器对平滑图像(使用各种滤镜平滑图像)
参数(原图,平滑后的图像,滤波器,滤波参数)
invert_image (RedGauss, Invert)
*scale_image(RedGauss, Invert, 0.5, 200)
*反转图像
watersheds (Invert, SpruceRed, Watersheds)
*分水岭分割法,即使用带有阈值化的分水岭方法分割树木,避免影子对分割结果的影响
select_shape (SpruceRed, SpruceRedLarge, 'area', 'and', 100, 5000)
*通过面积进行区域筛选
select_gray (SpruceRedLarge, Red, SpruceRedInitial, 'max', 'and', 100, 200)
*使用区域的灰度进行区域筛选
参数:(输入待检测的区域,灰度图,被选择出的区域,特征值名称,特征的逻辑关系,特征值下限,特征值上限)
gen_empty_obj (LocalThresh)
*生成一个空对象
count_obj (SpruceRedInitial, NumSpruce)
*统计对象数量
dev_update_var ('off')
*在程序执行期间关闭变量窗口的更新
dev_update_pc ('off')
*在程序执行期间关闭PC(程序计数器)的更新。
for i := 1 to NumSpruce by 1
    *对上述统计出来的全部对象进行遍历
    select_obj (SpruceRedInitial, SingleSpruce, i)
    *在组员对象中选取指定对象
    min_max_gray (SingleSpruce, Red, 50, Min, Max, Range)
    *求取最大最小灰度值,当第三个参数设置为50时返回中值
    参数(输入区域,灰度图像,小于(大于)绝对最大(最小)值的分数,最小灰度值,最大灰度值,最小值与最大值的差)
    reduce_domain (Red, SingleSpruce, SingleSpruceRed)
    *缩小定义域
    threshold (SingleSpruceRed, SingleSpruceBright, Min, 255)
    *阈值分割
    connection (SingleSpruceBright, SingleSpruceBrightCon)
    *分割连通域
    select_shape_std (SingleSpruceBrightCon, MaxAreaSpruce, 'max_area', 70)
    *选取最大面积的区域
    concat_obj (MaxAreaSpruce, LocalThresh, LocalThresh)
    *将多个区域合并到一个组员下,但不改变对象个数
    参数:(输入对象1,输入对象2,连接后的区域)
    补充:union1/2是针区域融合,对象的个数会被改变.而concat_obj是将两个区域组合到一起,不改变对象个数 
endfor
opening_circle (LocalThresh, FinalSpruce, 1.5)
*开运算
/流程5:分割松柏类树

halcon 实例分割结果类别概括 halcon示例_特征值_06

步骤六:

dev_set_line_width (2)
*定义区域轮廓输出的线宽。
dev_set_color ('red')
dev_display (Red)
dev_display (FinalSpruce)
dev_set_color ('green')
dev_display (Beech)
dev_set_color ('yellow')
dev_display (Meadow)
流程6:显示各类区域

halcon 实例分割结果类别概括 halcon示例_特征值_07


效果图

完整程序:

dev_close_window ()
dev_update_window ('off')
read_image (Forest, 'forest_air1')
get_image_size (Forest, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
decompose3 (Forest, Red, Green, Blue)
dev_display (Red)
threshold (Blue, BlueBright, 80, 255)
connection (BlueBright, BlueBrightConnection)
select_shape (BlueBrightConnection, Path, 'area', 'and', 100, 100000000)
dev_set_color ('red')
dev_set_draw ('margin')
dev_display (Path)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
threshold (Red, RedBright, 120, 255)
connection (RedBright, RedBrightConnection)
select_shape (RedBrightConnection, RedBrightBig, 'area', 'and', 1500, 10000000)
closing_circle (RedBrightBig, RedBrightClosing, 7.5)
opening_circle (RedBrightClosing, RedBrightOpening, 9.5)
connection (RedBrightOpening, RedBrightOpeningConnection)
select_shape (RedBrightOpeningConnection, BeechBig, 'area', 'and', 1000, 100000000)
select_gray (BeechBig, Blue, Beech, 'mean', 'and', 0, 59)
dev_display (Red)
dev_display (Beech)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
union1 (Beech, BeechUnion)
complement (BeechUnion, NotBeech)
difference (NotBeech, Path, NotBeechNotPath)
reduce_domain (Red, NotBeechNotPath, NotBeechNotPathRed)
threshold (NotBeechNotPathRed, BrightRest, 150, 255)
connection (BrightRest, BrightRestConnection)
select_shape (BrightRestConnection, Meadow, 'area', 'and', 500, 1000000)
dev_display (Red)
dev_display (Meadow)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
union2 (Path, RedBrightClosing, BeechPath)
smooth_image (Red, RedGauss, 'gauss', 4.0)
invert_image (RedGauss, Invert)
watersheds (Invert, SpruceRed, Watersheds)
select_shape (SpruceRed, SpruceRedLarge, 'area', 'and', 100, 5000)
select_gray (SpruceRedLarge, Red, SpruceRedInitial, 'max', 'and', 100, 200)
gen_empty_obj (LocalThresh)
count_obj (SpruceRedInitial, NumSpruce)
dev_update_var ('off')
dev_update_pc ('off')
for i := 1 to NumSpruce by 1
    select_obj (SpruceRedInitial, SingleSpruce, i)
    min_max_gray (SingleSpruce, Red, 50, Min, Max, Range)
    reduce_domain (Red, SingleSpruce, SingleSpruceRed)
    threshold (SingleSpruceRed, SingleSpruceBright, Min, 255)
    connection (SingleSpruceBright, SingleSpruceBrightCon)
    select_shape_std (SingleSpruceBrightCon, MaxAreaSpruce, 'max_area', 70)
    concat_obj (MaxAreaSpruce, LocalThresh, LocalThresh)
endfor
opening_circle (LocalThresh, FinalSpruce, 1.5)
dev_set_line_width (2)
dev_set_color ('red')
dev_display (Red)
dev_display (FinalSpruce)
dev_set_color ('green')
dev_display (Beech)
dev_set_color ('yellow')
dev_display (Meadow)