天天看點

OpenCV 使用自定義線性濾波比較Robert、Sobel、拉普拉斯算子

作者:音視訊開發老舅

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.會使用拉普拉斯算子計算圖像梯度

  常用的算子如下圖所示:

OpenCV 使用自定義線性濾波比較Robert、Sobel、拉普拉斯算子

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);           
OpenCV 使用自定義線性濾波比較Robert、Sobel、拉普拉斯算子

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);           
OpenCV 使用自定義線性濾波比較Robert、Sobel、拉普拉斯算子

繼續閱讀