OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
- 差分在边缘检測的角色
- Sobel算子
- OpenCV sobel函数
- OpenCV Scharr函数
- prewitt算子
- Roberts算子
- 是离散差分算子.
- 结合了高斯滤波.
是原始图像:
我们计算水平和竖直方向的梯度:
水平方向: Gx是我们Kernel size为3的水平sober算子,与I作卷积
竖直方向:Gy是我们Kernel size为3的水平sober算子,与I作卷积
对每一个点,再计算以下的值,得到方向无关梯度
有时候也能够这样计算:
-
C++: void Sobel(InputArray src,
OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, intborderType=BORDER_DEFAULT )
-
- src – 输入.
- dst – 输出
- ddepth –
- output image depth; the following combinations of src.depth() and ddepth are
supported: -
- src.depth() = CV_8U, ddepth =
-1/CV_16S/CV_32F/CV_64F - src.depth() = CV_16U/CV_16S, ddepth =
-1/CV_32F/CV_64F - src.depth() = CV_32F, ddepth =
-1/CV_32F/CV_64F - src.depth() = CV_64F, ddepth =
-1/CV_64F
- src.depth() = CV_8U, ddepth =
when ddepth=-1, the destination image will have the same depth as the source; in the case of
8-bit input images it will result in truncated derivatives.这里要特别注意了,我们的depth不能为-1,由于我们的输入是uchar8类型的,而算出来的值可能>255也可能 <0 ,都会被截断,CV_16S是推荐的 - output image depth; the following combinations of src.depth() and ddepth are
- xorder – order of the derivative x.
- yorder – order of the derivative y.
- ksize – sobel核大小,必须为1, 3, 5, or 7.
- scale – 扩大系数
- delta – 附加系数
- borderType – 边界类型
计算的时候,利用了可分离的滤波进行加速(Ksize=1的时候,用了1*3和 3*1的算子,无法加速)
当Ksize = 3,Sobel採用的算子会不准确,因此还有特殊的值ksize = CV_SCHARR(-1) 相当于使用 Scharr
filter 比 Sobel算子能获得更准确的结果.
Scharr 算子例如以下
-
C++: void Scharr(InputArray src,
OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
-
- src – input image.
- dst – output image of the same size and the same number of channels as src.
- ddepth – output image depth (see Sobel() for
the list of supported combination of src.depth() and ddepth). - dx – order of the derivative x.
- dy – order of the derivative y.
- scale – optional scale factor for the computed derivative values; by default, no scaling is applied (see getDerivKernels() for
details). - delta – optional delta value that is added to the results prior to storing them in dst.
- borderType – pixel extrapolation method (see borderInterpolate() for
details).
The function computes the first x- or y- spatial image derivative using the Scharr operator. The call
is equivalent to
用法一样~~
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h> using namespace cv; int main( int, char** argv )
{ Mat src, src_gray;
Mat grad;
const char* window_name = "Sobel Demo - Simple Edge Detector"; //由于以Sobel方式求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是 CV_8U,也就是8位无符号数,所以Sobel建立的图像位数不够,要16位有符号的,也就是 CV_16S
int ddepth = CV_16S;
src = imread( argv[1] );
if( !src.data )
{ return -1; } GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor( src, src_gray, CV_RGB2GRAY ); namedWindow( window_name, CV_WINDOW_AUTOSIZE ); // Generate grad_x and grad_y
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y; // Gradient X
//Scharr( src_gray, grad_x, ddepth, 1, 0);
Sobel( src_gray, grad_x, ddepth, 1, 0, 3);
convertScaleAbs( grad_x, abs_grad_x ); // Gradient Y
//Scharr( src_gray, grad_y, ddepth, 0, 1);
Sobel( src_gray, grad_y, ddepth, 0, 1, 3);
convertScaleAbs( grad_y, abs_grad_y ); // Total Gradient (approximate)
addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); imshow( window_name, grad ); waitKey(0); return 0;
}
效果图:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv; int main( int, char** argv )
{
Mat src,gray,Kernelx,Kernely; src = imread( argv[1] );
cvtColor( src, gray, CV_RGB2GRAY );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1); Kernelx = (Mat_<double>(3,3) << 1, 1, 1, 0, 0, 0, -1, -1, -1);
Kernely = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1); Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, grad; filter2D(gray, grad_x, CV_16S , Kernelx, Point(-1,-1));
filter2D(gray, grad_y, CV_16S , Kernely, Point(-1,-1));
convertScaleAbs( grad_x, abs_grad_x );
convertScaleAbs( grad_y, abs_grad_y ); addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
imshow("dstImage", grad); waitKey();
return 0;
}
效果图:
OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)的更多相关文章
- OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)
收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...
- openCV2马拉松第19圈——Harris角点检測(自己实现)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- 图像边缘检測--OpenCV之cvCanny函数
图像边缘检測--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...
- OpenCV图像处理篇之边缘检測算子
3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...
- Canny边缘检測算法原理及其VC实现具体解释(一)
图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般能够看作是一个阶跃,既从一个灰度值在非常小的缓冲区域内急剧变化到还有一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图 ...
- Python图像处理(8):边缘检測
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 此前已经得到了单个区域植株图像,接下来似乎应该尝试对这些区域进行分类识别.通过外形和叶脉进行植物种 ...
- 图像处理之Canny边缘检測
图像处理之Canny 边缘检測 一:历史 Canny边缘检測算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘 检測算法,同一时候Canny本人对计算图像边缘提取学科的发展 ...
随机推荐
- C#中通过位运算实现多个状态的判断
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Weblogic的Admin server进程将CPU消耗尽问题解决
1.serverCPU被耗尽,持续100% 以下附nmon图 2.两个weblogicadmin server进程将CPU耗尽 问题:24298进程,占用百分之四千多的CPU资源 23529进程,占用 ...
- VC皮肤库SkinSharp 1.0.6.6的使用
SkinSharp又称Skin#,是Windows环境下一款强大的换肤组件. SkinSharp作为换肤控件,仅仅须要在您的程序中加入一行代码,就能让您的界面焕然一新,并拥有多种主题风格和色调的动态切 ...
- Oracle 中的Pivoting Insert用法
1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) ...
- EffectiveC#2--为你的常量选择readonly而不是const
1.对于常量,C#里有两个不同的版本: 编译时常量--效率相比更高些,但可维护性不好,保留的目的是为了性能.const关键字申明 public const int _Millennium = 2000 ...
- 前端--关于css选择器
css选择器就好像表达式一样,返回一组或者一个html元素,后面的样式声明块应用到返回的元素上.所以可以把css选择器理解为某个或者某一类html元素的抽象的写法. 在讲具体的各种选择器之前要提一下选 ...
- mysql事件调度器
#查看mysql事件调度器是否开启 SHOW VARIABLES WHERE Variable_name = 'event_scheduler'; #开启mysql事件调度器功能 SET GLOBAL ...
- OD调试3--reverseMe
OD调试3:reverseMe.exe(reverse就是逆向的意思) 运行效果图: 1关于寄存器 寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用.今天的程序中涉及到九个寄存 ...
- SharePoint solution and feature management with PowerShell
/* Author: Jiangong SUN */ Hello, I want to introduce SharePoint solution and feature management usi ...
- BeanUtils包的学习
BeanUtils支持八种基本数据类型(int double short char byte float boolean long)的反射,对于日期需要提前注册DateLocalConvert获取转换 ...