关闭

opencv cvSobel()以及Scharr滤波器

标签: opencv图像处理
2026人阅读 评论(1) 收藏 举报
分类:
/* Calculates an image derivative using generalized Sobel
   (aperture_size = 1,3,5,7) or Scharr (aperture_size = -1) operator.
   Scharr can be used only for the first dx or dy derivative */
CVAPI(void) cvSobel( const CvArr* src, CvArr* dst,
                    int xorder, int yorder,
                    int aperture_size CV_DEFAULT(3));


src和dst分别是输入图像和输出图像

xorder和yorder是求导的阶数。通常是0,1,最多2。值为0表明在这个方向上没有求导

aperture_size参数是方形滤波器的宽(或高)并且应该是奇数,1,3,5,7

如果源图像src是8位的,为避免溢出,目标图像的深度必须是IPL_DEPTH_16S


//cvSobel
void sobel(void)
{
	IplImage *src=cvLoadImage("lena.jpg");
	IplImage *dstx_s=cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
	IplImage *dsty_s=cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
	IplImage *dstx_u=cvCreateImage(cvGetSize(src), IPL_DEPTH_8S, src->nChannels);
	IplImage *dsty_u=cvCreateImage(cvGetSize(src), IPL_DEPTH_8S, src->nChannels);
	if (src == NULL || dstx_s == NULL || dsty_s == NULL || dstx_u == NULL || dsty_u == NULL)
		exit(0);

	cvSobel(src, dstx_s, 1, 0, 3);
	cvSobel(src, dsty_s, 0, 1, 3);

	cvConvertScale(dstx_s, dstx_u, 1.0, 0);
	cvConvertScale(dsty_s, dsty_u, 1.0, 0);

	cvNamedWindow("src");
	cvNamedWindow("dstx");
	cvNamedWindow("dsty");
	cvShowImage("src", src);
	cvShowImage("dstx", dstx_u);
	cvShowImage("dsty", dsty_u);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvReleaseImage(&dstx_s);
	cvReleaseImage(&dsty_s);
	cvReleaseImage(&dstx_u);
	cvReleaseImage(&dsty_u);
	cvDestroyAllWindows();
}

##################################################

Scharr滤波器

对于小一点的核(3x3)而言,使用Sobel算子近似计算导数的缺点是精度比较低

Scbarr滤波器同sobel滤波器一样快,但是准确率更高,故当你利用3x3滤波器实现图像度量的时候应该使用Scharr滤波器


Scharr滤波器的滤波系数如下:

-3

0

     3      

   -10   

   0   

10

-3

0

3


     -3   

  -10  

    3    

0

0

0

-3

10

3


//Scharr
void scharr(void)
{
	IplImage *src=cvLoadImage("lena.jpg");
	IplImage *dstx_s=cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
	IplImage *dsty_s=cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
	IplImage *dstx_u=cvCreateImage(cvGetSize(src), IPL_DEPTH_8S, src->nChannels);
	IplImage *dsty_u=cvCreateImage(cvGetSize(src), IPL_DEPTH_8S, src->nChannels);
	if (src == NULL || dstx_s == NULL || dsty_s == NULL || dstx_u == NULL || dsty_u == NULL)
		exit(0);

	cvSobel(src, dstx_s, 1, 0, -1);//aperture_size=-1 表示Scharr滤波器
	cvSobel(src, dsty_s, 0, 1, -1);

	cvConvertScale(dstx_s, dstx_u, 1.0, 0);
	cvConvertScale(dsty_s, dsty_u, 1.0, 0);

	cvNamedWindow("src");
	cvNamedWindow("dstx");
	cvNamedWindow("dsty");
	cvShowImage("src", src);
	cvShowImage("dstx", dstx_u);
	cvShowImage("dsty", dsty_u);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvReleaseImage(&dstx_s);
	cvReleaseImage(&dsty_s);
	cvReleaseImage(&dstx_u);
	cvReleaseImage(&dsty_u);
	cvDestroyAllWindows();
}




