Opencv中cvSobel函数使用
来源:互联网 发布:windows过期如何激活 编辑:程序博客网 时间:2024/04/20 04:21
Sobel算子为边沿检测中常用的算子之一。
以下给出Opencv手册中的说明:
Sobel
使用扩展 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, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况, 使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:
- 对 x-方向 以及转置矩阵对 y-方向。
函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:
由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。
核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即象素的深度)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 转换为 8 位的。除了 8-比特 图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。
注意:由于sobel算子求出来的值有可能出现负值,所以当图像为8U是,dst必须为16S,而不能为16U。
错误的理解:
cvSobel( src, dst, 1, 1, 3 );等效于 cvSobel( src, dst1, 0, 1, 3 ); cvSobel( src, dst2, 1, 0, 3 ); cvAdd( dst1,dst2,dst);解释:由可以知道,cvSobel( src, dst, 1, 1, 3 );为,效果如图:而cvSobel( src, dst1, 0, 1, 3 ); cvSobel( src, dst2, 1, 0, 3 );cvAdd( dst1,dst2,dst);则为。效果如图X方向:Y方向:X方向绝对值 + Y方向绝对值 结果:不取绝对值直接进行 X方向 + Y方向 结果如下:结论:正确的使用Sobel进行边缘检测的方法为:伪代码如下:cvSobel(Img_Src,Img_16S_SobelX,0,1,3);cvSobel(Img_Src,Img_16S_SobelY,0,1,3);
if(abs(Img_16S_SobelX) + abs(Img_16S_SobelY)) > 255
Img_Dst = 255;
else
Img_Dst = abs(Img_16S_SobelX) + abs(Img_16S_SobelY);
- Opencv中cvSobel函数使用
- Opencv中使用cvSobel算子一点注意
- 转载]Opencv中使用cvSobel算子一点注意
- opencv cvSobel()以及Scharr滤波器
- Opencv中cvFindContours函数使用
- OpenCV中resize()函数使用
- OpenCV中函数imwrite使用
- opencv 学习之 Sobel算子及cvSobel
- 关于使用cvSobel 和 cvCanny 内存问题
- opencv中关于cvNorm函数的使用
- OpenCV中函数calcCovarMatrix的使用
- OpenCV中findContours函数的使用
- opencv中detectMultiScale函数的使用
- OpenCV中findFundamentalMat函数使用的模型
- OpenCV中函数cvCreateMat的使用详解
- opencv中关于cvNorm函数的使用
- OpenCV中imread函数的使用
- opencv中copyTo函数的使用
- 单片机设计、嵌入式系统、物联网三位一体
- Spring+Struts2+Hibernate整合开发讲解
- C#命名空间
- 什么是ACPI,什么是APIC
- Java23种设计模式
- Opencv中cvSobel函数使用
- 网站导航——网站地图和TreeView的使用
- epoll讲解--转自”知乎"
- memaslap的安装方法
- 线程池
- 给按钮加上小盾牌
- fedora10安装libpcap
- 安装gcc 4.8以支持C++ 0x11
- 【OpenCV】访问图像中每个像素的值