图像处理与机器视觉 - Halcon编程

401 阅读4分钟

传统的机器视觉通常包括两个步骤:图像处理和特征检测。

而沟通二者的桥梁则是图像分割(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窗口应用

cloud.tencent.com/developer/a…

* 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)

项目目录

image.png

  • HalconProject:存放 "算法开发" 的程序和相关资料,也就是 图像处理的功能开发
    • countObj.hdev : Halcon 源码
    • countObj.cs : 由 Halcon 源码导出的对应功能的 C# 程序源码
    • testPic.jpg : 测试图片
  • CountObjTool:在 VStudio 中,导入 countObj.cs 的 C# 程序源码,将其封装成 "统计个数" 的工具类
  • CountObjAPP:实例化 已封装的"统计个数"的工具类(调用 API ),并绘制相应的软件界面,从而实现"统计个数"的 Windows 应用程序

效果展示

程序位置:./CountObjApp/bin/Debug/CountObjApp.exe

  1. 双击 CountObjApp.exe image.png
  2. 点击读图 image.png
  3. 点击运行 image.png