本章内容
1. Robert算子
2. Sobel算子
3. 拉普拉斯算子
算法原理
1. Robert算子
输出结果:
2.sobel算子
输出结果
3. 拉普拉斯算子
输出结果"
代码
#include <ostream>
#include <opencv.hpp>int main(int argc, char *argv[])
{
/*
本章内容:
1. Robert算子
2. Sobel算子
3. 拉普拉斯算子
*/
cv::String fileName = "/home/wang/dev/Image/cdut.jpeg";
cv::Mat src = cv::imread(fileName);
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
// 1. Robert算子
cv::Mat gray;
cv::Mat dstRoX;
cv::Mat dstRoY;
cv::Mat dstRoM;
cv::Mat kernelRoX = (cv::Mat_<float>(2,2) << 1,0,0,-1);
cv::Mat kernelRoY = (cv::Mat_<float>(2,2) << 0,1,-1,0);
cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
cv::filter2D(gray,dstRoX,-1,kernelRoX);
cv::filter2D(gray,dstRoY,-1,kernelRoY);
cv::imshow("gray",gray);
cv::imshow("Robert X方向算子", dstRoX);
cv::imshow("Robert Y方向算子", dstRoY);
dstRoX = cv::abs(dstRoX);
dstRoY = cv::abs(dstRoY);
cv::add(dstRoX,dstRoY,dstRoM);
cv::imshow("Robert算子梯度", dstRoM);// 2. sobel 算子
cv::Mat dstSoX;
cv::Mat dstSoY;
cv::Mat dstSoM;
cv::Mat kernelSoX = (cv::Mat_<float>(3,3) << -1,0,1,-2,0,2,-1,0,1);
cv::Mat kernelSoY = (cv::Mat_<float>(3,3) << -1,-2,-1,0,0,0,1,2,1);
cv::filter2D(gray,dstSoX,-1,kernelSoX);
cv::filter2D(gray,dstSoY,-1,kernelSoY);
cv::imshow("sobel X方向算子", dstSoX);
cv::imshow("sobel Y方向算子", dstSoY);
dstSoX = cv::abs(dstSoX);
dstSoY = cv::abs(dstSoY);
cv::add(dstSoX,dstSoY,dstSoM);
cv::imshow("sobel算子梯度", dstSoM);// 3. 拉普拉斯算子
cv::Mat dstLap;
cv::Mat kernelLap = (cv::Mat_<float>(3,3) << 0,-1,0,-1,4,-1,0,-1,0);
cv::filter2D(gray,dstLap,-1,kernelLap);
cv::imshow("拉普拉斯算子", dstLap);cv::waitKey(0);
return 1;
}