随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

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);
复制代码

 

posted on   飘杨......  阅读(312)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .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
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示