免费发布信息
机器视觉重点整理
  • 地址:辽宁 14.156.31.*
    • Q Q:QQ在线交谈
    • 微信号:
    • 联系人:机器视觉设备
    • 电话: 点击查看完整号码
      • 东莞机械网提醒您:请您在接受平台商家提供的服务前,注意核对商家的身份并提前确认商家提供的产品/服务是否符合相关法律规定。谨防上当受骗!
  • 信息详情
本文为笔者大二时期机器视觉课程的重点内容归纳,如有纰漏请随时联系笔者。

数字图像的概念与性质
距离
距离种类
欧氏距离:[公式]
城区距离:[公式]
棋盘距离:[公式]
距离变换
给出图像中每个像素与某个图像子集的距离,算法如下:

从上到下,从左至右遍历,[公式]
从下到上,从右到左遍历,[公式]
import numpy as np
def distanceTransform(img):
    # 默认传入参数为二值图,子集为0,其余为无穷大(255)
    result = img.copy()
    rows, cols = result.shape
    AL = np.array([[-1, 0], [-1, -1], [0, -1], [1, -1]])
    BR = np.array([[1, 0], [1, 1], [0, 1], [-1, 1]])
    for col in range(cols):
        for row in range(rows):
            for next in AL:
                [next_row, next_col] = [row, col] + next
                if 0 <= next_row < rows and 0 <= next_col < cols:
                    if result[next_row, next_col]+abs(row-next_row)+abs(col-next_col) < result[row, col]:
                        result[row, col] = result[next_row, next_col]+abs(row-next_row)+abs(col-next_col)
    for col in range(cols-1, -1, -1):
        for row in range(rows-1, -1, -1):
            for next in BR:
                [next_row, next_col] = [row, col] + next
                if 0 <= next_row < rows and 0 <= next_col < cols:
                    if result[next_row, next_col]+abs(row-next_row)+abs(col-next_col) < result[row, col]:
                        result[row, col] = result[next_row, next_col]+abs(row-next_row)+abs(col-next_col)
    return result
边缘与边界
边缘:像素与其直接邻接的局部性质,是图像上亮度的不连续点,是矢量。方向与梯度垂直,大小与梯度相等。
边界是与区域有关的全局概念
噪声
加性噪声:噪声与图像信号无关
乘性噪声:噪声幅值与信号本身幅值有关
卷积
卷积定义:
[公式]

若系统响应可以表示成卷积的形式,则该系统是一个线性移不变系统;
任意线性移不变系统可以表示成卷积形式
离散卷积:
[公式]

其中[公式]尺寸是[公式],[公式]尺寸是[公式]
卷积后尺寸为高为[公式],宽为[公式]

图像预处理
像素亮度变换
亮度校正:与像素位置相关
灰度级变换:与像素位置无关,将原来在范围[公式]内的亮度p变换为[公式]内的亮度[公式]。
典型灰度级变换方法:

底片变换
分段增强
图像二值化
直方图均衡化:创建一副在整个亮度范围内有相同亮度分布的图像,增强靠近直方图极大值附近的亮度对比度,减小了极小值附近的对比度。
[公式]

在实际应用中[公式]一般固定为[公式],则

[公式]

def hist_equal(img):
    rows, cols = img.shape
    S = rows * cols * 1.0
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    cum_hist = np.cumsum(hist)
    T = np.zeros(256)
    out = np.zeros_like(img)
    for i in range(256):
        T[i] = np.round(255.0/S * cum_hist[i])
    for row in range(rows):
        for col in range(cols):
            out[row, col] = T[img[row, col]]
    out = cv2.convertScaleAbs(out)
    return out
几何变换
图像坐标变换
双线性变换(需要四个对应点对)
仿射变换(需要三个对应点对)
亮度插值
确定对应于输出图像离散栅格点在输入图像中点,对输入图像进行亮度插值

