一.机器视觉概述
计算机与机器视觉的区别:
机器视觉系统组成:
光源->镜头->相机->图像采集模块->图像处理模块->交互界面
机器视觉硬件系统:
视觉系统:
光源
光源分类
照明技术:亮视野与暗视野 低角度照明 前向光直射照明 前向光漫射照明 背光照明 颜色与补色 偏光技术
镜头
作用:成像 聚焦 曝光 变焦
常用公式:
镜头分类:标准镜头 广角镜头 长焦距镜头 微距镜头 远心镜头
光圈:光圈越小,景深越长
快门:控制曝光时间
镜头接口
相机
将现场的影响转化成数字信号或模拟信号的工具
类别:CCD CMOS
线阵相机 面阵相机
逐行扫描 隔行扫描
卷帘快门 全局快门
应用
工业
食品包装加工 产品质量检测 视觉检测 装配机器人视觉检测 搬运机器人视觉导航
医学
主要运用在医学疾病的诊断方面
交通领域
车流量监控 车辆违规判断 车牌照识别 汽车自动导航
农业
果蔬采摘 果蔬分级 农田导航 各种作物生长因素检测
生活
智能家居 无人驾驶
二.数字图像基础
图像和数字图像
图像是人类的视觉基础,是自然景物的客观反映
图:物体反射或透射光的分布
像:人的视觉系统所接受的图在人脑中所形成的印象或认识
分类:
可见图像 不可见图像
二值图像 灰度图像
彩色图像 黑白图像
静态图像 动态图像
二维图像 三维图像
图像的数字化
图像的数字化过程
扫描->分色->采样->量化
采样
在空间上将一幅连续图像分割成多个离散的小区域(即像素),每个小区域用一个亮度值(或颜色值)来表示。
量化
将采样点上对应的亮度连续变化区间转换为单个特定数码的过程。
图像像素间的关系
邻域关系
邻接性
连通性
从一个像素到另一个像素途径所有像素都是邻接的的路称为通路(个人理解)
区域和边界
区域:在连通集的基础上,令R是图像中的像素子集,R若是连通集,则称R为一个区域
边界:区域中有一个或多个不在R中的邻点的像素的集合
像素之间的距离
欧式距离
城市街区距离(曼哈顿距离)
棋盘距离
三种距离中最短
图像灰度直方图
每个灰度值对应的像素数
直方图的性质
直方图的应用
1.用于判断图像量化是否恰当
2.用于确定图像二值化的阈值
三.holcon
一款机器视觉软件
下载HOLCON的编译环境HDevelop
具体步骤可参考这位up主
HDevelop
holcon的编程语言
算子:halcon算子是按照英文进行命名的,一般英文名就是代表的真实含义。算子结构为:功能类别_具体功能名称。比如read_image是读取图片的意思,read就是功能类别,image就是具体功能名称(可以理解为c++中被封装好的函数,算子内的参数可以理解为形参)
赋值
a:=1
选择语句
if (条件)
执行语句
elseif (条件)
执行语句
else
执行语句
endif
switch(条件)
case 常量表达式:
执行语句
break
case 常量表达式:
执行语句
break
case 常量表达式:
执行语句
break
default:
执行语句
endswitch
循环语句
for i:=起始值 to 结束值 by 步序
执行语句
endfor
while(条件)
执行语句
endwhile
repeat
执行语句
until(条件)
图形窗口
图形窗口主要显示图像,可以显示处理前的原始图像,也可以显示处理后的region等
算子窗口
算子窗口显示的是算子的重要数据,包含了所有的参数、各个变量的型态以及参数数值,如上图所示。
这里会显示参数的默认值以及可以选用的数值。在图形窗口中,只要键入部分字符串甚至开头的字母,即可显示所有符合名称的算子供选用
变量窗口
变量窗口显示了程序在执行时产生的各种变量,包括图像变量和控制变量,在变量上用鼠标双击,即可显示变量值
程序窗口
程序窗口用来显示一个HDevelop程序。它可以显示整个程序或是某个运算符。窗口左侧是一些控制程序执行的指示符号。HDevelop刚启动时,可以看到一个绿色箭头的程序计数器(Program Counter, PC)、一个插入符号,还可以设置一个断点(breaking point), 窗口右侧显示程序代码
软件图像采集
获取非实时图像
点击''打开新的Image Acquisition"
选择需要获取的文件
生成代码
这样就可以获取到图像
获取实时图像
点击''打开新的Image Acquisition"
检测接口,选择相机
连接,采集
生成代码
数据结构
image
region
XLD
handle
tuple
数组
* 创建一个空数组
array:=[]
* 给数组赋值,i表示数组下标,j表示值
array[i]:=j
array:=[array,j] * 追加值
四.图像预处理
感兴趣区域(ROI)
生成roi
方式一:代码
方式二:
选取截取区域的类型,如矩形,圆形
生成棋盘
具体代码
dev_open_window(0,0,400,400,'black',WindowHandle)
gen_image_const(Image,'byte',400,400)
for i:=0 to 400 by 80
for j:=0 to 400 by 80
gen_rectangle1(rectangle,i,j,i+40,j+40)
overpaint_region(Image,rectangle,255,'fill')
endfor
endfor
for i:=40 to 400 by 80
for j:=40 to 400 by 80
gen_rectangle1(rectangle,i,j,i+40,j+40)
overpaint_region(Image,rectangle,255,'fill')
endfor
endfor
write_image(Image,'png',255,'D:/Pictures/新建文件夹/qipan.png')
图像的变换与校正
等距变换(欧式变换)
(相似变换)图像的平移,旋转和缩放
仿射变换
投影变换(单应性变换)
应用:图像校正
视角变换
图像拼接
插值算法
自适应:根据插值的内容来改变(尖锐的边缘或者是平滑的纹理)
非自适应方法:对所有像素点都进行同样的处理
最近邻
双线性
双三次
图像增强
图像增强分类
空间域--点运算
灰度变换
线性灰度变换
分段线性灰度变换
非线性灰度变换
灰度变换算子
图像取反算子 invert_image(Image:ImageInvert: : ) g'=255-g
增强图像对比度算子
emphasize(lmage:lmageEmphasize :MaskWidth, MaskHeight, Factor :)
res:= round((orig -mean)* Factor)+ orig
缩放图像的灰度
scale_image(lmage :lmageScaled : Mult, Add :)
g:= g*Mult + Add
直方图修正
直方图均衡化
直方图规定化
空间域--领域运算
图像的平滑
图像噪声
噪声:存在于图像数据中的不必要的或多余的干扰信息
高斯噪声:整体服从正态分布
椒盐噪声:出现噪声的位置是随机的,出现的值只有两种,一种亮的,一种暗的
邻域平均法(均值滤波器)
适合祛除高斯噪声
滤波:用于去除或减少信号中的噪声,同时保留或增强所需的信号特性
是一种简单的空域处理方法,其基本原理是在图像中选择一个邻域,用邻域范围内的灰度平均值来代替邻域中心点像素的灰度值
中值滤波
适合祛除椒盐噪声
中值滤波是指对邻域内的像素灰度值进行排序,用其中值代替中心点像素灰度值的图像平滑方法
多图像平均法
多图像平均法是利用获取同一物景下的多幅图像的平均值来消除噪声
图像的锐化
图像的锐化就是增强图像的边缘或轮廓
一阶微分算子增强--梯度法
水平垂直差分法:
根据图像函数f(x,y)的梯度,推出边缘
罗伯特梯度法:
Sobel算子
特点:sobel算子获得的边界是比较粗略的边界,反映的边界信息比较少,但所反映的边界比较清晰
二阶微分算子增强--拉普拉斯算子(Laplacian)
像素点周围四个点的灰度值相加再减去自己值的四倍
特点:拉普拉斯算子获得的边界是比较细致的边界。反映的边界信息包括了许多的细节信息,但所反映的边界不是太清晰
频率域
一幅图像灰度均匀的总体平滑区域主要对应低频部分,而图像中的噪声、边缘、细节等则对应高频部分。
1.进行傅立叶变换
2.生成理想的低(高)通滤波模型
低:适当滤除图像变换域中的高频成分,保留低频成分
高:
3.在频域里卷积图像
4.进行快速傅立叶反变换
同态滤波增强
五.图像分割
阈值分割
阈值:一个指定的像素灰度值的范围
阈值分割三步:
1.确定阈值
2.将阈值与像素灰度值进行比较
3.把像素归类
全局阈值分割
手动阈值分割
直方图谷底法
threshold(Image:Region:MinGray,MaxGray:)
自动阈值分割
局部阈值分割
边缘检测
已学算子
Prewitt算子
Krisch算子
LoG算子
Canny算子
亚像素级别的边缘提取
区域分割
将相同属性的像素归为同一个区域
区域生长法
区域生长算子
read_image(image,'fabrik')
*对图像进行均值处理
median_image(image,imagemedian,'circle',2,'mirrored')
*使用regiongrowing算子寻找颜色相近的邻域
regiongrowing(imagemedian,regions,1,1,2,100)
*对图像进行区域分割,提取满足各个条件的各个独立区域
shape_trans(regions,centers,'inner_center')
connection(centers,singlecenters)
*计算出初步提取的区域中心点坐标
area_center(singlecenters,area,row,column)
*
regiongrowing_mean(imagemedian,regionsmean,row,column,25,100)
区域分裂合并法
分裂
合并
Hough变换
、
hough梯度法
分水岭算法
六.特征提取
区域形状特征
区域的面积和中心点
area_center
封闭区域(孔洞)的面积
area_holes
根据特征值进行特征提取
选择区域
创建区域
计算区域内接圆
计算区域外接矩形
基于灰度值的特征
区域的灰度特征值
灰度的平均值和偏差
区域的最大,最小灰度值
灰度区域的面积和中心
根据灰度特征值选择区域\
基于图像纹理的特征
纹理图像:具有重复性结构的图像
灰度共生矩阵
七.图像的形态学处理
数学形态学预备知识
集合与集合的关系
并集,交集,补集,差集
平移与反射
平移:将一个集合移动
反射:关于原点对称
二值图像的基本形态学运算
腐蚀
集合A被集合B腐蚀:B移动后B包含于A的所有B的中心点的集合
膨胀
集合A被集合B膨胀:B反射后,B移动后交A不是空集的B的中心的的集合
开、闭运算
结构元B对集合A的开运算表示为:
先腐蚀,后膨胀
去毛刺
结构元B对集合A的闭运算表示为:
先膨胀,后腐蚀
填空隙
击中击不中变化
A被B击中或击不中变换定义为:
算子
hit_or_miss
灰度图像的形态学运算
改变的是像素的灰度
灰度腐蚀
腐蚀运算是由结构元素确定的邻域块中选取图像值与结构元素值得差的最小值
灰度膨胀
膨胀运算是由结构元素确定的邻域块中选取图像值与结构元素值的和的最大值
灰度图像的开、闭运算
灰度开运算
先腐蚀后膨胀
消除暗背景下的较亮区域
灰度闭运算
先膨胀后腐蚀
消除亮背景下的较暗区域
灰度图像的顶帽和底帽运算
顶帽变换
原图像减去开运算,可以得到图像中灰度较亮二点区域,所以又称白顶帽变换
底帽变换
闭运算结果减去原图像,可以得到原图像灰度较暗的区域,所以又称黑底帽变换
二值图像的形态学
边界提取
将原图像进行腐蚀,然后用原图像减去生成后的图像,得到图像的边界
孔洞填充
孔洞:被前景连通域包围的背景区域
给定孔洞中一个点,从这个点开始在范围内膨胀,直至填充满整个边界包围的区域
fill_up
骨架
骨架:一个图像的骨骼部分
计算骨架的过程一般称为细化或者骨骼化
图像模板匹配
定义:在图像区域找出给定子图像匹配的小块区域
过程:学习(Learning) 匹配(Matching)
学习:创建模板
匹配:在目标图像中寻找与模板图像最相似的部位
基于像素灰度值的模板匹配
NCC算子
1.创建NCC匹配模板
creat_ncc_model(Template::NumLevels,AngleStart,AngleExtent,AngleStep,Metric:ModelID)
2.搜索NCC最佳匹配
find_ncc_model(Image::ModelID,AngleStart,AngleExtent,MinScore,NumMatches,MaxOverlap,SubPixel,NumLevels:Row,Column,Angle,Score)
基于特征的模板匹配
与基于灰度的模板匹配不同,基于特征的模板匹配是利用图像的特征点,精度高,计算量少