通过分割形态学得到一些图像区域之后,就可以使用特提取想要的区域,通常特征的类型有面积最大的区域、灰度差异大的图、区域面积中心
区域形状特征的算子
- 区域面积及和中心点坐标信息:area_center()
- 封闭区域孔洞的面积:area_holes()
- 根据特征值选择区域:select_shape() 可以根据不同特征选取区域
- 根据特征值创建区域:inner_circle()
- 求最小外接矩形:smallest_rectangle2() 矩形与物体方向平行。smallest_retangle1()矩形和坐标轴平行
- 基于灰度值的特征:gray_features() 获取图像最大最小灰度值
- 区域最大、最小灰度值:min_max_gray()
- 灰度区域的面积和中心:are_center_gray() 求的是重心
- 根据灰度值选择区域:select_gray()
例程1 区域面积和中心点
*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*划分AOI区域 并提取 等价于==gen_rectangle1()+reduce_domain()
rectangle1_domain(GrayImage, ImageReduced, 100, 150, Height-60, Width-100)
*自适应阈值分割 提取暗的部分
binary_threshold(ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)
*显示暗部
dev_clear_window()
dev_display(Region)
*将联通区域分开
connection(Region, ConnectedRegions)
*获取图像面积和中心坐标
area_center(ConnectedRegions, Area, Row, Column)
*获取不连通区域数量
count_obj(ConnectedRegions, Number)
for i:=1 to Number by 1*设置显示对象颜色dev_set_color('red')select_obj(ConnectedRegions, ObjectSelected, i)*设定文字输出的起始坐标点set_tposition(WindowHandle, Row[i-1]+60, Column[i-1])*设定输出文字颜色dev_set_color('blue')*设定字体set_font(WindowHandle,'-System-24-*-0-0-0-1-GB2312_CHARSET-')*输出文字内容write_string(WindowHandle, Area[i-1])
endfor
例程2 统计孔洞面积
*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)*自适应阈值分割 提取暗的部分
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
*显示暗部
dev_clear_window()
dev_display(Region)
*计算所有空洞面积和
area_holes(Region, Area1)
*将面积以字符串信息显示在窗口中
disp_message(WindowHandle, 'Size of all holes= ' +Area1+' pixel', 'window', 12, 12, 'black', 'true')
例程3 选取面积较大几个区域
*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*划分AOI区域 并提取 等价于==gen_rectangle1()+reduce_domain()
rectangle1_domain(GrayImage, ImageReduced, 100, 150, Height-60, Width-100)
*自适应阈值分割 提取暗的部分
binary_threshold(ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)
*显示暗部dev_clear_window()
dev_display(Region)
*计算所有空洞面积和
*area_holes(Region, Area1)
*将面积以字符串信息显示在窗口中
*disp_message(WindowHandle, 'Size of all holes= ' +Area1+' pixel', 'window', 12, 12, 'black', 'true')*将联通区域分开
connection(Region, ConnectedRegions)
*获取图像面积和中心坐标
area_center(ConnectedRegions, Area, Row, Column)
*获取不连通区域数量
count_obj(ConnectedRegions, Number)select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 4405, 99999)
dev_clear_window()
dev_display(SelectedRegions)
面积大于等于4405的区域被选出来
select_shape(SelectedRegions, SelectedRegions1, 'width', 'and', 80, 99999)
dev_clear_window()
dev_display(SelectedRegions1)
宽度大于等于80的被选出来
例程4 求最小外接矩形
*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'luosi1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*自适应阈值分割 提取暗的部分
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
connection(Region, ConnectedRegions)
select_obj(ConnectedRegions, ObjectSelected, 1)
smallest_rectangle2(ObjectSelected, Row, Column, Phi, Length1, Length2)
gen_rectangle2_contour_xld(Rectangle, Row, Column, Phi, Length1, Length2)
dev_set_window(WindowHandle)
dev_set_draw('margin')
dev_set_line_width(3)
dev_display(Image)
dev_display(Rectangle)
基于图像纹理的特征
形状特征秒速了图像种局部区域的几何属性,在模式匹配中,常常用形状特征作为匹配的依据,因为形状特征具有旋转不变性,并且不易受到颜色和光照影响,抗噪声干扰也强。
- 纹理特征:包括图像能量、相关性、局部均匀性、对比度等
- Halcon采用灰度共生矩阵来描述上述特征。
- 灰度共生举证:反应成对灰度像素点的一种共生关系。
-
- 能量,相关性,局部均匀性,反差,
- 能量: 表示灰度共生矩阵中元素的平方和,能量值越大,表示灰度变化比较稳定,反映均匀性
- 相似性:表示纹理在行或列方向的相似程度,相关性越大,相似性越高
- 局部均匀性:反映图像局部纹理的变化量,越大,局部变化越小
- 反差(对比度):表示矩阵值的差异程度,间接表示图像灰度变化幅度,反差越大,纹理深浅越明显,图像越清晰