利用插值核对原图像进行卷积运算
最近邻插值:[公式]
亮度插值:考虑四个相邻点,假设亮度线性。减轻最近邻插值中出现的阶梯状直边界
双三次插值:考虑16个相邻点,解决了阶梯状边缘问题和模糊问题,较好地保持了图像细节
局部预处理
线性滤波
均值滤波:多次采集相同静态景物获得平均图像,噪声均值为0,标准差为[公式]。如果就一张,则局部邻域平均滤波。
高斯滤波:基于高斯函数形成卷积核,便于去除服从正态分布的噪声
非线性滤波
仅使用邻域中与被处理像素有类似性质的点进行平滑

设定非法数据范围[公式],只有在该范围内的像素值会被有效邻域的平均替代。掩膜为:
[公式]

根据反梯度的平均
[公式]

其中如果[公式]则[公式];[公式]为掩膜中心
加权系数:

[公式]

区域像素比边缘像素权重更大

旋转掩膜平均

旋转掩膜

计算该像素点在不同掩膜[公式]中的方差:

[公式]

选择方差[公式]最小的掩膜,其均值即为该像素点最终结果

中值滤波:用像素邻域灰度值的中值代替该像素的灰度值,便于去除脉冲噪声、椒盐噪声
确定掩膜中心和掩膜大小
将掩膜内像素按亮度值大小排序
取中值,若为偶数则取中间两个的均值


边缘检测
设计平滑滤波器[公式],计算[公式]
检测[公式]局部最大值或者[公式]过零点
平滑滤波器特点:
[公式]
h(x)为偶函数
[公式],保证滤波后不改变原信号的均值
一阶二阶可微


常见算子
Robert
[公式]

Prewitt
[公式]

Sobel
[公式]

Laplacian
[公式]

  def Robert_detection(img, threshold=-1):
    kernel1 = np.array([[-1, 0], [0, 1]])
    kernel2 = np.array([[0, -1], [1, 0]])
    img1 = cv2.filter2D(img, cv2.CV_32F, kernel1)   # 获取-45°方向的偏导
    img2 = cv2.filter2D(img, cv2.CV_32F, kernel2)   # 获取-135°方向的偏导
    mag = cv2.magnitude(img1, img2)
    mag = cv2.convertScaleAbs(mag)
    if threshold == -1:                             # 如果没有给定阈值则通过Otsu二值化
        _, mag = cv2.threshold(mag, 0, 255, cv2.THRESH_OTSU)
    else:
        mag[mag >= threshold] = 255
        mag[mag < threshold] = 0
    return mag


def Sobel_detection(img, threshold=-1):
    dx = cv2.Sobel(img, cv2.CV_32F, 1, 0)           # 获取水平方向的偏导
    dy = cv2.Sobel(img, cv2.CV_32F, 0, 1)           # 获取竖直方向的偏导
    mag = cv2.magnitude(dx, dy)
    mag = cv2.convertScaleAbs(mag)
    if threshold == -1:
        _, mag = cv2.threshold(mag, 0, 255, cv2.THRESH_OTSU)
    else:
        mag[mag >= threshold] = 255
        mag[mag < threshold] = 0
    return mag


def Prewitt_detection(img, threshold=-1):
    kernel1 = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])
    kernel2 = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
    dx = cv2.filter2D(img, cv2.CV_32F, kernel2)
    dy = cv2.filter2D(img, cv2.CV_32F, kernel1)
    mag = cv2.magnitude(dx, dy)
    mag = cv2.convertScaleAbs(mag)
    if threshold == -1:
        _, mag = cv2.threshold(mag, 0, 255, cv2.THRESH_OTSU)
    else:
        mag[mag >= threshold] = 255
        mag[mag < threshold] = 0
    return mag


def Laplacian_detection(img, threshold=-1):
    out = cv2.Laplacian(img, cv2.CV_32F, ksize=3)
    out = cv2.convertScaleAbs(out)
    if threshold == -1:
        _, out = cv2.threshold(out, 0, 255, cv2.THRESH_OTSU)
    else:
        out[out >= threshold] = 255
        out[out < threshold] = 0
    return out
