• 数字图像处理(分割)


    目录

    1  介绍

    2  点、线、边缘检测

    2.1  检测点

    2.2  检测线

    2.3  检测边缘

    2.3.1  Sobel算子

    2.3.2  Canny算子

    3  Hough变换

    4  阈值处理

    4.1  固定阈值

    4.2  大律法(OTSU)


    1  介绍

    分割将一副图像细分为其组成区域或对象,细分的程度取决于特定的问题,即当分割出想要的区域时就应该及时停止分割。


    2  点、线、边缘检测

    2.1  检测点

    可以使用如下掩膜进行对图像进行卷积运算,并寻找最大的那些响应,即为图像中的点。

    -1-1-1
    -18-1
    -1-1-1


    2.2  检测线

    与点同理,可对掩膜处理后的输出进行阈值处理,即可得到线,不过直线具有方向,因此通常需要四种掩膜,来分别检测四个方向(分别为水平,45°,垂直,-45°)。

    -1-1-1-1-12-12-12-1-1
    222-12-1-12-1-12-1
    -1-1-12-1-1-12-1-1-12


    2.3  检测边缘

    2.3.1  Sobel算子

    • 计算梯度:使用一个检测水平边缘的模板Sobel_x = \begin{pmatrix} -1 & -2 & -1\\ 0& 0 &0 \\ 1& 2& 1 \end{pmatrix}和一个检测垂直边缘的模板Sobel_y = \begin{pmatrix} -1 & 0 &1 \\ -2 &0 &2 \\ -1 &0 &1 \end{pmatrix}对图像进行卷积运算,得到x和y方向上的梯度,再由这两个梯度计算得到梯度幅值和梯度方向,其中梯度幅值公式为:G= \sqrt{G_{x}^{2} + G_{y}^{2}},梯度方向公式为:\theta = arctan\left ( \frac{G_{y}}{G_{x}} \right )。Sobel算子比起Prewitt,增加了水平/垂直方向的权重。

    获得边缘:接着设定一个梯度阈值,使得两梯度和 \left ( G_x + G_y \right ) 高于该阈值的位置用255代替,而低于阈值的位置则用0代替,即可得到最终的图像边缘。

    2.3.2  Canny算子

    • Canny边缘检测的流程有四步:高斯滤波平滑,计算图像梯度信息,梯度非极大值抑制和双阈值提取边缘点。
    • 算法具体步骤如下:
    1. f\left ( x, y \right )表示输入图像,G\left ( x, y \right )表示高斯函数,则高斯滤波就是用Gf的卷积来形成一幅平滑的图像,其中,G\left ( x,y \right ) = e^{-\frac{x^{2}+y^{2}}{2\sigma ^{2}}}。通过高斯滤波,可以滤除图像上单独的噪声的影响,防止将其识别为边缘;
    2. 图像边缘其实就来自于一幅图像中灰度强度变化最强的位置,即梯度变化最大的方向。计算梯度时,使用一个检测水平边缘的模板Sobel_x = \begin{pmatrix} -1 & -2 & -1\\ 0& 0 &0 \\ 1& 2& 1 \end{pmatrix}和一个检测垂直边缘的模板Sobel_y = \begin{pmatrix} -1 & 0 &1 \\ -2 &0 &2 \\ -1 &0 &1 \end{pmatrix}对图像进行卷积运算,得到x和y方向上的梯度,再由这两个梯度计算得到梯度幅值和梯度方向,其中梯度幅值公式为:G= \sqrt{G_{x}^{2} + G_{y}^{2}},梯度方向公式为:\theta = arctan\left ( \frac{G_{y}}{G_{x}} \right )
    3. 获得梯度表示的边缘后,需要将其细化:保留边缘上的最大值,删掉其他值,使得边缘成为一条明亮的细线。本实验中仅实现简化版本,即考虑四个梯度方向,水平、垂直、+45°和-45°,对每个边缘点,比较该位置梯度方向上的n个像素点,若该边缘点为最大值,则保留,否则抑制;
    4. 经过非极大值抑制后,图像中依旧存在部分噪声点,通过滞后阈值法来减少伪边缘点。设置高低两个阈值,分别对图像进行阈值二值化处理。由低阈值处理得到的边界为弱边界,由高阈值处理得到的边界为强边界,我们可以确信强边界为真实的边缘,而和强边界相连的弱边界也被认为是边缘,其他的弱边界则被抑制。

    3  Hough变换

    图像中的边缘上的像素可能由于噪声,不均匀光照等原因而产生断裂或亮度不连续,难以产生良好的边缘效应,这时需要采用链接过程来将像素组装为边缘,一种常见的方法为Hough变换。

    朴素做法可能是通过找每一对点确定的线,来找出所有的线,再进行判断比较,但这种方法的时间复杂度为O(n^2),所以一般不采用。

    而Hough变换将点从xy空间变换到直线(L=ax+b)的参数ab空间。经过一点的直线有无数多条,因此每个点对应到参数空间中就为一条曲线。但是这种情况下也有问题,若直线为垂直,则a为无穷大,无法表示。因此,还需要直线表示形式转化为xcos\theta + y sin\theta = \rho,从而将参数空间转化为极坐标。

    接着,可将\rho, \theta空间量化为一个个方格,量化的细度决定了点共线的精度。原图像上的一个点,可以为参数空间中的一批方格进行投票,最终可抽象出一个稀疏矩阵,具有空间存储和计算时间的优点。最后需要做峰值检测,找到投票数最大的几个方格,即为原图像上多点的交线。由于量化和图像边缘不直的原因,峰值可能存在于多个单元,可采用非极大值抑制进行处理。

    4  阈值处理

    还有一种分割方法是通过观察灰度图像的直方图,挖掘其中特殊的两个模式,可以找到一个阈值,来将其区分开来。

    4.1  固定阈值

    固定阈值的matlab实现非常简单,只需要Img(Img > threshold) = 255以及令Img(Img <= threshold) = 0 即可实现。

    4.2  大律法(OTSU)

    OTSU法是一种自适应阈值的方法。

    总体思想就是利用贝叶斯理论,找到一种分类结果,使得整幅图像像素分类误差最小化。阅读论文后,我觉得它的计算大致分为三个步骤:1)对灰度等级进行归一化:设整张图片中每个灰度等级i对应的数量为n_i,令p_i等于\frac{n_i}{N},其中N为总像素数;2)计算类间方差:论文中引入\sigma _{B}^{2}(k) = \frac{[\mu_T \omega (k)-\mu(k)]^{2}}{\omega(k)[1-\omega(k)]}作为当阈值设置为k时的判别度量,其中\omega(k) = \sum_{i=0}^{k}p_i\mu(k) = \sum_{i=0}^{k} ip_i,分别为灰度直方图的第0阶和1阶累计矩,\mu_T = \sum_{i=0}^{255} ip_i为整张图的灰度均值;3)根据类间方差最大化选择阈值,也就是求解最优化式子:\sigma_{B}^{2}(k^{*}) = \max_{0\leq k \leq255} \sigma_{B}^{2}(k),直接遍历每个k,寻找最优值即可。

    OTSU算法其实就是用了方差分析的思想,因为二值化处理本质上是分类问题,那么通过阈值区分开的两个类别,类间方差应该越大越好,OTSU算法就是通过遍历每一个阈值,并计算对应的类间方差,选择其中类间方差最大的阈值作为整张图像的自适应阈值,就可以近似认为该阈值为根据全局灰度信息确定的最佳分割阈值。

  • 相关阅读:
    存一个滤波器的截图。免的过段时间忘了
    【项目实战】springboot+vue舞蹈课程在线学习系统-java舞蹈课程学习打卡系统的设计与实现
    软件著作权在哪里查?
    高级网络调试技巧:使用Charles Proxy捕获和修改HTTP/HTTPS请求
    阿里云Maven和Gradle仓库最新配置
    【HTML】笔记2-表格、列表、表单标签
    Flink中的批和流
    无代码和低代码平台:程序员的竞争优势
    如何实现生产质量精细化管理?
    变量的赋值和更新
  • 原文地址:https://blog.csdn.net/m0_46203495/article/details/125529447