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 = 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算子的高阶用法_第1张图片

你可能感兴趣的:(OpenCV学习)