OpenCV3之——边缘检测Canny算子的高阶用法
程序员文章站
2022-06-01 18:15:06
...
一、canny算子:
Canny的目标是找到一个最优的边缘检测算法,评判标准:低错误率、高定位性、最小响应
二、canny边缘检测的步骤:
- 消除噪声,一般情况下,使用高斯平滑滤波器卷积降噪
- 计算梯度幅值和方向
- 非极大值抑制,这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
- 滞后阈值
<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;
}
运行结果:
上一篇: opencv学习笔记十二:梯度算子
下一篇: HTML二级菜单