OpenCV探索之路(六):边缘检测(canny、sobel、laplacian)
边缘检测的一般步骤:
- 滤波——消除噪声
- 增强——使边界轮廓更加明显
- 检测——选出边缘点
Canny算法
Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,所以我们第一个就介绍他。
opencv中提供了Canny函数。
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//边缘检测
int main()
{
Mat img = imread("lol3.jpg");
imshow("原始图", img);
Mat DstPic, edge, grayImage;
//创建与src同类型和同大小的矩阵
DstPic.create(img.size(), img.type());
//将原始图转化为灰度图
cvtColor(img, grayImage, COLOR_BGR2GRAY);
//先使用3*3内核来降噪
blur(grayImage, edge, Size(3, 3));
//运行canny算子
Canny(edge, edge, 3, 9, 3);
imshow("边缘提取效果", edge);
waitKey(0);
}
看了canny算法提取的轮廓图,感觉真是厉害,居然把那么细致的额轮廓都提取出来了!
Sobel算法
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//边缘检测
int main()
{
Mat img = imread("lol3.jpg");
imshow("原始图", img);
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, dst;
//求x方向梯度
Sobel(img, grad_x, CV_16S, 1, 0, 3, 1, 1,BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
imshow("x方向soble", abs_grad_x);
//求y方向梯度
Sobel(img, grad_y,CV_16S,0, 1,3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_y,abs_grad_y);
imshow("y向soble", abs_grad_y);
//合并梯度
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
imshow("整体方向soble", dst);
waitKey(0);
}
通过下图可以看出,sobel的轮廓提取明显有没cnany的那么细致,只是把一些明显轮廓的边缘提取出来了,看起来会更舒服一点。
灰度图的效果
Laplacian算法
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//边缘检测
int main()
{
Mat img = imread("lol3.jpg");
imshow("原始图", img);
Mat gray, dst,abs_dst;
//高斯滤波消除噪声
GaussianBlur(img, img, Size(3, 3), 0, 0, BORDER_DEFAULT);
//转换为灰度图
cvtColor(img, gray, COLOR_RGB2GRAY);
//使用Laplace函数
//第三个参数:目标图像深度;第四个参数:滤波器孔径尺寸;第五个参数:比例因子;第六个参数:表示结果存入目标图
Laplacian(gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
//计算绝对值,并将结果转为8位
convertScaleAbs(dst, abs_dst);
imshow("laplace效果图", abs_dst);
waitKey(0);
}
但是感觉效果一般,图像变得模糊了。
OpenCV探索之路(六):边缘检测(canny、sobel、laplacian)的更多相关文章
- [OpenCV] 2、边缘检测 canny
>_<" 边缘检测代码:
- opencv学习之边缘检测
边缘检测 是图像处理 过程中经常会涉及到的一个环节.而在计算机视觉 和 机器学习领域,边缘检测 用于 特征提取 和 特征检测 效果也是特别明显.而 openCV 中进行边缘检测的 算法 真是五花八门, ...
- OpenCV探索之路(七):霍夫变换
我们如何在图像中快速识别出其中的圆和直线?一个非常有效的方法就是霍夫变换,它是图像中识别各种几何形状的基本算法之一. 霍夫线变换 霍夫线变换是一种在图像中寻找直线的方法.OpenCV中支持三种霍夫线变 ...
- OpenCV探索之路(二十四)图像拼接和图像融合技术
图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...
- OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- 【OpenCV】边缘检测:Sobel、拉普拉斯算子
推荐博文,博客.写得很好,给个赞. Reference Link : http://blog.csdn.net/xiaowei_cqu/article/details/7829481 一阶导数法:梯度 ...
- openCV(四)---Canny边缘检测
图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. 直接上代码,函数简介都在代码注释中 //canny边缘检测 -(void) ...
- OpenCV学习代码记录——canny边缘检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习笔记(11)——Canny边缘检测
了解Canny边缘检测的概念 1.原理 Canny边缘检测是一种非常流行的边缘检测算法,是 John F.Canny在1986年提出的.它是一个有很多步构成的算法 1)噪声去除 使用5*5的高斯滤波器 ...
随机推荐
- Linux 上做免密码登陆
基于密钥验证1.生成一对密钥ssh-keygen -t {rsa|dsa} -f /path/to/keyfile -N 'password'2.将公钥传输至服务器某用户的家目录的.ssh/autho ...
- 顺序线性表之大整数求和C++
顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李分享:android手机测试之适配(1)
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- php Redis常用命令
redis是一个很好的缓存工具,下面我们就来介绍一下他怎么使用 启动 Redis 服务src/redis-server或者src/redis-server redis.conf src/Redis-s ...
- 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言
0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...
- Spark名词解释及关系
随着对spark的业务更深入,对spark的了解也越多,然而目前还处于知道的越多,不知道的更多阶段,当然这也是成长最快的阶段.这篇文章用作总结最近收集及理解的spark相关概念及其关系. 名词 dri ...
- Anaconda配置多spyder多python环境
作者:桂. 时间:2017-04-17 22:02:37 链接:http://www.cnblogs.com/xingshansi/p/6725298.html 前言 最近在看<统计学习方法 ...
- SQL基础增删改查
一.基础语句介绍 SQL 可以分为两个部分:数据操作语言(DML)和数据定义语言(DDL) 1.数据操作语言(DML)基本指令: select 从数据表中获取数据(现阶阶段,二次开发常用) ...
- redis 字符串
redis 字符串 概述 redis 没有使用 c 语言风格的字符串表示(以 "\0" 作为结尾), 而是使用自定义的 sds 结构 字符串结构 定义位置 (src/sds.h) ...