###################################################################



针对评论里的问题,我查了一下《learning OpenCV》,因为cvSobel()中使用的X和Y滤波器完全是沿x轴和y轴排列。所以当试图估计图像的方向导数(directional derivative,即,使用y/x滤波器响应的反正切得到的图像梯度的方向)时,难度就会出现。(这段话是学习opencv上看的,我也弄不大懂哈,不过又不理解的可以在《学习OpenCV》上在看一看,里面讲的更详细 具体位置在P171)
0
0
查看评论

opencv的scharr滤波器

 int main(){  Mat src = imread("test.jpg");//载入原始图     Mat src1, src2, src3, src4,dst;  namedWindow("效果图...
  • cqltbe131421
  • cqltbe131421
  • 2017-03-08 11:16
  • 206

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘检测)通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘。Sobel 滤波器Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向。 关于这种滤波器的理论介绍可以参考:https://en.wikipedia.o...
  • liyuanbhu
  • liyuanbhu
  • 2015-09-25 14:13
  • 6363

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器。文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码。在介绍四块知识点的时候分别一个,以及最后的综合示例中的一个。 依然是是放出一些程序运行截图吧: 效...
  • zhmxy555
  • zhmxy555
  • 2014-05-11 22:14
  • 97775

利用OpenCV的库函数Sobel和Scharr作图像的边缘检测

利用OpenCV的库函数Sobel和Scharr作图像的边缘检测
  • wenhao_ir
  • wenhao_ir
  • 2016-06-24 15:06
  • 2091

Scharr滤波器

这里值得一提的是:Scharr滤波器 CV_SCHARR (值为-1) Scharr滤波器捅soble滤波器一样快,但是准确率更好,所以当你利用3*3滤波器实现图像度量的时候应该使用Scharr滤波器。Scharr滤波器的滤波系数 -3 0 3 -10 0 10 ...
  • yeqiu712
  • yeqiu712
  • 2011-05-04 13:51
  • 5409

scharr滤波器

使用Scharr滤波器运算符计算x或y方向的图像差分。其实它的参数变量和Sobel基本上是一样的,除了没有ksize核的大小。 C++: void Scharr( InputArray src, //源图 OutputArray dst, //目标图 int ddepth,//图像深度 in...
  • qq_18343569
  • qq_18343569
  • 2015-08-21 15:58
  • 1565

OpenCV 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

http://blog.csdn.net/poem_qianmo/article/details/25560901 //-----------------------------------【程序说明】---------------------------------------------- //...
  • Eroslol
  • Eroslol
  • 2016-09-17 10:29
  • 542

边缘检测综合-Canny算子,Sobel算子,Laplace算子,Scharr滤波器

边缘检测综合-Canny算子,Sobel算子,Laplace算子,Scharr滤波器
  • gdut2015go
  • gdut2015go
  • 2015-10-28 09:56
  • 703

边缘检测滤波器

图像中灰度变化较大的非连续像素可以看做是边缘,边缘是最为重要的图像特征之一,在目标检测、追踪、识别中都必不可少的使用到了边缘,人类视觉系统也对边缘信息非常敏感。如果在图像中检测到边缘并对其进行定位,那么对后续的算法将起到至关重要的作用。灰度的突然变化会在一阶导数中引起波峰或者波谷,或者在二阶导数中等...
  • yangstone2006
  • yangstone2006
  • 2017-09-11 23:45
  • 142

opencv3中scharr滤波器

#include #include #include using namespace std; using namespace cv; int g_nWay = 0, g_nDirection = 0, g_nValue = 0; int main() { Mat srcImage = im...
  • qq_23880193
  • qq_23880193
  • 2015-10-11 00:00
  • 474
    个人资料
    • 访问:832823次
    • 积分:10162
    • 等级:
    • 排名:第2017名
    • 原创:311篇
    • 转载:40篇
    • 译文:10篇
    • 评论:92条
    博客专栏
    文章分类
    最新评论