[公式]越大,图像分辨率越低
Canny边缘检测
与二维高斯函数做卷积,消除噪声
计算每个像素的梯度大小和方向
根据梯度方向,作非极大值抑制获取边缘位置
3.1. 遍历非0梯度的像素,根据梯度方向找到两个邻接像素
3.2. 若存在一个邻接像素梯度幅值大于该像素,则将该像素置零
注:在实际运用中邻接像素的幅值通过线性插值获得
滞后阈值化处理/双阈值法
4.1. 设置高低阈值
4.2. 超过高阈值的设为边缘,弱于低阈值的舍弃
4.3. 遍历处于高低阈值区间内的像素,若该像素与边缘邻接则标记为边缘
多尺度特征综合
标记最小尺度的边缘
高斯卷积后估计大尺度检测边缘位置(大尺度合成边缘响应)
大尺度滤波器检测(大尺度实际边缘响应)
实际边缘响应显著强于合成边缘响应,则接受此边缘点


图像复原
图像增强:使图像具有更好的视觉效果
图像复原:利用图像降质过程的先验知识建立降质模型,是降质的逆过程
逆滤波:退化函数已知,通过复原滤波器消除退化。适用于没有被噪声污染的情况
[公式]

H为退化函数,n为加性噪声,根据线性移不变性质可化为卷积形式(2),再进行傅里叶变换(3)

维纳滤波:寻找使均方误差最小的估计[公式]
图像分割
阈值化
p率阈值化:基于直方图选择阈值[公式],使得[公式]的像素灰度值比[公式]小
模式方法:寻找直方图两个局部极大值,取它们之间的极小值为阈值
最优阈值化:
设定初始阈值[公式]
计算灰度值小于[公式]的像素集合的平均值[公式],灰度值大于[公式]的像素集合的平均值[公式]
新阈值[公式]
重复步骤2、3直到阈值变化足够小


OTSU阈值检测:
将直方图除以像素总数,进行归一化,得到像素概率分布直方图[公式]
划分背景[公式](灰度值小于等于[公式]的像素)与前景[公式](灰度值大于[公式]的像素)
背景、前景概率和均值计算:
[公式]

计算类间方差:
[公式]

最优阈值[公式]


def Otsu(img):
    # 获取直方图并归一化
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])[:, 0]
    hist /= np.sum(hist)
    # 取直方图中非零索引
    nonzero_index = np.nonzero(hist)[0]
    # min_index和max_index代表灰度级的最低值与最高值
    [min_index, max_index] = nonzero_index[[0, -1]]
    # sigma存储以各非零索引的灰度级作为阈值的类间方差
    sigma = np.zeros_like(nonzero_index)
    for i in range(len(nonzero_index)):
        t = nonzero_index[i]
        # 根据阈值t将直方图划分为两部分
        before = hist[min_index:t + 1]
        after = hist[t + 1:max_index + 1]
        # 计算两部分的概率
        P_before = np.sum(before)
        P_after = np.sum(after)
        # 计算三种均值
        miu_before = np.sum(np.arange(min_index, t + 1) * before / P_before)
        miu_after = np.sum(np.arange(t + 1, max_index + 1) * after / P_after)
        miu = np.sum(np.arange(min_index, max_index + 1) * hist[min_index: max_index + 1])
        # 计算此时的类间方差
        sigma[i] = P_before * (miu_before - miu) ** 2 + P_after * (miu_after - miu) ** 2
    # 取sigma最大的索引就可以读取出对应阈值
    threshold = nonzero_index[np.argmax(sigma)]
    Binary = img.copy()
    Binary[img >= threshold] = 255
    Binary[img < threshold] = 0
    return Binary
边界跟踪
内边界跟踪
从左上方开始搜索,设定[公式]
按逆时针方向搜索[公式]邻域,初始方向为:
[公式]

简单来说对于4邻接跟踪,更新后的[公式]为之前的[公式](顺时针转45°);对于8邻接跟踪,更新后的[公式]为之前的[公式]顺时针转至第一个奇数位例如:4邻接[公式],更新后的[公式];8邻接[公式],更新后的[公式]
3. 当前像素等于第二个像素,且上一个像素等于第一个像素时停止;否则重复步骤2

