20.Canny边缘检测

1.主要内容

  • Canny算法介绍
  • API cv::Canny()
    clone和copyto的区别,详见链接,注意copyto的掩码图
    图像的取反

2.Canny算法介绍

  • Canny是边缘检测算法,于1986年提出
  • 是一个很好的边缘检测器
  • 是常用也很实用的图像处理方法
    其算法步骤如下:
高斯模糊——GaussianBlur()              //降噪声
灰度转换——cvtColor
计算梯度——sobel/Schar                  
非最大信号抑制
高低阈值输出二值图像
  • 非最大信号抑制
    当边缘的信号很强时,系统会认为一大块都是边缘,但是边缘只能有一个,此时我们就要对非边缘的像素进行一个抑制。对最大信号抑制————在这个方向上,不是最大值的话,就把它的值去掉,
    在sobel算子之后,我们得到一个Gx和Gy,通过对它们的计算,我们得到一个角度,通过这个角度我们得到一个梯度变化的趋势,例如,我们得出在+x轴方向变化较大,那么我们就寻找+y(垂直方向)方向,现在左边、右边跟它中间的值相比,如果比它的值小,那么左边和右边都删掉,中间保留。
    在这里插入图片描述

  • 高低阈值输出二值图像
    解释:此时的图像由于之前的非最大信号抑制,所以目前图像的边缘都比较突出,但是可能由于一些原因一些边缘尚未连接起来,此时我们就需要这种方式来进行边缘的连接。
    具体操作:T1,T2为阈值,凡是高于T2的都保留,凡是小于T1的丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留,最终得到一个二值图像。
    推荐的高低阈值比值为 T2: T1 = 3:1/2:1其中T2为高阈值,T1为低阈值
    在这里插入图片描述
    在这里插入图片描述

3.API详解

(canny函数帮助我们封装好了以下五个步骤,高斯模糊、转化灰度图、sobel算子、非最大信号抑制、高低阈值输出最大值)

Canny(
    InputArray  src,     //8-bit的输入图像
    OutputArray  edges,  //输出边缘图像,一般都是二值图像,背景是黑色
    double threshold1,   //低阈值,常取高阈值的1/2或者1/3
    double threshold2,   //高阈值
    int aptertureSize,   //Sobel算子,常取3x3,取值3
    bool  L2gradient     //选择true表示是L2来归一化,默认用L1(false)归一化 
)

4.image.copyTo(image2)函数的补充解释

copyTo这个函数有两种定义方式,分别是

void  copyTo (OutputArray m)  const;

void  copyTo(OutputArray m ,InputArray mask)  const;

即,参数可以是一张输出图像,或者一张输出图像和一个掩码图
那么
image.copyTo(imageROI);
就是把image这张图片复制(copy to)到imageROI上
image.copyTo(imageROI,mask);
则是不仅把image这张图复制(copy to)到mageROI上,且image对应mask中像素值为0的像素 点都不会贴到imageROI上。

课外扩展:
OpenCV3之——copyTo()函数的使用方法
Canny边缘检测分析

发布了56 篇原创文章 · 获赞 51 · 访问量 6507

猜你喜欢

转载自blog.csdn.net/qq_43367829/article/details/105423652
今日推荐