Post

边缘检测

边缘检测相关笔记

优边缘检测的主要评价标准: 1.低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。 2.高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。 3.最小响应: 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

canny算子

检测步骤

  1. 消除噪声
    一般情况下,使用高斯平滑滤波器卷积降噪
  2. 计算梯度幅值和方向
  3. 运用一对卷积阵列 (分别作用于x和y方向)
    Alt text
  4. 计算梯度幅值和方向
    Alt text
    梯度方向一般为0, 45, 90, 135
  5. 非极大值抑制 这一步排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。
  6. 滞后阈值 滞后阈值需要两个阈值(高阈值和低阈值)
  7. 如果某一像素位置的幅值超过高阈值,该像素被保留为边缘像素。
  8. 如果某一像素位置的幅值小于低阈值,该像素被排除。
  9. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
1
2
3
void Canny( InputArray image, OutputArray edges,
            double threshold1, double threshold2,
            int apertureSize = 3, bool L2gradient = false );

参数详解:

  • 第一个参数,InputArray类型的src,输入图像。需为单通道8位图像。
  • 第二个参数,OutputArray类型的dst,目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,double类型的threshold1,第一个滞后性阈值。
  • 第四个参数,double类型的threshold2,第二个滞后性阈值。
  • 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
  • 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。

阈值1和阈值2两者的小者用于边缘连接,而大者用来控制强边缘的初始段。推荐的高低阈值比在2:1到3:1之间。

sobel算子

计算过程,假设被作用图像为I。

  1. 分别在x和y两个方向求导
  2. 水平变化 将I与一个奇数大小的内核进行卷积。
  3. 垂直变化 将I与一个奇数大小的内核进行卷积。
  4. 在图像的每一点,结合以上两个结果求出近似梯度
1
2
3
4
void Sobel( InputArray src, OutputArray dst, int ddepth,
            int dx, int dy, int ksize = 3,
            double scale = 1, double delta = 0,
            int borderType = BORDER_DEFAULT );

参数详解:

  • 第一个参数,InputArray类型的src,输入图像。
  • 第二个参数,OutputArray类型的dst,目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的ddepth,输出图像的深度,支持如下src.depth()和ddepth的组合:
    • 若src.depth() = CV_8U, 取ddepth=-1,CV_16S,CV_32F,CV_64F
    • 若src.depth() = CV_16U或CV_16S, 取ddepth =-1,CV_32F,CV_64F
    • 若src.depth() = CV_32F, 取ddepth =-1,CV_32F,CV_64F
    • 若src.depth() = CV_64F, 取ddepth = -1,CV_64F
  • 第四个参数,int类型的dx,x方向上的差分阶数。
  • 第五个参数,int类型的dy,y方向上的差分阶数。
  • 第六个参数,int类型的ksize,有默认值3。Sobel核的大小必须取1,3,5或7。
  • 第七个参数,double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。
  • 第八个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
  • 第九个参数, int类型的borderType,边界模式,默认值为BORDER_DEFAULT。

laplace算子

Laplacian算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad()的散度div()。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义为: (1) f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数求和: (2) 作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k ≥ 2。表达式(1)(或(2))定义了一个算子Δ :C(R) → C(R) ,或更一般地,对于任何开集Ω,定义了一个算子Δ : C(Ω) → C(Ω)。

Laplacian算子的定义:

\[Laplacian(f)=\frac{\vartheta^2f}{\vartheta x^2}+\frac{\vartheta^2f}{\vartheta y^2}\]
1
2
3
void Laplacian( InputArray src, OutputArray dst, int ddepth,
                int ksize = 1, double scale = 1, double delta = 0,
                int borderType = BORDER_DEFAULT );;

参数详解:

  • 第一个参数,InputArray类型的src,输入图像。需为单通道8位图像。
  • 第二个参数,OutputArray类型的dst,目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的ddepth,输出图像的深度。
  • 第四个参数,int类型的ksize,用于计算二阶导数的滤波器的孔径尺寸,大小必须为正奇数,且有默认值1
  • 第五个参数,double类型的scale,计算拉普拉斯值的时候可选的比例因子,默认值是1。
  • 第六个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
  • 第七个参数, int类型的borderType,边界模式,默认值为BORDER_DEFAULT。
This post is licensed under CC BY 4.0 by the author.