OpenCV——边缘检测Canny算子
边缘检测Canny算子
该算法不容易受到噪声的影响,能够识别图像中的弱边缘和强边缘,并结合强弱边缘的位置关系,综和给出图像整体的边缘信息。Canny边缘检测算法是目前最优越的边缘检测算法之一,该方法的检测过程分为以下5个步骤:
Step1:使用高斯滤波平滑图像,减少图像中噪声。一般情况下使用式所示的5×5的高斯滤波器。
Step2:计算图像中每个像素的梯度方向和幅值。首先通过Sobel算子分别检测图像X方向的边缘和Y方向的边缘,之后利用式(5.24)计算梯度的方向和幅值。
为了简便,梯度方向常取值0°、45°、90°和135°这个四个角度之一。
- Step3:应用非极大值抑制算法消除边缘检测带来的杂散响应。首先将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较,如果当前像素的梯度强度与另外两个像素梯度强度相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。
- Step4:应用双阈值法划分强边缘和弱边缘。将边缘处的梯度值与两个阈值进行比较,如果某像素的梯度幅值小于较小的阈值,则会被去除掉;如果某像素的梯度幅 值大于较小阈值但小于较大阈值,则将该像素标记为弱边缘;如果某像素的梯度幅值大于较大阈值,则将该像素标记为强边缘。
- Step5:消除孤立的弱边缘。在弱边缘的8邻域范围寻找强边缘,如果8邻域内存在强边缘,则保留该弱边缘,否则将删除弱边缘,最终输出边缘检测结果。
void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize = 3, bool L2gradient = false );
- image:输入图像,必须是CV_8U的单通道或者三通道图像。
- edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
- threshold1:第一个滞后阈值。
- threshold2:第二个滞后阈值。
- apertureSize:Sobel算子的直径。
- L2gradient:计算图像梯度幅值方法的标志,幅值的两种计算方式如式(5.25)所示。
该函数利用Canny算法提取图像中的边缘信息。第一个参数是需要提取边缘的输入图像,目前只支持数据类型为CV_8U的图像,输入图像可以是灰度图像或者彩色图像。第二个参数是边缘检测结果的输出图像,图像是数据类型为为CV_8U的单通道灰度图像。函数第三个和第四个参数是Canny算法中用于区分强边缘和弱边缘的两个阈值,两个参数不区分较大阈值和较小阈值,函数会自动比较区分两个阈值的大小,不过一般情况下,较大阈值与较小阈值的比值在2:1到3:1之间。函数最后一个参数是计算梯度幅值方法的选择标志,无特殊需求的情况下,使用默认值即可。
简单示例
//
// Created by smallflyfly on 2021/6/15.
//#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "utils.hpp"#include <iostream>using namespace std;
using namespace cv;int main() {Mat im = imread("test.jpg", IMREAD_GRAYSCALE);if (im.empty()) {cerr << "image file read error" << endl;return -1;}resize(im, im, Size(0, 0), 0.5, 0.5);Mat result11, result12, result21, result22, result31, result32, result41, result42;Canny(im, result11, 100, 200);Canny(im, result12, 100, 200, 3, true);Canny(im, result21, 20, 50);Canny(im, result22, 20, 50, 3, true);// gauss blurMat imGauss;GaussianBlur(im, imGauss, Size(5, 5), 5);Canny(imGauss, result31, 20, 50);Canny(imGauss, result32, 20, 50, 3, true);Canny(imGauss, result41, 100, 200);Canny(imGauss, result42, 100, 200, 3, true);showImage("result11", result11);showImage("result12", result12);showImage("result21", result21);showImage("result22", result22);showImage("result31", result31);showImage("result32", result32);showImage("result41", result41);showImage("result42", result42);waitKey(0);destroyAllWindows();return 0;
}
OpenCV——边缘检测Canny算子相关推荐
- OpenCV:Canny算子边缘检测
目录 1.简介 2.cv::Canny() 3.实践 1.简介 Canny边缘检测是一个多级边缘检测算法.主要步骤如下: (1)使用高斯平滑滤波器卷积降噪. (2)计算平滑后图像的梯度幅值与方向,可以 ...
- python canny算子_Python - OpenCV 之Canny算子边缘提取
#!--*-- coding=utf-8 --*-- import cv2 import os import argparse ''' 基于OpenCV Canny 算子的提取图像边缘 ''' # d ...
- 图象处理中的边缘检测------canny算子
图象边缘检测中边界闭合性的分析与探讨 摘 要 在图象边缘检测中往往要求所检测到的边缘具有封闭特性,本文详细地分析了目前常用的两种算法:哈夫变换和Canny边缘检测算法,最后,探讨边缘算子应满足的准 ...
- 【OpenCv】Canny算子边缘检测
Canny 算子和 Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标: 好的信噪比,即将非边缘 ...
- Android OpenCV 边缘检测 Canny 的使用
先看下实现的效果图 下面看下代码使用 Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSiz ...
- 边缘检测 - Canny算子
一. Canny 算法简介 Canny边缘检测算子是 John F.Canny 于 1986 年开发出来的一个多级边缘检测算法.更为重要的是,Canny 创立了边缘检测计算理论(Computation ...
- 《opencv学习笔记》-- 边缘检测和canny算子、sobel算子、LapIacian 算子、scharr滤波器
目录 边缘检测 canny算子 sobel算子 LapIacian 算子 (拉普拉斯) scharr滤波器 边缘检测 边缘检测步骤: 1.滤波: 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导 ...
- C++ Canny算子进行边缘检测
C++实现Canny算子 进行边缘检测 文章目录 C++实现Canny算子 进行边缘检测 前言 一.Canny算子原理 二.C++实现Canny算子 1.步骤 2.C++代码如下 三.Canny算子运 ...
- OpenCV(十七)边缘检测3 -- Canny算子(最优边缘检测)
目录 一.基础理论 1.作用及介绍 1.原理 2.过程 3.Canny函数 二.回调函数及总代码 效果 参考资料 一.基础理论 1.作用及介绍 Canny边缘检测是非常流行的边缘检测算 ...
最新文章
- java代码套路,开发中比较容易理解的代码套路
- p2p webrtc服务器搭建系列1: 房间,信令,coturn打洞服务器
- java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁
- 中国电子用LCP树脂市场未来发展展望及十四五规划咨询建议报告2022-2028年版
- vue 打包上线后字体图标不显示
- 计算机辅助翻译的启示,翻译单位研究对计算机辅助翻译启示.PDF
- GWT EJB3 Maven JBoss 5.1集成教程
- OpenJudge NOI 1.7 10:简单密码
- 机器学习:支持向量机SVM和人工神经网络ANN的比较
- SQL Server 2019 创建数据库(利用程序)
- 销售易CRM:提高管理效率需做好业绩预测
- python网络蜘蛛
- 异常详细信息: System.ComponentModel.Win32Exception: 信号灯超时时间已到
- 华为无线模板之间的应用关系图
- fgo服务器维护补偿,FGO游戏内显示问题修复通知 全服补偿2个金苹果
- 九个最佳ICON图标搜索引擎
- 上海小伙三次成功创业,资产达上十亿被称为“创业神童”
- 项目是如何死掉的?太过真实!哈哈哈~嗝~~
- R语言如何从外部读取数据到R中
- 高新技术企业补助政策
热门文章
- 浏览器扩展插件(一)
- FFplay文档解读-21-音频过滤器六
- (C#)用PEN画线
- 区块链真实落地调查(一):区块链溯源,能让食品更安全吗?
- Emoji 图形符号简介
- SuperMap iClient3D for WebGL产品包更新--201706
- 小程序开发:未找到 app.json 中的定义的 pages “pages/index/index“ 对应的 WXML 文件
- 图像缩放算法及速度优化
- 动态gmm模型学习笔记2-面板模型
- 机器学习:性能度量篇-Python利用鸢尾花数据绘制ROC和AUC曲线