OpenCV几种边缘检测的简例
简单记录一下OpenCV的几种边缘检测函数的用法。
边缘检测算法
以Sobel边缘检测算法为例。
Sobel卷积核模板为:
偏导公式为:
卷积核模板的图片又是从网上抄来的,实际上我都不是很确定Gx,Gy有没有标反,但这不重要,只要知道了卷积核,就可以把核放到矩阵上一个一个的滑动,对应位置相乘,然后把这6(其实应该说是9个数,因为在Sobel算子的卷积核中有3个0,任何数乘以0都是0,所以可以不计算,但在其他算子就不见得都为0)个乘积相加,就分别得到了该坐标位置的Gx,Gy,这样一直滑到最后一个(我就是这么理解卷积的)。
不过到这里其实还只是做了一半,因为还只是算出来了x和y方向的偏导数。
公式(8.1)是梯度向量,梯度幅值为用公式(8.2)。但在实际使用中,为了提高计算的速度,我们可以用式(8.3)、(8.4)(8.5)来近似。(8.6)是梯度向量的方向角公式。
所以,在计算出(i,j)处的Gx(i,j),Gy(i,j)之后,可以用式(8.2)计算出图像的梯度幅值,或者用式(8.3)、(8.4)、(8.5)算出近似幅值后,设定一个阈值T,如果(i,j)处的幅值大于阈值T,则认为该点是边缘点。
边缘检测大体都是这样,不同的算子只是卷积核不同。其实只要理解了图像数据是怎么进行卷积计算的,都可以自己设计算子,当然效果要好才有用。
附上一个OpenCV的几个边缘检测函数的简单使用的栗子。
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("F:\\picture\\cv53.jpg");
Mat dst;
//输入图像
//输出图像
//输入图像颜色通道数
//x方向阶数
//y方向阶数
//Sobel(src,dst,src.depth(),1,1);
//imwrite("sobel.jpg",dst);
//输入图像
//输出图像
//输入图像颜色通道数
//Laplacian(src,dst,src.depth());
//imwrite("laplacian.jpg",dst);
//输入图像
//输出图像
//彩色转灰度
cvtColor(src,src,CV_BGR2GRAY); //canny只处理灰度图
//输入图像
//输出图像
//低阈值
//高阈值,opencv建议是低阈值的3倍
//内部sobel滤波器大小
Canny(src,dst,50,150,3);
imwrite("canny71.jpg",dst);
imshow("dst",dst);
waitKey();
return 0;
}
想测试那种边缘检测,就把注释修改一下即可。
OpenCV几种边缘检测的简例的更多相关文章
- opencv学习之边缘检测
边缘检测 是图像处理 过程中经常会涉及到的一个环节.而在计算机视觉 和 机器学习领域,边缘检测 用于 特征提取 和 特征检测 效果也是特别明显.而 openCV 中进行边缘检测的 算法 真是五花八门, ...
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- 【Swfit】Swift与OC两种语法写单例的区别
Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 + (instancetype)sharedNetworkTools { static id inst ...
- MATLAB 进行五种边缘检测
自定义函数: function []=edge_detect(image_name) a=imread(image_name); I=rgb2gray(a); BW1=edge(I,'Roberts' ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- 边缘检测︱基于 HED网络TensorFlow 和 OpenCV 实现图片边缘检测
本文摘录自<手机端运行卷积神经网络的一次实践 – 基于 TensorFlow 和 OpenCV 实现文档检测功能> 只截取感兴趣 的片段. . 一.边缘检测 1.传统边缘检测 Google ...
- OpenCV图像Canny边缘检测
Canny边缘检测 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘函数原型: void cvCanny( ...
- 两种设计模式(2)==>>"单例"
所谓“单例”: 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资 ...
- unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法
方法其实都差不多,就是用两个过滤器,分别处理两个分量 Sobel算子 先说Sobel算子 GX为水平过滤器,GY为垂直过滤器,垂直过滤器就是水平过滤器旋转90度.过滤器为3x3的矩阵,将与图像作平面卷 ...
随机推荐
- 正则表达式 \b
引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...
- String StringBuffer StringBuilder 老生常谈
1.String 与 StringBuffer . StringBuilder的区别 String 字符串常量 而 (StringBuffer 和 StringBuilder 字符串变量) 执行速度上 ...
- Linux一键安装web环境全攻略(阿里云ECS服务器)
摘自阿里云服务器官网,此处 一键安装包下载: 点此下载 安装须知 1.此安装包可在阿里云所有linux系统上部署安装,此安装包包含的软件及版本为: nginx:1.0.15.1.2.5.1.4.4 a ...
- Flash本地共享对象 SharedObject
以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...
- replace限制文本框只能输入数字,数字和字母等的正则表达式
1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...
- 2018 Multi-University Training Contest 1 - D Distinct Values (STL+双指针)
题意:数量为N的序列,给定M个区间,要求对每个区间Li,Ri,都有al..r (l≤i<j≤r), ai≠aj.构造这个序列使其字典序最小. 分析:如果对于每个所给区间都暴力扫一遍,1e5的数据 ...
- 添加一个vue全局守卫,主要用于用户登录时候验证
//注册一个全局守卫,作用是在路由跳转钱,对路由进行判断,防止未登录用户跳转到其他页面 router.beforeEach((to, from, next) => { let token = l ...
- Python学习之:pycharm配置
最近需要做一些小工具,听说Python不错,就学习一下.工欲善其事必先利其器,一个好的IDE对于学习一门新知识是很有帮助的,边写代码边换IDE,纠结了几天,最终还是选择了pycharm,之前觉得不够好 ...
- style、 currentStyle、 runtimeStyle、getComputedStyle区别分析
1.obj.style只能获得内嵌样式(inline Style)就是写在Tag里面的,他访问不到那些链接的外部css和在head中用<style>声明的style. 所以必须认识到在那些 ...
- redis主从、集群、哨兵
redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...