Robot Vision Segment

作者: gjx2003 | 来源:发表于2017-02-10 15:37 被阅读223次

    description: vision 总结,发于reasonw.github.io,简书同步


    视觉报告—分割篇

    图像中的显著属性变化通常反映了这个属性的重要性和影响

    常见的情况有:深度不连续,表面方向不连续,物质属性变化,场景照明变化

    优秀的分割算法可以大幅度减少数据量

    OpenCV

    经典分割方法

    基于边缘分割

    实际场景中图像边缘往往是各种类型的边缘及模糊化后的结果组合,且实际信号噪声较多。

    噪声和边缘都属于高频噪声,难用频带取舍。

    • 边界分割法
         点+线+边缘检测

      可以加一些图像增强或腐蚀膨胀等形态学处理,强化或弱化目标边界,去噪
    1_1.png
    一阶算子 介绍
    Roberts 2*2四邻域差分寻找边缘 无平滑,噪声较敏感 1_1_roberts.png
    Sobel/Prewitt 3*3邻域卷积梯度微分,处理垂直和水平边缘 处理灰度渐变低噪声,定位校准 1_1_sobel.png
    Log 先平滑,拉氏变换后求二阶积分再卷积 消除尺度小于σ的图像强度变化,计算量小,易丢失细节 1_1_log.png
    Canny 准高斯函数做平滑,带方向一阶微分算子定位导数最大值 检测弱边缘效果很好,运算较慢 1_1_canny.png

    检测完提取

    物体边界一般是线,不是单独的点。边界表示使图像表示更简介,方便高层次理解

    难点在于边界分叉缺损,不是闭合连通边界图,梯度大的点也不一定真是边缘点

    可以加一些开闭运算,形态学梯度,顶帽黑帽,颗粒分析,流域变换,骨架提取,击中击不中变换等形态学处理,强化或弱化目标边界,强化物体结构

    数学形态学是一门建立在严格数学理论基础上的学科。象方差,弦长分布,周长测量,颗粒统计等 统称为击中击不中变换

    数学形态学理论基础是击中击不中变换,开闭运算,布尔模型和纹理分析器

    方法 介绍
    简单连接 相邻点边缘强度差和边缘方向小于阈值时,可以连接。无则停止,多则取差最小的点
    启发式搜索 从多种可能路径中选优,评价函数打分
    曲线拟合 若边缘点很稀疏,可以用分段性或高阶样条曲线来拟合这些点,形成边界。拟合方法多为均方误差最小准则

    其他还有hough变换,图搜索,动态规划等

    阈值分割

    1_2.png

    阈值分割算法实际上就是设定阈值的矩阵二值化,所以这个输入的灰度矩阵可以变成以0:255为范围的任何其他矩阵

    比如速度矩阵,深度矩阵,明度矩阵等等以及其他具有统计特性的矩阵

    利用图像中要提取目标和背景在某一特性上的差异,选取合适阈值进行分割。

    • 单阈值分割方法(全局)
    • 多阈值分割方法(局部)
    • 基于像素值/区域性质/坐标位置的阈值分割方法
    • 根据分割方法所具有的特征或准则,可分为直方图峰谷法/最大类空间方差法/最大熵法/模糊集法/特征空间聚类法/基于过渡区的阈值选取法等
    • 直方图阈值的双峰法
    • 迭代法(最佳阀值分割迭代法 k-means)
    • 大律法(otsu阈值分割算法)
    • 类内方差最小方差法
    • 最小错误概率分类法
    • 基于熵的二值化方法
    • 局部自适应

    基于区域分割

    1_3.png

    区域生长法

    区域生长的一致性描述是区域生长法的基本准则,一般是灰度,也可以考虑颜色/纹理/形状等其他属性

    基于阈值的方法是基于单个点的特点。基于区域的方法考虑到相邻点的一致性。

    需要确定:

    • 种子像素,一般可以根据聚类中心作为种子中心,也可以设定一个阈值,在此阈值内的点为种子点
    • 生长方法和每次生长后这个区域的一致性准则,如灰度差小于阈值,简单的生长方法,区域的所有8邻域点。

    若该点加入后,该区域满足一致性准则,则加入。

    当两个区域满足一定准则时,合并两个区域。该准则可以考虑两个区域分别的均值和方差。

    如果没有预先确定的种子点,可采用一般步骤:

     1.用某种准则把图像分割成许多小区域

     2.定义合并相邻区域的准则,需要注意区域合并得到的结果受区域合并顺序影响

     3.按照合并准则合并所有相邻的区域,如果没有再能够合并的块后停止。

    不同的分割方法和合并准则适应不同情况。相邻区域特征值之间的差异是计算强度的一个尺度。
    强边界保留,弱边界消除,相邻区域合并。计算是一个迭代,每一步重新计算区域成员隶属关系,并消除弱边界。无弱边界消除时合并结束。
    计算开销较大,但综合利用的话对自然场景分割效果相对最好。

    生长准则:

    • 灰度差准则

      1.dd 扫描图像,找出无隶属的像素

      2.检查邻域像素,逐个比较,灰度差小于阈值即合并
      (对种子点依赖较大,可以求所有邻接区域平均灰度差,合并差小的邻接区域/
      还可直接用像素所在区域平均灰度值代替此像素灰度值进行比较。)

      3.以新合并的像素为中心,重复步骤2,直至区域不能进一步扩张

      4.返回步骤一,重复,至找不到无隶属像素,结束生长。(可以自己设定终止准则)
    • 灰度分布统计准则

      以灰度分布相似性座位上生长准则来决定区域的合并,步骤如下:

      1.把图像分为互不重叠的小区域

      2.比较邻接区域的累积灰度直方图很据灰度分布相似性进行区域合并

      3.设定终止准则,重复步骤2将各区域依次合并直至满足终止准则

      灰度分布相似性检测方法 | Kolmogorov-Smirnov {maxz(h1(z)-h2(z))} | Smoothed-Difference{Σz|h1(z)-h2(z)|}
    • 区域形状准则

      方法1:把图像分割成灰度固定的区域,设两相邻区域周长分别位p1p2,把两区域共同边界线两侧灰度差小于给定值的部分设为L,若L/min(p1,p2)>T1则合并两区域。

      方法2:把图像分割成灰度固定的区域,设两邻接区域共同边界长度位B,把两区域共同边界线两侧灰度差小于给定值部分的长度设为L,若L/B>T2则合并

    区域分裂

    原始图像    模糊滤波    分裂合并   分裂扩张

    1_3_split.png

    区域分裂与区域合并相反

    先假设整个图像是一个对象,不满足一致性准则,则分裂(一般是均分成4个子图像),重复,直至所有区域满足一致性准则。像正方形的四叉树分裂

    区域分裂+合并

    从中间层开始处理,按照一致性准则该分裂分裂该合并合并。起点是四叉树的某一层节点。

    • 边缘+区域 分割
      通过边缘限制,避免区域过分割,通过区域分割补充漏检边缘。

      如先进行边缘检测与连接,在比较相邻区域的特征(灰度均值,方差等),若相近则合并。

      对原始图像分别进行边缘检测和区域增长,获得边缘图和区域分段图后,再按一定准则融合,得到最终分割结果。
    • 连通域标记
      基于边缘的方法根据所得闭合边界,采用边界跟踪和内部填充的方法。

      基于区域的方法一般采用连通性分析方法,按照一定的顺序把连通的像素用相同的序号标注

    1.把所有像素点放到待处理点集合A中。

    2.如果A空则结束。否则从A中任意移出一点作为连通域a(用集合表示)的初始点
    3.在A中寻找所有与a连通的点,并移到a中,若没有找到,重复2,寻找下一个连通域。
    4.重复3,迭代寻找新的连通点。

    SaliencyCut

    1_4_saliency.png


    Global Contrast Based Salient Region Detection

    _南开程明明 download

    特殊工具分割

    • 小波
    • 马尔科夫随机场
    • 遗传算法
    • 神经网络/Kmeans/主动轮廓模型(能量函数)

    运动分割

    差分(时空灰度梯度) 光流(运动场)

    参考 :图像分割

    PCL

    因为维度的增加,是的分割成为三维图像对比二维图像的最大优势。使得最优分割成为可能

    Ransac算法

    随机采样一致,找平面,找线,找圆柱等 可以处理噪声较多的情况

    2_1.png

    使用方法:

    //创建一个模型参数对象,用于记录结果

    pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);

    //inliers表示误差能容忍的点 记录的是点云的序号

    pcl::PointIndices::Ptr inliers (new pcl::PointIndices);

    // 创建一个分割器

    pcl::SACSegmentation<pcl::PointXYZ> seg;

    // Optional

    seg.setOptimizeCoefficients (true);

    // Mandatory-设置目标几何形状

    seg.setModelType (pcl::SACMODEL_PLANE);

    //分割方法:随机采样法

    seg.setMethodType (pcl::SAC_RANSAC);

    //设置误差容忍范围

    seg.setDistanceThreshold (0.01);

    //输入点云

    seg.setInputCloud (cloud);

    //分割点云

    seg.segment (*inliers, *coefficients);

    2_1_youtube.png

    邻近信息

    • kdTree & OcTree

      搜索策略,建立相邻关系

    #include <pcl/point_cloud.h>

    #include <pcl/kdtree/kdtree_flann.h>

    //创建kdtree 结构

    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;

    //传入点云

    kdtree.setInputCloud (cloud);

    //设置输入点

    pcl::PointXYZ searchPoint;

    //k邻近搜索

    int K = 10;


    //设置两个容器,第一个放点的标号,第二个点到SearchPoint的距离

    std::vector<int> pointIdxNKNSearch(K);

    std::vector<float> pointNKNSquaredDistance(K);

    //进行搜索,注意,此函数有返回值>0为找到,<0则没找到

    kdtree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance)

    // 基于距离的搜索 //

    //两个未知大小的容器,作用同上

    std::vector<int> pointIdxRadiusSearch;

    std::vector<float> pointRadiusSquaredDistance;

    // 搜索半径

    float radius = 3;

    //搜索,效果同上

    kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance)

    • 欧氏距离

      分割,可以用半径做滤波,删除离群点

    //被分割出来的点云团(标号队列)

    std::vector<pcl::PointIndices> cluster_indices;

    //欧式分割器

    pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;

    ec.setClusterTolerance (0.02); // 2cm

    ec.setMinClusterSize (100);

    ec.setMaxClusterSize (25000);

    //搜索策略树
    ec.setSearchMethod (tree);

    ec.setInputCloud (cloud_filtered);

    ec.extract (cluster_indices);

    • 区域增长
      可以自定义准则,如法线,曲率,颜色,距离等等
    2_2_region_chair.png 2_2_region_corridor.png

    //一个点云团队列,用于存放聚类结果

    std::vector <pcl::PointIndices> clusters;

    //区域生长分割器

    pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;

    //输入分割目标

    reg.setSearchMethod (tree);

    reg.setNumberOfNeighbours (30);

    reg.setInputCloud (cloud);

    //reg.setIndices (indices);

    reg.setInputNormals (normals);

    //设置限制条件及先验知识

    reg.setMinClusterSize (50);

    reg.setMaxClusterSize (1000000);

    reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);

    reg.setCurvatureThreshold (1.0);

    reg.extract (clusters);

    minCut算法

    图论

    2_3.png

    超体聚类

    类似于超像素的概念
    超体聚类八叉树划分

    2_4.png

    不同晶体间的邻接关系

    2_4_super_tree.png

    基于凹凸性

    根据超体聚类之后不同的晶体计算凹凸关系,进行分割

    2_5.png


    只允许区域跨越凸边增长
    2_5_convex.png


    完美效果...
    2_5_convex_perfect.png

    基于形态学

    2_6.png

    相关文章

      网友评论

      本文标题:Robot Vision Segment

      本文链接:https://www.haomeiwen.com/subject/oowgittx.html