对目标图像进行边缘提取,其中type为枚举类型,可以更改。其中包括Canny,Sobel,Scharr和laplacian,下面是具体代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include<cmath>
using namespace std;
using namespace cv;
enum Sharpening
{
sobel,
scharr,
laplacian,
canny
};
void Sobel_sharpen(Mat& input, Mat& output,Mat& outputX,Mat& outputY)
{
//X方向一阶边缘 最后三个参数dx dy Sobel算子的核大小
cvtColor(input, input, COLOR_BGR2GRAY);
Sobel(input, outputX, CV_8U, 2, 0, 1);
//Y方向一阶边缘
Sobel(input, outputY, CV_8U, 0, 1, 3);
addWeighted(outputX, 1, outputY, 1,0, output);
imshow("outputX", outputX);
imshow("outputY", outputY);
imshow("output", output);
waitKey(0);
};
void Scharr_sharpen(Mat& input, Mat& output, Mat& outputX, Mat& outputY)
{
//X方向 最后两个dx dy
cvtColor(input, input, COLOR_BGR2GRAY);
Scharr(input, outputX, CV_8U, 1, 0);
//Y方向
Scharr(input, outputY, CV_8U, 0, 1);
addWeighted(outputX,0.5, outputY,0.5,0, output);
imshow("outputX", outputX);
imshow("outputY", outputY);
imshow("output", output);
waitKey(0);
}
void Laplacian_sharpen(Mat& input, Mat& output)
{
cvtColor(input, input, COLOR_BGR2GRAY);
//卷积核大小 尺度 扩充边界实现卷积
Laplacian(input, output, CV_8U, (3, 3), 1.0, BORDER_DEFAULT);
imshow("output", output);
waitKey(0);
}
void Canny_sharpen(Mat& input, Mat& output,double th1=5,double th2=5)
{
//th1 越大越粗糙
cvtColor(input, input, COLOR_BGR2GRAY);
Canny(input, output, th1, th2);
imshow("output", output);
waitKey(0);
}
void run_sharpening(Mat& input, Mat& output,Sharpening type,double th1=5,double th2=5)
{
switch (type)
{
case sobel: {
Mat x1, y1;
Sobel_sharpen(input, output, x1, y1);
break;
}
case scharr:
{
Mat x1, y1;
Scharr_sharpen(input, output, x1, y1);
break;
}
case canny:
Canny_sharpen(input, output, th1, th2);
break;
case laplacian:
Laplacian_sharpen(input, output);
break;
default:
cerr << "TYPE ERROR" << endl;
break;
}
}
int main()
{
Mat img = imread("荷花.jpg");
Mat img_sharpen;
Sharpening type;
type = scharr;
run_sharpening(img, img_sharpen, type);
return 0;
}
原图
运行结果如下
Scharr运行结果(只展示output)
Canny
Sobel
Laplacian