欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-01 18:15:06
...

一、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 <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
	Mat src = 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算子的高阶用法