def InnerTrack(img):
    # 生成对应边界矩阵
    output = np.zeros_like(img)
    # 8×2的矩阵表示各方向下的移动情况
    steps = np.array([[0, 1], [-1, 1], [-1, 0], [-1, -1],
                     [0, -1], [1, -1], [1, 0], [1, 1]])
    rows, cols = img.shape
    for row in range(rows):
        for col in range(cols):
            # 当原图中该点亮度不为0(即白色背景),或边界图像为255(即该点已经处理过),或以该点为中心的3×3边界矩阵有大于0的(该点附近有处理过的边界)
            # 或以该点为中心的3×3原图矩阵均为0(即目标图像中心区域)——这四种情况发生时都要略过
            if img[row, col] != 0 or output[row, col] == 255 or np.sum(output[row-1:row+2, col-1:col+2]) > 0 or np.sum(img[row-1:row+2, col-1:col+2]) == 0:
                continue
            next_pos = [row, col]
            next_dir = 7
            while next_pos:
                next_pos, next_dir = Track(img, output, next_pos, next_dir, steps)
    return output


def Track(img, output, pos, dir, steps):
    # 设定初始方位
    dir = (dir + 6) % 8 if dir % 2 else (dir + 7) % 8
    # 将初始点标记
    output[pos[0], pos[1]] = 255
    # 遍历各方向
    for i in range(8):
        next_dir = (dir + i) % 8
        # 确定下一步的方位
        [row, col] = pos + steps[next_dir]
        # 只有当下一步没越界并且原图中该点是黑色时继续处理
        if 0 <= row < img.shape[0] and 0 <= col < img.shape[1] and img[row, col] == 0:
            # 如果这时边界矩阵仍是0,表示没被处理过,可以继续处理
            if output[row, col] == 0:
                # 返回下一步的位置和方向
                return [row, col], next_dir
            # 如果处理过直接结束,内边界跟踪结束
            return None, None
    return None, None
外边界跟踪
进行4邻接跟踪
搜索过程中测试过的非内边界像素组成外边界
扩展边界



扩展边界


边界形状与内边界完全相同,像素位置向下和向右平移了半个像素
对于内边界而言:扩展边界为内边界的上、左像素;右像素的右方、下方像素;下像素的下方、右方像素
对于外边界而言:扩展边界为上像素向右下移动1个像素;左像素向右移动1个像素;右像素向下移动1个像素
查找表法追踪边界:按照12种情况的表进行追踪

查找表


基于区域分割
分裂与归并:
金字塔数据结构种,任意区域不符合一致性测试,则分裂成四个子区域;如果具有相同父结点的四个区域具有一致性,则归并
执行步骤1至无法分裂与归并
归并任意两个具有一致性的邻接区域(可没有相同父结点)
如果必须删除小尺寸,则归并小区域和最相似的邻接区域


一致性规则可自定义,例如天鹅星座环的X射线频段图像中,需要分割出稀疏环(标准差较大且灰度值介于背景和中心区域之间)。此时可定义为一致性为[公式].
分水岭分割
对于梯度幅值图像而言,盆地表示原图像平滑的地方。给定幅值初始值的情况下,每个幅值小于初始值的盆地表示一个区域。按照幅值大小从初始值往上遍历,对于新像素而言它将分给离它邻接的盆地。如果它和两个盆地都邻接,则为分水岭。如果它没有邻接盆地,则为新盆地。

数学形态学
二值图像形态学
反射:[公式]
平移:[公式]
膨胀:[公式]
腐蚀:[公式]
对偶性:
[公式]

对于原点对称结构元来说,对[公式]背景膨胀的补集等于对[公式]的腐蚀

击中击不中变换:[公式],其中[公式]为与目标匹配的模板,[公式]为与目标背景匹配的模板。用于在A中寻找与模板B匹配的元素
开运算:[公式],平滑物体轮廓,断开狭颈,去掉细小突出
闭运算:[公式],平滑物体轮廓,弥合较窄间断和细长沟壑,消除小孔,填补轮廓线中的断裂
膨胀运算的例子:
结构元反射后,根据**[公式]中元素**坐标对[公式]平移,若平移后的[公式]与[公式]仍有交集则该元素属于膨胀结果集合


膨胀

如上图所示,[公式]的原点在左下角。[公式]坐标的变换结果[公式]与[公式]不相交,所以[公式]。
而对于[公式]坐标的变换结果[公式]与[公式]相交,则[公式]。

