当前位置: 首页 > 编程日记 > 正文

Sobel算子及cvSobel

转自:http://blog.sina.com.cn/s/blog_4bdbec750100mufo.html

由于项目里要用到边缘检测,所以今天研究了一下最简单的梯度的方法。

首先,我们来开一下计算机是如何检测边缘的。以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函数就是一个一次函数y=kx,对其求一阶导数就是其斜率k,就是说边缘的一阶导数是一个常数,而由于非边缘的一阶导数为零,这样通过求一阶导数就能初步判断图像的边缘了。通常是X方向和Y方向的导数,也就是梯度。理论上计算机就是通过这种方式来获得图像的边缘。

但是,具体应用到图像中你会发现这个导数是求不了的,因为没一个准确的函数让你去求导,而且计算机在求解析解要比求数值解麻烦得多,所以就想到了一种替代的方式来求导数。就是用一个3×3的窗口来对图像进行近似求导。拿对X方向求导为例,某一点的导数为第三行的元素之和减去第一行元素之和,这样就求得了某一点的近似导数。其实也很好理解为什么它就近似代表导数,导数就代表一个变化率,从第一行变为第三行,灰度值相减,当然就是一个变化率了。这就是所谓的Prewitt算子。这样近似X方向导数就求出来了。Y方向导数与X方向导数求法相似,只不过是用第三列元素之和减去第一列元素之和。X方向和Y方向导数有了,那么梯度也就出来了。这样就可以找出一幅图中的边缘了。

还有一个问题,由于求的是3×3中心点的导数,所以给第二列加了一个权重,它的权重为2,第一列和第三列的权重为1,好了,这就是Sobel算子了。相比Prewitt算子,Sobel的抗噪能力更强。如图所示:Sobel算子及cvSobel这样,中心点的X方向导数就求出来了。

举个例子吧。Sobel算子及cvSobel,X点以Sobel方式求导数ΔX=1×50+2×30+1×50-(1×50+2×30+1×50)=0。这样可以看出这个点不是边界。

好了,了解了基本理论之后,我们看看OpenCv下的Sobel函数吧,void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );src:输入图像;dst:输出图像;xorder:x 方向上的差分阶数;yorder:y 方向上的差分阶数;aperture_size 扩展 Sobel 核的大小(既窗口阶数),必须是 1(注意这是一个3×1或1×3向量而不是一个方阵), 3, 5 或 7。

下面编写一个Sobel边缘检测的程序吧,平台是VS08,建立Win32控制台应用程序。

#include <cv.h>

#include <highgui.h>

void main()

{

IplImage *frame,*gray,*sobel;

frame=cvLoadImage("lena.jpg");//加载图像

gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间

sobel=cvCreateImage(cvGetSize(frame),frame->depth,1);

cvNamedWindow("frame");

cvNamedWindow("gray");

cvNamedWindow("sobel");

cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度

cvSobel(gray,sobel,1,0,3);

cvShowImage("frame",frame);//显示图像

cvShowImage("gray",gray);

cvShowImage("sobel",sobel);

cvWaitKey(0);//等待

cvReleaseImage(&frame);//释放空间(对视频处理很重要,不释放会造成内存泄露)

cvReleaseImage(&gray);

cvReleaseImage(&sobel);

cvDestroyWindow("frame");

cvDestroyWindow("gray");

cvDestroyWindow("sobel");

}

运行,你会发现出错,仔细看看没有问题啊。其实,这里是问题的,因为以Sobel方式求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是 IPL_DEPTH_8U,也就是8位无符号数,所以Sobel建立的图像位数不够,要16位有符号的,也就是 IPL_DEPTH_16S。把建立图像这句改为

sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);运行,发现不报错了,但是Sobel图像显示不出来,这是什么原因呢?原来图像显示是以8位无符号显示的,现在是16位有符号,当然显示会出问题了。所以还要将Sobel转为8位无符号。OpenCv里提供了一个函数,就是cvConvertScaleAbs( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );src:源图像;dst:目标图像;scale:转化前乘的系数;shift转化前加的系数。这样新建一个无符号图像再转换就可以实现了。

