opencv 学习之sobel算子学习

sobel算子:

I为原图像

1.水平变化

I 与一个奇数大小的内核 G_{x} 进行卷积。比如,当内核大小为3时, G_{x} 的计算结果为:

G_{x} = \begin{bmatrix}-1 & 0 & +1  \\-2 & 0 & +2  \\-1 & 0 & +1\end{bmatrix} * I

2.垂直变化:

将:math:I 与一个奇数大小的内核 G_{y} 进行卷积。比如,当内核大小为3时, G_{y} 的计算结果为

  1. G_{y} = \begin{bmatrix}-1 & -2 & -1  \\0 & 0 & 0  \\+1 & +2 & +1\end{bmatrix} * I

3.结果:

G = |G_{x}| + |G_{y}|

4.openCv提供的函数:

Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );

该函数接受了以下参数:

  • src_gray: 在本例中为输入图像,元素类型 CV_8U
  • grad_x/grad_y: 输出图像.
  • ddepth: 输出图像的深度,设定为 CV_16S 避免外溢。
  • x_order: x 方向求导的阶数。
  • y_order: y 方向求导的阶数。
  • scale, deltaBORDER_DEFAULT: 使用默认值
我的源代码:

#include <cv.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/highgui/highgui.hpp> 
using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
	Mat image=imread("./1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	Mat grad_x;
	Mat grad_y;
	Mat sobel;
	//计算sobel滤波器的模
	Sobel(image,grad_x,CV_16S,1,0);
	Sobel(image,grad_y,CV_16S,0,1);
	//计算L1的模
	sobel=abs(grad_x)+abs(grad_y);
	//
	Mat sobel_image;
	//cvConvertScaleAbs函数是OpenCV中的函数,使用线性变换转换输入数组元素成8位无符号整型。
	convertScaleAbs(sobel,sobel_image);
	imshow("sobel",sobel_image);
	waitKey(0);
 	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值