特征检测
角点检测
角点是在邻域内的各个方向上灰度变化值足够高的点
角点是图像边缘曲线上曲率极大值的点
角点检测的准则:
角点检测的正确性:不检测出错的角点
角点定位的准确性:位置不能有过大的偏差
角点检测算法稳定性与效率:受噪音影响小


Moravec角点检测:任意方向移动窗口,若窗口内灰度值都有剧烈变化则窗口中心为角点
变化值:[公式],[公式]

移动方向


角点响应函数[公式]
将响应函数中低于阈值的值设为0
非极大值抑制:遍历角点响应函数,若角点响应在窗口内不是最大则置0
选择非零点作为角点检测结果
Harris角点检测:使用高斯函数作为窗口
[公式]

自相关矩阵M的响应函数[公式]

特征值关系与响应函数


SIFT
检测尺度空间的极值点
精确定位特征点(Keypoint)
去除不稳定极值点
去除边缘响应过大的极值点:计算差分图像D的Hessian矩阵
[公式]
满足[公式]

设定特征点的方向参数
在高斯尺度空间计算像素梯度
[公式]

建立梯度方向直方图,横轴为角度,范围0~360°
直方图峰值对应的方向为主方向
能量超过主峰值80%的次峰对应的方向为辅方向


生成特征点的描述子(128维向量)
将坐标轴方向旋转至特征点的方向
对每个特征点为中心取窗口,高斯加权增强特征点附近的像素的贡献
将窗口分为[公式]的小块,每块计算8个方向的梯度方向直方图
每个特征点用[公式]维向量描述


SURF
特征点描述子为64维

特征点匹配
特征点的数据结构包含:
位置坐标
尺度
方向
特征向量


根据特征向量欧氏距离找出最近邻和次近邻,如果最近邻比次近邻小于阈值,则匹配成功
HOG
通过局部梯度、边缘方向分布描述局部目标,而不需要知道对应的梯度、边缘的位置
图像归一化
灰度化
归一化:gamma校正降低图像局部的阴影和光照变化所造成的影响


计算图像梯度
计算无符号的梯度方向
[公式]

在细胞单元构建梯度直方图
将细胞单元内每个像素按照方向划分成9块
按照方向将幅值划分到不同的块:比如165度方向上的幅值为85,则
[公式]

块内梯度直方图对比度归一化
按照二范数进行归一化


计算HOG特征描述子
[公式]


Hough变换
[公式]
[公式]

[公式]
[公式]

[公式]
[公式]

设定参数空间为[公式]个累加单元,设置累加器矩阵Q并置零
对于XY平面上的点[公式],令[公式]等于[公式]轴上所有允许的细分值,计算对应的[公式]。(根据一个点在参数空间画出一条正弦曲线)
将[公式]四舍五入成最接近的细分值
在Q中找出对应单元加1
重复2-4步,最终Q值最大的单元对应的[公式]即为直线方程参数
直线检测的精度取决于两个参数细分值的大小
如果参数空间细分过粗,则参数的凝聚效果较差,找不出直线对应的准确参数
细分值也不能过小,会增大算法第2步的计算量
检测方法 优点 缺点
Moravec角点 - 二值窗口函数,角点响应函数不够光滑
四个方向上计算,角点响应函数在多处都有响应只考虑E的最小值,对边缘也有很强的响应
Harris角点 计算简单
提取的点均匀且合理算子对图像旋转、亮度变化、噪声影响和视点变换不敏感 对尺度敏感
角点精度是像素级需要设计角点匹配算法
SIFT匹配 对旋转、尺度缩放、亮度变化保持不变性
对视角变化、仿射变换、噪声保持一定的稳定性信息量丰富,适用于匹配少数物体也能产生大量SIFT特征 -
HOG 表示梯度/边缘的结构特征,可以描述局部的形状信息
位置和方向的量化,一定程度上可以抑制平移和旋转的影响局部区域归一化直方图,可以部分抵消光照变化带来的影响分块分单元的处理方法,使得图像局部像素点之间的关系可以很好得到的表征 描述子生成过程冗长,导致速度慢,实时性差
很难处理遮挡问题由于梯度的性质,HOG对噪点相当敏感
立体视觉
立体视觉:由多幅图像获取物体的三维几何信息
基本步骤:
摄像机标定
多幅图像中建立对应点对
重构场景中的三维坐标