IplImage *sobel8u=cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);

再在显示图像前加上cvConvertScaleAbs(sobel,sobel8u,1,0);这样就可以看到cvSobel的效果了。可以看X方向或Y方向求导是什么效果。

为了方便大家,我把改好后的程序也放上来了。

#include <cv.h>

#include <highgui.h>

void main()

{

IplImage *frame,*gray,*sobel;

frame=cvLoadImage("e:/p1.jpg");//加载图像

gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间

sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);

cvNamedWindow("frame");

cvNamedWindow("gray");

cvNamedWindow("sobel");

cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度

cvSobel(gray,sobel,1,0,3);

IplImage *sobel8u=cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);

cvConvertScaleAbs(sobel,sobel8u,1,0);

cvShowImage("frame",frame);//显示图像

cvShowImage("gray",gray);

cvShowImage("sobel",sobel8u);

cvWaitKey(0);//等待

cvReleaseImage(&frame);//释放空间(对视频处理很重要,不释放会造成内存泄露)

cvReleaseImage(&gray);

cvReleaseImage(&sobel);

cvDestroyWindow("frame");

cvDestroyWindow("gray");

cvDestroyWindow("sobel");

}

相关文章:

python全栈开发笔记---------函数

一 数学定义的函数与python中的函数 初中数学函数定义&#xff1a;一般的&#xff0c;在一个变化过程中&#xff0c;如果有两个变量x和y&#xff0c;并且对于x的每一个确定的值&#xff0c;y都有唯一确定的值与其对应&#xff0c;那么我们就把x称为自变量&#xff0c;把y称为因…

OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)

转自&#xff1a;http://apps.hi.baidu.com/share/detail/30893646 在做项目的过程中&#xff0c;使用OpenCV经常会出现一些内存泄露问题&#xff0c;自己编写的程序出现问题还情有可原&#xff0c;但若是库函数调用和使用时出现&#xff0c;却很令我恼火。花了好长时间和实践的…

41款实用工具,数据获取、清洗、建模、可视化都有了

诸如结构式访谈、非结构式访谈、开放式问卷调查、封闭式问卷调查、记录评论和观察等技术统称为事实调查方法。这种事实调查方法和其他数据获取方法可以采取自动化&#xff0c;而不必使用人工方法。使用具有专用软件的物理设备&#xff08;如终端、传感器和扫描仪等&#xff09;…

OpenCV中的内存泄漏检测

转自&#xff1a;http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏很难检测,但是其导致的结果却是灾难性的. 这里讲一下opencv中内存泄漏检测的一些技巧.OpenCV中关于内存管理主要涉及到以下3个函…

一文全面了解基于内容的推荐算法

作者丨gongyouliu来源 | 转载自大数据与人工智能&#xff08;ID:ai-big-data&#xff09;这篇文章我们主要关注的是基于内容的推荐算法&#xff0c;它也是非常通用的一类推荐算法&#xff0c;在工业界有大量的应用案例。本文会从什么是基于内容的推荐算法、算法基本原理、应用场…

[Nginx优化]分享nginx配置文件及优化说明

1、系统及内核方面 根据服务器用途&#xff0c;建议系统最小化安装或针对web服务器进行系统内核重新编译&#xff1b;在内核参数的一些优化&#xff0c;如下&#xff1a; # Add net.ipv4.tcp_max_syn_backlog 65536 #表示SYN队列的长度 net.core.netdev_max_backlog 3…

laravel项目composer安装

1.下载 Composer &#xff08;https://pkg.phpcomposer.com/#how-to-install-composer&#xff09; 安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php -v 查看是否正确输出版本号。 打开命令行并依次执行下列命令安装最新版本的 Composer&#xff1a; 复制php -r…

淘宝装修:第一日 —— 图片轮播

先添加一个自定义内容区&#xff0c;进入源码编辑&#xff0c;如下图所示&#xff1a; 添加源码如下&#xff1a; <TABLE border0 cellSpacing0 cellPadding0 width773 height220> <TBODY> <TR> <TD width773> <P> <MARQUEE height220 behavi…

