description: vision 总结,发于reasonw.github.io,简书同步
视觉报告—分割篇
图像中的显著属性变化通常反映了这个属性的重要性和影响
常见的情况有:深度不连续,表面方向不连续,物质属性变化,场景照明变化
优秀的分割算法可以大幅度减少数据量
OpenCV
经典分割方法
基于边缘分割
实际场景中图像边缘往往是各种类型的边缘及模糊化后的结果组合,且实际信号噪声较多。
噪声和边缘都属于高频噪声,难用频带取舍。
- 边界分割法
点+线+边缘检测
可以加一些图像增强或腐蚀膨胀等形态学处理,强化或弱化目标边界,去噪
一阶算子 | 介绍 | ||
---|---|---|---|
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算法
随机采样一致,找平面,找线,找圆柱等 可以处理噪声较多的情况
使用方法:
//创建一个模型参数对象,用于记录结果
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);
邻近信息
- 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);
- 区域增长
可以自定义准则,如法线,曲率,颜色,距离等等
//一个点云团队列,用于存放聚类结果
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_super_tree.png基于凹凸性
根据超体聚类之后不同的晶体计算凹凸关系,进行分割
2_5.png只允许区域跨越凸边增长
2_5_convex.png
完美效果...
2_5_convex_perfect.png
网友评论