1、概述
案例:利用OpenCV提供的filter2D自定义线性滤波对Robert、Sobel、拉普拉斯算子进行比较
filter2D方法filter2D(
Mat src, //输入图像
Mat dst, // 模糊图像
int depth, // 图像深度32/8
Mat kernel, // 卷积核/模板
Point anchor, // 锚点位置
double delta // 计算出来的像素+delta
)
ps:
1.会使用robert计算x、y方向及xy合并后的梯度
2.会使用sobel计算x、y方向及xy合并后的图像梯度
3.会使用拉普拉斯算子计算图像梯度
常用的算子如下图所示:
2、代码示例
2.1、计算robert的x、y算子的梯度图像,计算sobel的x、y算子的梯度图像 ,计算拉普拉斯算子的梯度图像
Mat src = imread(filePath);//原图
Mat dst;
imshow("src",src);
Mat kernel_robert_x = (Mat_<int>(2,2) << 1,0,0,-1);//robert x方向算子
filter2D(src,dst,-1,kernel_robert_x,Point(-1,-1),0);//自定义线性滤波
imshow("kernel_robert_x",dst);
Mat kernel_robert_y = (Mat_<int>(2,2) << 0,1,-1,0);//robert y方向上算子
filter2D(src,dst,-1,kernel_robert_y,Point(-1,-1),0);//自定义线性滤波
imshow("kernel_robert_y",dst);
Mat kernel_sobel_x = (Mat_<int>(3,3) << -1,0,1,-2,0,2,-1,0,1);//sobel x方向上算子
filter2D(src,dst,-1,kernel_sobel_x,Point(-1,-1),0);//自定义线性滤波
imshow("kernel_sobel_x",dst);
Mat kernel_sobel_y = (Mat_<int>(3,3) << -1,-2,-1,0,0,0,1,2,1);//sobel y方向上算子
filter2D(src,dst,-1,kernel_sobel_y,Point(-1,-1),0);//自定义线性滤波
imshow("kernel_sobel_y",dst);
Mat kernel = (Mat_<int>(3,3) << 0,-1,0,-1,4,-1,0,-1,0);//拉普拉斯算子
filter2D(src,dst,-1,kernel,Point(-1,-1),0);//自定义线性滤波
imshow("kernel",dst);
2.2、比较rebort的x、y及xy合并后的梯度图像,比较sobel的x、y及xy合并后的梯度图像
Mat src = imread(filePath);
Mat dst_robert_x;
Mat dst_robert_y;
imshow("src",src);
Mat kernel_robert_x = (Mat_<int>(2,2) << 1,0,0,-1);//robert x方向算子
filter2D(src,dst_robert_x,-1,kernel_robert_x,Point(-1,-1),0);//自定义线性滤波
imshow("dst_robert_x",dst_robert_x);
Mat kernel_robert_y = (Mat_<int>(2,2) << 0,1,-1,0);//robert y方向上算子
filter2D(src,dst_robert_y,-1,kernel_robert_y,Point(-1,-1),0);//自定义线性滤波
imshow("dst_robert_y",dst_robert_y);
//合并
Mat dst_robert_result;
addWeighted(dst_robert_x,0.5,dst_robert_y,0.5,1,dst_robert_result);//对图像进行平均权重相加得到一个完整的用robert计算的梯度图像
imshow("dst_robert_result",dst_robert_result);
Mat dst_sobel_x;
Mat dst_sobel_y;
Mat kernel_sobel_x = (Mat_<int>(3,3) << -1,0,1,-2,0,2,-1,0,1);//sobel x方向上算子
filter2D(src,dst_sobel_x,-1,kernel_sobel_x,Point(-1,-1),0);//自定义线性滤波
imshow("dst_sobel_x",dst_sobel_x);
Mat kernel_sobel_y = (Mat_<int>(3,3) << -1,-2,-1,0,0,0,1,2,1);//sobel y方向上算子
filter2D(src,dst_sobel_y,-1,kernel_sobel_y,Point(-1,-1),0);//自定义线性滤波
imshow("dst_sobel_y",dst_sobel_y);
//合并
Mat dst_sobel_result;
addWeighted(dst_sobel_x,0.5,dst_sobel_y,0.5,1,dst_sobel_result);//对图像进行平均权重相加得到一个用sobel算子计算的梯度图像
imshow("dst_sobel_result",dst_sobel_result);
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