摄像机标定
姿态描述:在物体上固定一个坐标系{B},给出此坐标系相对于参考坐标系{A}的表达
位姿描述:在三维空间中表示物体的位置和姿态
过渡坐标系:将坐标变换分解为旋转、平移;过度坐标系的姿态和A相同,原点和B重合
[公式]

旋转矩阵
绕x轴顺时针旋转[公式]:
[公式]

绕y轴顺时针旋转[公式]:
[公式]

绕z轴顺时针旋转[公式]:
[公式]

齐次坐标变换:[公式]
齐次变换矩阵
[公式]

线性摄像机成像:世界坐标系-相机坐标系-物理单位表示的图像坐标系-像素单位表示的图像坐标系
摄像机外参数:6个独立外参
摄像机内参数:
u/v轴互相垂直:4个独立内参
u/v轴不垂直:5个独立内参




单透视摄像机成像:欧式世界坐标系-欧式相机坐标系-欧式图像坐标系-图像仿射坐标系
透视投影矩阵M有11个自由参数,求解M需要6个对应点对
参数模型的最优化估计
最大似然概率估计
线性估计
叉积矩阵
鲁棒估计




畸变与失真
径向失真
光线在远离透镜中心的地方比靠近中心的地方更弯曲
对于径向失真,摄像机中心的畸变为零,随着向边缘移动,畸变越来越严重


切向失真
由于透镜制造上的缺陷,使透镜本身与成像平面不平行


径向畸变只会导致径向失真
离心畸变、薄透镜畸变会导致径向、切向失真


直接线性变换DLT标注法:
根据n个点对确定2n个方程


张正友平面标定法
将世界坐标系置于靶标平面,原点设在靶标的一角。其中[公式]方向沿靶标平面,[公式]方向垂直于靶标平面。
优点:
靶标平面上的点的世界坐标系坐标便于确定
靶标平面上的点的Z方向坐标恒为0,三维坐标只与[公式]有关,可以简化为二维坐标


步骤:
不考虑畸变,标定摄像机参数,得到参数的线性初值
利用线性初值,进行非线性标定,得到畸变参数
重复1和2,直至参数收敛


单应性矩阵给出从一个平面到另一个平面的映射,它包括摄像机内外参数矩阵
[公式]

具体解法
保持相机位置不变,将标定板置于不同位置采集m幅图像,每个图像n个角点
遍历每幅图像,求解单应性矩阵初值(2n个方程,9个未知数);再进行非线性优化,获取单应性矩阵
综合m幅图像的单应性矩阵,求解方程vb=0(2m个方程,6个未知数),将中间矩阵B分解,获取内参数矩阵(5个参数)
由H和[公式]计算每幅图像的R和P
综合m幅图像中n个角点求解Ak=B(2mn个方程,2个未知数),得到畸变系数[公式]
参数最优化:通过非线性最小二乘法优化内参数矩阵(5个参数),R和P(6m个参数),[公式]


对极几何
基线:两个相机光心连线
极面:观察点P与两相机光心构成的平面
极线:图像[公式]上对应于图像[公式]中[公式]点的极线——极面与[公式]的交线/[公式]在[公式]上的投影
对极约束:对应于图像[公式]上的点[公式]在图像[公式]上的对应点一定落在图像[公式]的极线上
作用:将[公式],[公式]对应点的搜索空间的维度由2维降为1维

对极约束


极点:所有极线交汇的那一点,也是[公式]连线与图像的交点,也是光心到另一图像的投影点
极线方程:
[公式]

若给定[公式]则公式为关于[公式]的线性方程,即图像[公式]上的极线方程;若给定[公式]则同理。
其中对于三维向量[公式]

[公式]

且满足[公式]

基础矩阵:
[公式]

F由相机参数矩阵确定,若对应点已知,则F包含了从一对图像中可以恢复出的所有信息
联系我时,请说是在东莞机械网看到的,谢谢!

  • 您可能对以下机械设备信息感兴趣
查看更多
    小贴士:本页信息由用户及第三方发布,真实性、合法性由发布人负责,请仔细甄别。
13435619118