OpenCV 使用自定义线性滤波比较Robert、Sobel、拉普拉斯算子
一、概述
案例:利用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.会使用拉普拉斯算子计算图像梯度
常用的算子如下图所示:
二、代码示例
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.比较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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2020-02-16 Java代理模式(静态代理&动态代理)
2020-02-16 Java对泛型进行反射实战
2020-02-16 Java反射技术工具类
2020-02-16 Java反射例子汇总 Class Constructor Method Filed