文章目录
- 文章专栏
- 前言
- 文章解析
- 开头
- 步骤分析
- 简单案例
- 进阶方案
- 进阶代码案例
- crystal,结晶匹配
- 需求分析
文章专栏
Halcon开发
Halcon学习 练习项目gitee仓库
CSDN Major 博主Halcon文章推荐
前言
今天来看第三章内容,既然是零基础,而且我还有大概3-4个月的时间准备,我还是老老实实从头开始学机器视觉好了。
文章解析
开头
- Blob 解析非常简单。
- Blob通过亮度,将连通点和背景进行区分
Blob分析具有特别好的效果,经常用于机器视觉的各种需求中。
步骤分析
- 获取图片
- 图片特征性分割
- 特征获取
简单案例
* 读取案例图片
read_image (Image, 'particle')
* 灰度获取,灰度范围:120-255
threshold (Image, BrightPixels, 120, 255)
* 按照连通性对图像进行区分
connection (BrightPixels, Particles)
* 将分割好的图转化为对应的坐标数组(面积,中心点x,中心点y)
area_center (Particles, Area, Row, Column)
进阶方案
由于某些图像的复杂性要远远高于简单示例,所以可以按照一下步骤来进行机器视觉分析
- Acquire Image(s):获取图片
- Use ROI
- 调整图片的ROI
- 矫正图片
- 选取用于区分的特性,例如:灰度,面积,形状
- 区分图片
- 匹配图像特性
- 将所有匹配的图像转换为世界坐标
- 可视化结果
进阶代码案例
crystal,结晶匹配
示例路径: %HALCONEXAMPLES%/solution_guide/basics/crystal.hdev
模板,找到如下三个结晶块
需求分析
- 我们需要找到结晶体。结晶体和气泡的区别就是结晶体有明显的六边形结构
- 再对低区分度的图片进行区分的时候,我们用到mean_image来获得一个模糊的背景
- 将原图片和模糊图片进行dyn_threshold,获取到高8个灰度的区域。因为图片的特点就是白背景,灰物体。灰物体涂抹后,亮度变高。叠放之后区域就是物体区域。
- 下一步我们就选择六边形的区域即可。因为结晶体是镂空图形,将所有的镂空图形转换为凸多边形。即填充空洞。
- 然后进行图像面积匹配,面积必须是填充图形才可以。后面就是灰度匹配。
* crystal.hdev: extraction of hexagonally shaped crystals via local thresholding and region post-processing
*
dev_close_window ()
dev_update_window ('off')
* ****
* 添加图片,设置图像填充格式,线条宽度等设置
* ****
read_image (Image, 'crystal')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Image)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* 区分图像
* ****
* -> 使用灰度进行区分
* 涂抹处理,将灰度范围变大
mean_image (Image, ImageMean, 21, 21)
* 叠放对比,获取灰度高8个单位的部分。
dyn_threshold (Image, ImageMean, RegionDynThresh, 8, 'dark')
* -> 将ROI连通区域区分
connection (RegionDynThresh, ConnectedRegions)
dev_display (ConnectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* 处理Region
* ****
* 将镂空图形空洞填充,变成凸多边形
shape_trans (ConnectedRegions, ConvexRegions, 'convex')
* 选择图片面积区域在600 - 2000的图像
select_shape (ConvexRegions, LargeRegions, 'area', 'and', 600, 2000)
* 选择[交叉熵]为1-5.6的区域。简单来说就是不重叠的区域
select_gray (LargeRegions, Image, Crystals, 'entropy', 'and', 1, 5.6)
dev_display (Image)
dev_display (Crystals)
一文搞懂熵(Entropy),交叉熵(Cross-Entropy)
我感觉我单纯的翻译原文没啥好写的。还是直接上代码注释好了