该函数如下:
使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分
void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
函数 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 把运算结果(dst)转换为 8 位的。除了8-位图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。
例题实现如下:#include "StdAfx.h" #include "cv.h" #include "highgui.h" #include "stdio.h" #include "stdlib.h" int main(int argc, char ** argv) { IplImage * src, *dst ; src = cvLoadImage("test256.bmp"); dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,3) ; cvNamedWindow("src",0) ; cvShowImage("src",src); cvNamedWindow("sobel",0) ; cvSobel(src,dst,0,1,5); cvShowImage("sobel",dst); cvWaitKey(0) ; cvReleaseImage(&src) ; cvReleaseImage(&dst); return 0; }
参考文献:
1.学习OpenCV,于仕祺,刘瑞祯,清华大学出版社,pp.169-170.
2.http://www.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86
3.http://blog.csdn.net/cartoonface/article/details/6011127