sobel算子:
I为原图像
1.水平变化
将 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为:
2.垂直变化:
将:math:I 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为
3.结果:
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, delta 和 BORDER_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;
}