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;
}

运行结果:

相关文章
|
4月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
153 0
|
2月前
|
并行计算 算法 数据可视化
基于OpenCV C++实现的光流法目标检测
基于OpenCV C++实现的光流法目标检测
|
3月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
210 1
|
9月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
11月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
2273 11
架构学习:7种负载均衡算法策略
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
3571 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
236 4
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)