Opencv(C++)学习系列---Canny边缘检测算法

简介: Opencv(C++)学习系列---Canny边缘检测算法



【1】边缘检测算法流程

  1. 使用高斯滤波器来平滑图像,达到滤除噪声的效果。(降噪)
  2. 计算图像中每个像素点的梯度大小和方向(求梯度,与sobel算法求梯度一致)
  3. 使用非极大值抑制,消除边缘检测带来的不利影响(非极大抑制)
  4. 使用双域值法监测确定真实和潜在的边缘(双域值检测)
  5. 通过抑制孤立的弱边缘完成边缘检测(抑制弱边缘)  

具体算法流程可以参考该文章:

https://zhuanlan.zhihu.com/p/494567705

【2】Canny算子介绍

void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

具体参数介绍:

第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,可以为三通道彩色图像,也可以是单通道的灰度图像。

第二个参数,OutputArray类型的edges,输出的边缘图,是单通道的边缘图像。

第三个参数,double类型的threshold1,第一个滞后性阈值。

第四个参数,double类型的threshold2,第二个滞后性阈值。

Canny采用俩个阈值,根据边缘响应的灰度图,大于高阈值的为强边缘,小于低阈值的为弱边缘,介于强弱边缘的值采用搜索算法。在8个领域内是否存在强边缘,如果存在强边缘,则该点就可以设置为强边缘。

第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。

第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。

【3】完整代码

#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
  //载入原始图
  Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\2.jpg");
  Mat src1 = src.clone();
  Mat src2(src.size(),CV_8UC1);
  //第一种直接使用边缘检测canny算法
  //blur(src2,src2,Size(3,3));
  Canny(src,src2,150,180);
  imshow("边缘检测1",src2);
  //第二种高阶边缘检测算法,转为灰度图,降噪,用Canny得到最后的边缘作为掩码,转到原图得到效果图,得到色彩的边缘图
  Mat dst, edge, gray;
  //【1】创建与src同类型和大小的矩阵(dst)
  dst.create(src1.size(),src1.type());
  //【2】将彩色图转为灰度图
  cvtColor(src1,gray,COLOR_BGR2GRAY);
  //【3】先使用3x3的内核用来降噪
  blur(gray,edge,Size(3,3));
  //【4】运行canny算法
  Canny(edge, edge, 3, 9);
  //【5】将dst中的像素都置为0
  dst = Scalar::all(0);
  //【6】与edge为掩码,将src2复制到dst中
  src1.copyTo(dst,edge);
  //【7】显示效果图
  imshow("边缘检测2",dst);
  //显示原始图
  imshow("原图",src);
  waitKey(0);
  system("pause");
  destroyAllWindows();
  return 0;
}

运行结果:

相关文章
|
22天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
197 3
|
2月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
68 1
|
21天前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
16 0
|
22天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
60 0
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
58 11
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
1月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
22 3
|
2月前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
49 0
|
2月前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
39 0