• 高斯模糊、Canny边缘检测


    一、 高斯模糊

    1.1 图像卷积滤波

    对于滤波来说,它可以说是图像处理最基本的方法,可以产生很多不同的效果。以下图来说

    图中矩阵分别为二维原图像素矩阵,二维的图像滤波矩阵(也叫做卷积核,下面讲到滤波器和卷积核都是同个概念),以及最后滤波后的新像素图。

    对于原图像的每一个像素点,计算它的领域像素和滤波器矩阵的对应元素的成绩,然后加起来,作为当前中心像素位置的值,这样就完成了滤波的过程了。

    可以看到,一个原图像通过一定的卷积核处理后就可以变换为另一个图像了。而对于滤波器来说,也是有一定的规则要求的。

    • ① 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
    • 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
    • ③ 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
    • ④ 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

    1.2 高斯模糊

    有了前面的知识,我们知道如果要想实现高斯模糊的特点,则需要通过构建对应的权重矩阵来进行滤波。通常,采用高斯函数进行权重矩阵的构建。

      一维高斯函数

     正态分布中,越接*中心点,取值越大,越远离中心,取值越小。

     可以看到,G(x)的跟sigma的取值有极大的关系。sigma取值越大,图像越*缓,sigma取值越小,图像越尖锐。


    计算*均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权*均值。正态分布显然是一种可取的权重分配模式。

      二维高斯函数

    二维高斯是构建高斯滤波器的基础。可以看到,G(x,y)在x轴y轴上的分布是一个突起的帽子的形状。这里的sigma可以看作两个值,一个是x轴上的分量sigmaX,另一个是y轴上的分量sigmaY。

    对图像处理可以直接使用sigma并对图像的行列操作,也可以用sigmaX对图像的行操作,再用sigmaY对图像的列操作。它们是等价的。
    当sigmaX和sigmaY取值越大,整个形状趋*于扁*;当sigmaX和sigmaY取值越小,整个形状越突起

    其中,μ是x的均值,σ是x的方差。因为计算*均值的时候,中心点就是原点,所以μ等于0。

    (1)在核大小固定的情况下,sigma值越大,权值分布越*缓。因此,邻域各个点的值对输出值的影响越大,最终结果造成图像越模糊。
    (2)在核大小固定的情况下,sigma值越小,权值分布越突起。因此,邻域各个点的值对输出值的影响越小,图像变化也越小。假如中心点权值为1,其他点权值为0,那么最终结果是图像没有任何变化。
    (3)sigma固定时,核越大图像越模糊。
    (4)sigma固定时,核越小图像变化越小

      构建权重矩阵

    假定中心点的坐标是(0,0),那么距离它最*的8个点的坐标如下:

     为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

     这9个点的权重总和等于0.4787147,如果只计算这9个点的加权*均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

      计算高斯模糊

    权重矩阵,就可以计算高斯模糊的值了, 假设现有9个像素点,灰度值(0-255)如下:

      ×  = 

    将这9个值加起来,就是中心点的高斯模糊的值。

    对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

      函数原型:

      cv2.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] ) →DST

      参数:
        src :输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
        dst –输出与图像大小和类型相同的图像src。
        ksize :高斯核大小。 ksize.width 与 ksize.height 可以有所不同,但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。
        sigmaX :X方向上的高斯核标准差。
        sigmaY :Y方向上的高斯核标准差;如果 sigmaY 为零,则将其设置为等于 sigmaX;

            如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);

            完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。
        borderType :边缘扩展点插值类型(borderInterpolate()有关详细信息,请参见link )

      边缘点的处理

    如果一个点处于边界,周边没有足够的点,怎么办?

    一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。

    二、Canny边缘检测

     图像分割的应用十分普遍,它是指将数字图像细分为多个图像子区域的过程。图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析。

    图像分割方法主要包括阈值处理(二值化)、聚类法、边缘检测和区域生长等。对于图像分割问题的求解没有统一范式,通常要与领域知识充分结合,才能更为有效地解决。

    边缘检测是基于灰度突变来分割图像的常用方法,其实质是提取图像中不连续部分的特征。

    这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。

    Canny 边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计(Computational theory of edge detection)解释这项技术如何工作。

    Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

    • 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
    • 好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接*。
    • 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

    Canny算法实现过程

    1、图像灰度化:只有灰度图才能进行边缘检测

    2、去噪:噪声点将影响边缘检测的准确性

    3、求解梯度幅度和方向:利用sobel算子求解

    4、非极大值抑制:定位准确的边缘同时可缩小边缘线宽

    5、双阀值算法检测及连接边缘

      1. 图像灰度化

    Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像,那首先就得进行灰度化。对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权*均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:

            方法1:Gray=(R+G+B)/3;

            方法2:Gray=0.299R+0.587G+0.114B;

    注意1:至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;

    注意2:在编程时要注意图像格式中RGB的顺序通常为BGR

      2、去噪

    噪声的存在影响到边缘的检测,首先将图片进行高斯去噪,高斯去噪其实就是一个低通滤波器,滤除高频噪声。

    高斯滤波,即使用即使用某一尺寸的二维高斯核与图像进行卷积。由于数字图像的数据形式为离散矩阵,高斯核是对连续高斯函数的离散*似,通过对高斯曲面进行离散采样和归一化得出。例如,尺寸为 [公式] ,标准差为 [公式] 的高斯核为:

     在确定高斯核后,将其与图像进行离散卷积即可。

      3、求解梯度幅度和方向

    Sobel算子是两个 [公式] 的矩阵,分别为 [公式]和 [公式]。前者用于计算图像 [公式] 方向像素梯度矩阵 [公式] ,后者用于计算图像 [公式] 方向像素梯度矩阵 [公式]。具体形式为:

     

     其中, [公式] 为灰度图像矩阵,且此处的 [公式] 表示互相关运算(卷积运算可视为将卷积核旋转180°后的互相关运算)。

    需要说明的是,图像矩阵坐标系原点在左上角,且 [公式] 正方向为从左到右, [公式] 正方向为从上到下。则由

     可计算得到梯度强度矩阵 [公式] 。

      4、非极大值抑制

    在求出的幅值图像中,可能存在多个较大幅值临*的情况,但真正的边缘点只有一个,针对这样的情况我们进行非极大值抑制,找出局部最大值,从而可以剔除大部分非边缘点

    如上图所示,我们对每一像素点做如下处理:

    根据该像素点的梯度方向,确定需进行比较的临*像素点位置,如上图所示(过像素点方向为梯度方向的直线与该像素点临*的八像素点所组成的矩形,相交于dTmp1和dTmp2,根据g1,g2a和g3,g4估算出交点像素,

    如果该像素点均大于两交点像素则为极大值边缘点,否则为非边缘点)。

      5、双阀值算法检测及连接边缘

    1. 滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):

      1. 如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。
      2. 如果某一像素位置的幅值小于 低 阈值, 该像素被排除。
      3. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的像素时被保留。

      Canny 推荐的 高:低 阈值比在 2:1 到3:1之间。

    算法流程图

     函数原型:

    edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 
    参数解释
    • image:源图像
    • threshold1:阈值1
    • threshold2:阈值2
    • apertureSize:可选参数,Sobel算子的大小
    • L2gradient:一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的*方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)
    其中,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
    函数返回的是二值图,包含检测出的边缘

    参考链接

    Canny边缘检测算法

    Canny算法 边缘检测

    高斯模糊的算法

    高斯模糊原理,算法

  • 相关阅读:
    sql-DDL, DML 常用语句
    7.8 Structured Streaming
    7.7 输出操作
    7.6 转换操作
    7.5 高级数据源---Kafka
    7.4 基本输入源
    7.3 DStream操作
    7.2 Spark Streaming
    7.1 流计算概述
    6.3 使用Spark SQL读写数据库
  • 原文地址:https://www.cnblogs.com/saseng/p/13513289.html
Copyright © 2020-2023  润新知