强化学习大规模应用还远吗?Youtube推荐已强势上线

来源 | 转载自深度传送门导读&#xff1a;本文将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变化。本文主要根据几大顶会2019的最新论文&#xff0c;总结一下深度强化学习给推荐系统以及CTR预估工业界带来的最新进展。 凡是Google出品&#xff0c…

layui select 与 vue 的结合使用

2019独角兽企业重金招聘Python工程师标准>>> 1. 创建一个select元素 <form class"layui-form layui-form-pane all-account-filter-form"><div class"layui-form-item"><div class"layui-inline"><label class&…

OpenCV 2.2.0 CvvImage的使用

转自&#xff1a;http://blog.csdn.net/raocong2010/archive/2011/01/17/6146158.aspx# 前几日&#xff0c;OpenCV 2.2.0版本出现了...但是...以前版本的CvvImage类不见了...为了能够继续使用这个类&#xff0c;下面把这个类的源代码贴出来&#xff0c;使用的时候将该代码加入到…

c/c++标准预定义宏

转自&#xff1a;http://www.eefocus.com/andysun001/blog/10-06/192018_008b3.html 一、标准预定义宏The standard predefined macros are specified by the relevant language standards, so they are available with all compilers that implement those standards. Older c…

阿里AI攻克心血管识别技术,冠脉中心线提取论文入选国际医学影像会议

阿里在医疗AI领域取得新进展&#xff0c;继创下肺结节检测、肝结节诊断技术的重大突破后&#xff0c;又攻克了难度系数更高的心血管识别技术。 近日&#xff0c;阿里达摩院机器智能实验室有关冠状动脉中心线提取的论文已被国际顶级医学影像会议MICCAI 2019提前接收。 阿里AI论…

自由程序员在国外

可靠的做法是&#xff0c;在一些像oDesk这样的网站上找一些临时开发任务&#xff0c;在Linked In网站上提交一份个人简历。这样将有助于你在出行后尽早的找到可干的项目&#xff0c;而不必到时大减价来抢其他程序员的活儿(或消减自己的预算)。 从来不缺乏你可以捐赠代码的开源项…

关于spring aop Advisor排序问题

关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序&#xff0c;这时候可以用注解org.springframework.core.annotation.Order或者实现org.springframework.core.Ordered接口。 示例代码&#xff1a; import org.aspectj.lang.ProceedingJoinPoint; im…

NLP重大突破?一文读懂XLNet“屠榜”背后的原理

作者 | 李理 原文链接&#xff1a;https://fancyerii.github.io/2019/06/30/xlnet-theory/ 本文介绍XLNet的基本原理&#xff0c;读者阅读前需要了解BERT等相关模型&#xff0c;不熟悉的读者建议学习BERT课程。 语言模型和BERT各自的优缺点 在论文里作者使用了一些术语&#…

CSS3支持IE6, 7, and 8的边框属性

我们都知道&#xff0c;IE 6,7不支持新增加的CSS3属性&#xff0c;甚至与IE8是CSS3还没有完全准备好。你知道吗&#xff0c;今天给大家分享一个脚本工具&#xff0c;可以帮助您启用CSS3的支持IE浏览器&#xff08;IE6&#xff09;与新的CSS3属性&#xff0c;包括&#xff1a;bo…

解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题

转自&#xff1a;http://blog.csdn.net/code_robot/archive/2010/06/23/5688867.aspx 有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法&#xff1a;1、使用C语言的函数设置为中文运行环境setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函…

NLP文本标注工具与平台(数据标注公司)

最近在做NLP相关项目&#xff0c;包括句法分析、情感分析等&#xff0c;有大量数据需要标注。我评估了几个文本标注工具&#xff0c;也接触了几家数据标注公司和平台&#xff0c;总结如下&#xff0c;供各位参考。 文本标注平台&#xff08;标注外包公司&#xff09; 数据标注公…

一文读懂基于神经网络的图片风格转移

作者 | moliam转载自 CSDN 博客前言将A图片的风格转移到B图片上&#xff0c;指的是将A图片的抽象艺术风格&#xff08;如线条、色彩等等&#xff09;和B图片的内容框架合成为一幅图。自然地&#xff0c;A图片称为风格图&#xff0c;而B图片就称为内容图。就像这样&#xff1a;左…

