传统的机器视觉通常包括两个步骤:图像处理和特征检测。
而沟通二者的桥梁则是图像分割(Image Segmentation)。
图像分割通过简化或改变图像的表示形式,使得图像更易于分析。
graph LR
图像处理 --`桥梁: 图像分割`--> 特征检测
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。
它是由 图像处理 到 图像分析的关键步骤。
图像操作的一般步骤
1. 获取图像
- 图像文件读取
Halcon编程中的相关算子
-
read_image
-
read_sequence
-
read region
-
- 相机拍摄
2. 图像处理
- 灰度化处理
- 它是Blob分析的预处理操作
- Blob分析适用于高对比度和场景简单的图像
"RGB转灰度"
- rgb1_to_gray(PicName, GrayImage)
"RGB分解为red\green\blue 三通道图像"
- decompose3(PicName, R, G, B) |
- 图像分割
- 基于阈值的分割方法
- 动态阈值
- 固定阈值
- 自动阈值
- 基于区域的分割方法
- 基于边缘的分割方法
- 基于特定理论的分割方法等(大津法,分水岭法等)
大津法:将黑暗与明亮部分隔开
- binary_threshold
直方图分割
- threshold
partition_dynamic
auto_threshold
bin_threshold
char_threshold
dyn_threshold
fast_threshold
threshold
var_threshold
binary_threshold
- 基于阈值的分割方法
- 形态学运算
- 腐蚀
- 膨胀
- 开闭运算
- 骨架
Connection
select_shape
erosion
dilation
opening
closing
opening_circle
closing_circle
opening_rectanglel
closing_rectanglel
difference
intersection
unionl
shaps_trans;
fill_up
boundary
skeleton
top-hat
bottom-hat
hit-or-miss
- 连通性分析
连通域打散
- connection
3. 图像分析
- 特征提取
select_shape
area_center
smallest_rectanglel
smallest_rectangle2;
compactness
eccentricity
elliptic_axis
area_center_gray
intensity
min_max_gray
- 特诊值计算
- 区域特征分析:面积、周长、半径等
- 灰度特征提取:最小最大灰度值、平均灰度值等
- 场景描述
案例
* 读取图像 - 大津法
read_image(Image,'输入图片.jpg')
* 图片灰度化, 分割图像
rgb1_to_gray(Image, GrayImage)
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
* 连通域分割,将暗的图案提取出来
connection(Region, ConnectedRegions)
* 区域选择 以面积和宽度进行筛选 minValue to maxValue, 建立一个新的变量为ConnectedRegions
select_shape(ConnectedRegions,SelectedRegions, ['area','width'] ,'and', [28920, 230],[90970,410])
* 对筛选出来的区域进行排序
sort_region(SelectedRegions, SortedRegions, 'first_point', 'true','column')
* 定位每个区域的目标中心和面积
area_center(SortedRegions, Area, Row, Column)
* 计算子区域的数量
count_obj(SortedRegions, Number)
* 显示原图
dev_display(Image)
* 设置字体属性
set_display_font(3600, 16, '宋体','true', 'false')
for i := 0 to Number -1 by 1
* 展示图片信息
disp_message(3600, '面积:'+Area[i], 'Image', Row[i], Column[i], 'black', 'true')
endfor
*读取彩色RGB图像,命名为Image
read_image (Image, './输入图片.PNG')
*将命名为Image的彩图分解为R,G,B三通道的灰度图
decompose3(Image, ImageR, ImageG, ImageB)
*将R,G,B单通道灰度图转换为H,S,V单通道
trans_from_rgb(ImageR, ImageG, ImageB, ImageResultH, ImageResultS, ImageResultV, 'hsv')
*选择R通道进行阈值分割
threshold(ImageR,Regions,128, 255)
*将名为Regions图形进行连通域打散,并命名为ConnectedRegions
connection(Regions, ConnectedRegions)
*将ConnectedRegions图像进行特征提取,使用面积和高度特征,选取面积为1110-3886,高度为50-84范围内的图形,并命名为SelectedRegions
select_shape(ConnectedRegions, SelectedRegions,['area','height'], 'and', [1110,50],[3886,84])
*进行区域排序
sort_region(SelectedRegions, SortedRegions, 'first_point', 'true', 'colum')
*进行读取字符模型
read_ocr_class_mlp('Document_0-9A-Z_NoRej.omc', OCRHandle)
*识别字符,需要用ImageResultS单通道灰度图
do_ocr_multi_class_mlp(SortedRegions,ImageResultS,OCRHandle, Class, Confidence)
*可视化处理
dev_display(Image)
set_display_font(3600, 40, 'mono', 'true', 'false')
disp_message(3600,'识别结果:'+sum(Class), 'Image', 12, 12, 'black', 'true')
VStudio/C#与Halcon联合编程
联合编程分为两个部分:算法开发 和 软件开发
- 算法开发:使用 HALCON HDevelop,实现图像处理的功能。 例如,识别图像的个数、内容等
- 软件开发:使用 VStudio,调用相应的 API,并且绘制 GUI 界面,从而制作出一个 Windows 应用程序
- API:一般指的是由 Halcon 源码 转换为 C# 源码 并将其进行封装的一个工具类
举例
实现一个统计图片中对象个数的Window窗口应用
* Halcon源码
* 1.读图
read_image (Test, './testPic.jpg')
* 2.彩色图转灰度图
rgb1_to_gray (Test, GrayImage)
* 3.二值化
threshold (GrayImage, Regions, 0, 248)
* 4.孔洞填充
fill_up (Regions, RegionFillUp)
* 5.区域分割
connection (RegionFillUp, ConnectedRegions)
* 6.面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 30000.6, 120000)
* 7.统计个数
count_obj (SelectedRegions, Number)
项目目录
- HalconProject:存放 "算法开发" 的程序和相关资料,也就是 图像处理的功能开发
countObj.hdev: Halcon 源码countObj.cs: 由 Halcon 源码导出的对应功能的 C# 程序源码testPic.jpg: 测试图片
- CountObjTool:在 VStudio 中,导入
countObj.cs的 C# 程序源码,将其封装成 "统计个数" 的工具类 - CountObjAPP:实例化 已封装的"统计个数"的工具类(调用 API ),并绘制相应的软件界面,从而实现"统计个数"的 Windows 应用程序
效果展示
程序位置:
./CountObjApp/bin/Debug/CountObjApp.exe
- 双击
CountObjApp.exe - 点击读图
- 点击运行