OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
目录
一.介绍
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算子检测图像边缘)相关推荐
- 应用sobel算子算法c语言,Canny算子与Sobel算子求图像边缘的C代码实现
*Canny算子与Sobel算子求图像边缘笔记* 1.Canny求边缘算法原理简述 Canny检测边缘主要分为以下 四个算法步骤: A:噪声去除 canny算子是通过对每个像素点求一阶导数来找到梯度明 ...
- sobel算子检测图像清晰度
文章目录 前言 概念 图像处理.视觉等基础概念 清晰度判断概念 sobel算子是什么? Sobel原理 Sobel实现 Sobel应用 改进的八方向sobel算子基于的理论 视觉系统 sobel算子实 ...
- 边缘提取算子检测比较
1.sobert.robert和prewitt算子检测图像边缘 I=imread('mc.jpg');i2=im2double(I); ihd=rgb2gray(i2); [thr,sorh,keep ...
- 准确检测图像的轮廓 opencv_图像处理案例实战
1. 切边 源图像: 需求:扫描仪扫描到的法律文件,需要切边,去掉边缘空白,这样看上去才真实,人工操作成本与时间花费高,希望程序自动实现,高效.准确. 实现思路:边缘检测 + 轮廓发现或直线检测最大外 ...
- Prewitt滤波器的实现,对比Prewitt滤波器和Sobel滤波器提取图像边缘的效果
一. Prewitt滤波器简介 Prewitt是一种常用的检测图像边缘的滤波器,它分为横向和纵向算子,分别用于检测纵向和横向的边缘(注意:横向形式的滤波器检测图像的纵向边缘,纵向形式的滤波器检测图像的 ...
- 图像边缘Canny算子提取
图像边缘Canny算子提取 Blog: https://blog.csdn.net/AnimateX Email: animatex.deng@gmail.com 本次项目中我觉得最有意思的部分就是梯 ...
- OpenCV 【七】————边缘提取算子(图像边缘提取)——canny算法的原理及实现
canny边缘检测实现(C++.opencv) 1.作用: 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运 ...
- 图像边缘检测-Canny,Sobel等算子
一.前言 首先我们先来简单了解一下什么是数字图像处理(Digital Image Processing),先看一下数字图像主要的两个应用领域: 1.改善图示信息以便人们解释: 2.为存储.传输和表示而 ...
- python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)
python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录
- android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio
实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...
最新文章
- 中国地址住址五级以下
- win10系统下“从开始屏幕取消固定”无反应解决方法
- AutoCAD2010云盘分享链接
- 为什么重写equals方法时,要求必须重写hashCode方法?
- 进行数据分析时,如何过滤报告数据?玩转永洪BI就够了
- 怎么将图片镜面对称_怎么把镜面对称
- Windows2008server系统搭建DHCP服务器
- Linux应用-加密和安全
- 微服务设计指导-使用云原生微服务解决传统海量跑批时引起的系统间“级联雪崩”以及效率
- Android基础篇 访问Assets文件夹里面的资源【文本、图片、音频、字体包】
- Python模块学习 ---- struct 数据格式转换
- Homepod评测:一款音质超棒但低智商的音箱
- C语言——求三个数中最大值(6种方法)
- 【POJ C++题目】魔兽世界之一:备战
- TCP-IP协议详解(5) 我尽力(IP协议详解)
- TargetSdkVersion升级到30后,安卓11手机上,apk解析失败
- 随心玩玩(四)docker从入门到入土
- python randint什么分布_python随机数分布random均匀分布实例
- mysql 字段增加备注_怎么在mysql数据库中添加备注信息
- 清华“差生”10年奋斗经历,只写事业,不写女人
热门文章
- Mybatis sqlsession解析
- js------match() 方法
- 谷歌在线appspot平台教你学Hacker(由浅如深)-XSS篇
- 5.2.8.字符设备驱动代码实践1
- 控制台应用程序的Main方法
- 在.net平台下,执行命令行
- MySQL Merge存储引擎
- 认识![CDATA[ ]]
- C#中winform使用相对路径读取文件的方法
- SpringBoot建立数据库连接JdbcTemplate和Mybatis两种方式