OpenCV3之——边缘检测Canny算子的高阶用法

一、canny算子:
Canny的目标是找到一个最优的边缘检测算法,评判标准:低错误率、高定位性、最小响应
二、canny边缘检测的步骤:

  1. 消除噪声,一般情况下,使用高斯平滑滤波器卷积降噪
  2. 计算梯度幅值和方向
  3. 非极大值抑制,这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
  4. 滞后阈值
<1>若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素
<2>若某一像素位置的幅值小于低阈值,该像素被排除
<3>若某一像素位置的幅值在两者之间,该像素仅仅在连接到一个高于高阈值的时候被保留
三、Canny函数
函数原型:
C++: void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)

参数详解:
  • 第一个参数,InputArray类型的image,输入图像,填Mat类对象即可,且需为单通道8位图像
  • 第二个参数,OutputArray类型的edges,输出边缘图,和源图像有一样的尺寸和类型
  • 第三个参数,double类型的threshold1,第一个滞后性阈值
  • 第四个参数,double类型的threshold2,第二个滞后性阈值
  • 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,默认值3
  • 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,默认值false
注意:两个阈值中较小的值用于边缘连接,较大的值用来控制强边缘的初始段,推荐高低阈值比为2:1到3:1之间
四、示例:Canny边缘检测
#include using namespace std; using namespace cv; int main() { Mat src = https://www.it610.com/article/imread("1.jpg"); Mat src1 = src.clone(); //显示原始图 imshow("【原始图】Canny边缘检测", src); //高阶canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图 Mat dst, edge, gray; //创建与src同类型和大小的矩阵dst dst.create(src1.size(), src1.type()); //将原图转化为灰度图 cvtColor(src1, gray, COLOR_RGB2GRAY); //先用3×3内核来降噪 blur(gray, edge, Size(3, 3)); //运行canny算子 Canny(edge, edge, 3, 9, 3); //推荐高低阈值比在2:1到3:1之间 //将dst内所有元素设置为0 dst = Scalar::all(0); //edge作为掩码,将原图src拷贝到dst中 src1.copyTo(dst, edge); imshow("【效果图】Canny边缘检测", dst); waitKey(0); return 0; }

运行结果:

【OpenCV3之——边缘检测Canny算子的高阶用法】 OpenCV3之——边缘检测Canny算子的高阶用法
文章图片

    推荐阅读