[数字图像处理原理与实践matlab]——图像分割

图像分割

  • 豪格变换(Hough) :图像像素信息按坐标映射到参数空间的方法。(圆、直线)

  • 核心思想:

    • 确定要识别的曲线解析集,即在一定精度上枚举带参数的解析式中所有参数的可能取值。
    • 为解析式集中的每个元素构造计数器
    • 遍历图像中的的所有有效像素,并将每个有效像素的坐标依次代入解析式集中的每个元素,若解析式成立,则将该解析式对应的计数器加1
    • 设定阈值t,遂于计数器值大于t的解析式,可认为其对应的曲线被识别
  • 算法:

    • 利用hough()函数执行Hough变换,得到Hough矩阵。
    • 利用houghpeaks()函数在Hough矩阵中寻找到峰值点。
    • 利用houghlines()函数在之前两步结果的基础上得到原二值图像中的直线信息。
  • 轮廓跟踪

    • 区域表示:

      • 轮廓表示法->链码表:链码;链码寻址
      • 线段表示法->线段表
      • 链码表转化成线段表:
        • 顺序检测链码表,根据链码表提取轮廓中的左端点,右端点喝奇异点,并存入线段中。其中奇异点提取两次。
        • 将线段表中的所有点按照纵坐标排序
        • 将纵坐标相同的所有点按照横坐标排序
      • 区域的形状参数:F=L^2/(4piS) L:周长 S:面积
    • 单区域追踪

      • 轮廓方向: 正方向:沿着此方向前进时,区域的内部总是处于轮廓的右边。

      • 搜素下一边界点过程描述:

        • 获得上一边界点到当前边界点的链码
        • 将链码加4反向再减1,并以此链码为起点对邻域进行搜索
        • 获得下一边界点并返回下一边界点相对当前点的链码
      • 单区域的轮廓跟踪的过程

        • 以当前轮廓点为中心在领域内搜索下一轮廓点
        • 获得下一轮廓点的链码并保存在链码表中
        • 若下一轮廓点为起始点,则轮廓跟踪完成;否则,将当前点移动到下一轮廓点并重复步骤1,2
      • 多区域跟踪

        • 搜素哦起始点并确定起始方向链码
        • 单区域轮廓跟踪
        • 绘制区域轮廓
        • 区域填充
      • 编码实现

        • B= bwtraceboundary( BW, P, fstep,conn, N, dir)

          (BW 为二值图像)

      • 区域填充

        • 以一组种子点为开始,将与种子性质相似的像素附加到生长区域的每个种子上。
        • 图像的区域即相互连通的颜色相近的像素集合,区域的填充就是将区域内的像素设定为指定的颜色。
        • 种子算法:填充区域的过程中不关心区域的形状,二十通过获得区域内部的任意一个像素,并以这个像素为种子,不断扩大填充的面积,最终覆盖整个填充区域。
        • 关键:①连通像素的搜素②边界判断
          • 连通像素的判断:
            • 区域生长技术:单连接区域生长
          • 容差:颜色相近的两个像素间的两个像素间的最大颜色误差
        • 递归法:从一点出发,按照方向编码用递归的方式遍历填充区域,每到达一个像素就按照方向编码依次判断它相邻的每个像素是否该被填充。
        • 漫水法:
          • 选取一个起始种子点,获得基准颜色,将种子点压入堆栈
          • 从堆栈中取得一个像素,对其进行填充,然后搜素哦四邻域或者八邻域,如果有需要填充的像素,就压入栈中。
          • 重复步骤二,直至堆栈为空。
        • 行扫描法
          • 选取一个起始种子点,获得基准颜色,将种子点压入堆栈
          • 从堆栈中取出一个像素,依次对该像素的左右连通像素进行填充,并在填充过程中判断每个填充位置上下两行中相邻像素是否需要被填充,将需要填充的相邻像素压入堆栈
          • 对堆栈中的像素进行检查,去除已被填充的像素
          • 重复步骤二,三,直至堆栈为空
        • 混合连接区域生长法:两个节点的相似性判断依赖与它们各自邻域是否满足某种条件。
        • 中心连接区域生长法:物体中同一区域的各像素的灰度级不会发生较大差异。从满足相似性的准则的点开始,在各个方向上进行区域生长。假设P是已经接受的一小块区域,则检测它的全部邻接点像素,若该点满足预置的相似性准则,则将其加入区域P中,变成P’,对于P’重复以上过程,直至达到终止条件为止。
        • 编程实现:BW2 = imfill(BW)//填充空洞
        • J = roifill(I,c,r)//实现对指定的感兴趣区域进行填充

区域分裂与合并

  • 从图像金字塔或者四叉树数据结构的任一中间层开始,根据给定的均匀性检验准则进行分裂或者合并操作,并以此来逐步改善区域划分的性能,直到最后将图像分成数量最少的均匀区域为止。

  • 算法描述:

    • 确定均匀性测试准则P, 将原始图像构造成四叉树数据结构
    • 将图像四叉树结构中的某一中间层作为初始的区域进行划分。对于任何区域Ai,如果P(Ai)=FALSE,则将每个区域都拆分为成4个相连的象限区域。如果任意1/4子区域Bi也满足P(Bi)=FALSE,那么就再将该子区一分为四。
    • 对于任意两个相邻的区域满足P(A1UA2)=TURE,则将他们合并成一个区域。
    • 重复上述操作,当无法再进行分裂与合并时停止操作
  • 均方误差最小测试准则:定义某个区域上的方差,方差最小即为ture

  • 编程相关:

    • 四叉树分解: S = qtdecomp(I, threshold, [mindim maxdim])

      I:灰度图像,threshold:阈值,适用于正方形图像

    • 获得四叉树分解后所有指定大小的子块像素及位置信息:

      [vals, r, c] = qtgetblk(I, S, dim)

      I:灰度图像,dim指定子块的大小

    • 将四叉树分解所得到的子块中符合条件的部分全部替换成指定的子块:J = qtsetblk(I, S, dim, vals)

水域分割(分水岭算法)

  • 水域合并规则:
    • 如果新的水域与若干浅水域相连,则将这些浅水域合并到新的水域
    • 如果新的水域与若干小水域相连,则将这些小水域合并成新的水域
    • 如果新的水域与若干深水域相邻,则选择平均深度最浅的一个进行合并

你可能感兴趣的:(数字图像处理原理与实践)