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);