目录

一.介绍

1.函数原型

2. 原理与步骤:

1). 消除噪声: gaussian

2). 计算梯度幅值和方向: sobel算子

3). 进行非极大值抑制

4). 滞后阈值,筛选边缘。

二. 代码测试

main.cpp

testFuntion.h

testFuntion.cpp

三. 运行结果


一.介绍

1.函数原型

对应opencv中:cv:Canny    imgproc.hpp

@param image 8-bit input image.

@param edges output edge map; single channels 8-bit image, which has the same size as image .

@param threshold1 first threshold for the hysteresis procedure.

@param threshold2 second threshold for the hysteresis procedure.

@param apertureSize aperture size for the Sobel operator.

@param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm

\f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude (L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough (L2gradient=false )

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,

double threshold1, double threshold2,

int apertureSize = 3, bool L2gradient = false );

2. 原理与步骤:

   1). 消除噪声: gaussian

一般情况下,使用高斯平滑滤波器,卷积降噪。 如 size = 5 的高斯核

   2). 计算梯度幅值和方向: sobel算子

       Ⅰ.运用一对卷积阵列 (分别作用于 x 和 y 方向): 按照Sobel算子进行计算梯度

       Ⅱ.使用下列公式计算梯度幅值和方向: 二阶偏导平和开根号 角度是反正切

   3). 进行非极大值抑制

即求梯度方向的局部极大值,来排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。

非极大值抑制原理: 在一个窗口内,如果有多个角点,则用值最大的那个角点,其他的角点都删除,比如可以通过图像的膨胀运算来达到检测极大值的目的,因为默认参数的膨胀运算就是用窗口内的最大值替代当前的灰度值。

   4). 滞后阈值,筛选边缘。

使用了两个阈值(高阈值和低阈值):

Ⅰ. 如果某一像素的梯度小于低阈值, 该像素被排除。          //小阈值用来控制边缘连接

Ⅱ. 如果某一像素的梯度超过高阈值, 该像素被保留为边缘像素。 //大的阈值用来控制强边缘的初始分割

Ⅲ. 如果某一像素的梯度在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时,被保留。

推荐的高低阈值比: 在2:1到3:1之间。或者使用直方图中像素总数的70% 30%位置的值。

二. 代码测试

main.cpp

#include ".\mycode\include\testFuntion.h"int main()
{test_Canny();return 0;
}

testFuntion.h

#include <opencv2/opencv.hpp>#define  PIC_LOGO            "D://test_OpenCV//testpic//jologo.jpg"
#define  PIC_MOUNTAIN_CITY    "D:\\test_OpenCV\\testpic\\mountain_city.jpg"#define SCALE  100     //缩放比例因子
using namespace cv;测试Canny算子,检测图像边缘
void test_Canny();

testFuntion.cpp

void test_Canny()
{Mat srcImg = imread(PIC_LOGO);Mat grayImg, dstImg, edgeImg;namedWindow("Pic src");imshow("Pic src", srcImg);int unitSize = (srcImg.size().height > srcImg.size().width ? srcImg.size().width : srcImg.size().height)*2/ SCALE;cvtColor(srcImg, grayImg, COLOR_BGR2GRAY);blur(grayImg, grayImg, Size(unitSize, unitSize));Canny(grayImg, edgeImg, 3, 9);namedWindow("Pic after canny");imshow("Pic after canny", edgeImg);waitKey();}

三. 运行结果

OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)相关推荐

  1. 应用sobel算子算法c语言,Canny算子与Sobel算子求图像边缘的C代码实现

    *Canny算子与Sobel算子求图像边缘笔记* 1.Canny求边缘算法原理简述 Canny检测边缘主要分为以下 四个算法步骤: A:噪声去除 canny算子是通过对每个像素点求一阶导数来找到梯度明 ...

  2. sobel算子检测图像清晰度

    文章目录 前言 概念 图像处理.视觉等基础概念 清晰度判断概念 sobel算子是什么? Sobel原理 Sobel实现 Sobel应用 改进的八方向sobel算子基于的理论 视觉系统 sobel算子实 ...

  3. 边缘提取算子检测比较

    1.sobert.robert和prewitt算子检测图像边缘 I=imread('mc.jpg');i2=im2double(I); ihd=rgb2gray(i2); [thr,sorh,keep ...

  4. 准确检测图像的轮廓 opencv_图像处理案例实战

    1. 切边 源图像: 需求:扫描仪扫描到的法律文件,需要切边,去掉边缘空白,这样看上去才真实,人工操作成本与时间花费高,希望程序自动实现,高效.准确. 实现思路:边缘检测 + 轮廓发现或直线检测最大外 ...

  5. Prewitt滤波器的实现,对比Prewitt滤波器和Sobel滤波器提取图像边缘的效果

    一. Prewitt滤波器简介 Prewitt是一种常用的检测图像边缘的滤波器,它分为横向和纵向算子,分别用于检测纵向和横向的边缘(注意:横向形式的滤波器检测图像的纵向边缘,纵向形式的滤波器检测图像的 ...

  6. 图像边缘Canny算子提取

    图像边缘Canny算子提取 Blog: https://blog.csdn.net/AnimateX Email: animatex.deng@gmail.com 本次项目中我觉得最有意思的部分就是梯 ...

  7. OpenCV 【七】————边缘提取算子(图像边缘提取)——canny算法的原理及实现

    canny边缘检测实现(C++.opencv) 1.作用: 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运 ...

  8. 图像边缘检测-Canny,Sobel等算子

    一.前言 首先我们先来简单了解一下什么是数字图像处理(Digital Image Processing),先看一下数字图像主要的两个应用领域: 1.改善图示信息以便人们解释: 2.为存储.传输和表示而 ...

  9. python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)

    python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录

  10. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

最新文章

  1. 中国地址住址五级以下
  2. win10系统下“从开始屏幕取消固定”无反应解决方法
  3. AutoCAD2010云盘分享链接
  4. 为什么重写equals方法时,要求必须重写hashCode方法?
  5. 进行数据分析时,如何过滤报告数据?玩转永洪BI就够了
  6. 怎么将图片镜面对称_怎么把镜面对称
  7. Windows2008server系统搭建DHCP服务器
  8. Linux应用-加密和安全
  9. 微服务设计指导-使用云原生微服务解决传统海量跑批时引起的系统间“级联雪崩”以及效率
  10. Android基础篇 访问Assets文件夹里面的资源【文本、图片、音频、字体包】
  11. Python模块学习 ---- struct 数据格式转换
  12. Homepod评测:一款音质超棒但低智商的音箱
  13. C语言——求三个数中最大值(6种方法)
  14. 【POJ C++题目】魔兽世界之一:备战
  15. TCP-IP协议详解(5) 我尽力(IP协议详解)
  16. TargetSdkVersion升级到30后,安卓11手机上,apk解析失败
  17. 随心玩玩(四)docker从入门到入土
  18. python randint什么分布_python随机数分布random均匀分布实例
  19. mysql 字段增加备注_怎么在mysql数据库中添加备注信息
  20. 清华“差生”10年奋斗经历,只写事业,不写女人

热门文章

  1. Mybatis sqlsession解析
  2. js------match() 方法
  3. 谷歌在线appspot平台教你学Hacker(由浅如深)-XSS篇
  4. 5.2.8.字符设备驱动代码实践1
  5. 控制台应用程序的Main方法
  6. 在.net平台下,执行命令行
  7. MySQL Merge存储引擎
  8. 认识![CDATA[ ]]
  9. C#中winform使用相对路径读取文件的方法
  10. SpringBoot建立数据库连接JdbcTemplate和Mybatis两种方式