【物联网中间件平台-01】真正面向物联网的组态软件 YFIOs和YFHMI的前生今世

1前言 从2001年进入工控领域以来&#xff0c;前后7年多的时间开发了诸如二型计量监控系统、焦炉四大机车自动化系统、烧结配水监控系统、隧道广告影像系统、通用组态软件、嵌入式系统组态软件&#xff08;基于WINCE系统&#xff09;、LED视频影像系统和ICU病室输液管理等系统。…

OpenCV常遇问题解决方法汇总

1、cvLoad的使用和释放&#xff1a; CvMat *mat (CvMat*)cvLoad("a.xml"); cvRelease((void**)&mat); 2、cvCreateMatHeader的使用和释放&#xff1a; CvMat *mat cvCreateMatHeader(4, 2, CV_64FC1); cvReleaseMatHeader(&mat); 在OpenCV2.1及OpenCV2.2中…

分享我如何在7年时间里成长为阿里Java架构师(附学习路线图)

2019独角兽企业重金招聘Python工程师标准>>> 如何更高效的学习&#xff1f; 1.架构师应不应该写代码 总的来说&#xff0c;架构师和程序员在某些方面上有点像产品经理和用户的关系&#xff0c;大部分程序员并不会主动告诉你他们想要什么、哪里需要优化&#xff0c;甚…

github 与git 使用 及配置

git 是网上很流行的版本控制工具 ,尝试 熟悉并使用 它&#xff08;也有windows版本&#xff0c;这里介绍mac的&#xff09; 额&#xff0c;再操作前 先看看这个 并跟着做做 http://www.uml.org.cn/pzgl/201204285.asp 1&#xff0c;到github官网 申请账号 2&#xff0c;…

如何发布ActiveX 控件

转自&#xff1a;http://blog.csdn.net/zougangx/archive/2008/07/30/2738147.aspx [背景] 做过ActiveX控件的朋友都知道&#xff0c;要想把自己做的ActiveX控件功能放在自己的网页上使用&#xff0c;那么用户在客户端就必须进行本地的注册&#xff0c;也就是说用户得首先要把该…

200行代码实现一个滑动验证码

作者 | 崔庆才 转载自进击的Coder&#xff08;ID: FightingCoder&#xff09;做网络爬虫的同学肯定见过各种各样的验证码&#xff0c;比较高级的有滑动、点选等样式&#xff0c;看起来好像挺复杂的&#xff0c;但实际上它们的核心原理还是还是很清晰的&#xff0c;本文章大致说…

Envoy源码分析之Dispatcher

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; Dispatcher 在Envoy的代码中Dispatcher是随处可见的&#xff0c;可以说在Envoy中有着举足轻重的地位&#xff0c;一个Dispatcher就是一个EventLoop&#xff0c;其承担了任务队列、网络事件处理、定时器…

Windows 8 快捷键大全

为什么80%的码农都做不了架构师&#xff1f;>>> win8快捷键大全&#xff1a; Windows 键 X &#xff1a;Windows快捷菜单 Windows 键 C &#xff1a;显示个性分类和时钟 Windows 键 I &#xff1a;打开“设置”个性分类 Windows 键 K &#xff1a;打开“设备”…

Activex、OLE、COM、OCX、DLL之间区别、联系

转自&#xff1a;http://baike.baidu.com/view/393671.htm 概述 .ocx是ocx控件的扩展名,与.exe .dll同属于PE文件。下面说说什么是ocx控件! OCX 是对象类别扩充组件。 如果你用过Visual Basic或者Delphi一类的可视化编程工具&#xff0c;那么对控件这个概念一定不会陌生&#…

不写一行代码,也能玩转Kaggle竞赛?

整理 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】AI科技大本营会给大家分享一些 Kaggle 上的资源&#xff0c;如 Kaggle 开放的数据集&#xff0c;也会分享一些好的竞赛方案或有意义的竞赛经验&#xff0c;帮助大家成长。今天&#xf…