1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 8 int main(int argc, char** argv) 9 { 10 Mat src = imread("test.jpg"); 11 Mat dst, gray,grad_x, gray_y,abs_grad_x,abs_grad_y; 12 13 14 //转成灰度图 15 cvtColor(src, gray, COLOR_BGR2GRAY); 16 17 //均值滤波降噪,也可以用其他滤波方法 18 blur(gray, src, Size(3, 3)); 19 20 //运行Sobel算子,得到边缘 21 //求x方向梯度 22 Sobel(src, grad_x, CV_16S, 1, 0, 3); 23 convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,要将图片转化成为8位图形进行显示 24 imshow("x方向的sobel", abs_grad_x); 25 26 //运行Sobel算子,得到边缘 27 //求y方向梯度 28 Sobel(src, gray_y, CV_16S, 0, 1, 3); 29 convertScaleAbs(gray_y, abs_grad_y); 30 imshow("y方向的sobel", abs_grad_y); 31 32 //合并梯度 33 addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst); 34 35 36 imshow("合成的整体效果图", dst); 37 38 waitKey(0); 39 return 0; 40 41 }
convertScaleAbs函数
线性变换转换输入数组元素成8位无符号整型。
void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
参数 :
src – 输入数组。
dst – 输出数组。
alpha – 可选缩放比例常数。
beta – 可选叠加到结果的常数。
对于每个输入数组的元素函数convertScaleAbs 进行三次操作依次是:缩放,得到一个绝对值,转换成无符号8位类型。
对于多通道矩阵,该函数对各通道独立处理。如果输出不是8位,将调用Mat::convertTo 方法并计算结果的绝对值。
addWeighted函数
计算两个矩阵的加权和。
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype=-1)
参数
src1 – 第一个输入数组。
alpha – 第一个数组的加权系数。
src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
beta – 第二个数组的加权系数。
dst – 输出数组,和第一个数组拥有相同的大小和通道。
gamma – 对所有和的叠加的常量。
dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为-1,意义等同于选择与第一个数组相同的深度。
在多通道情况下,每个通道是独立处理的,该函数可以被替换成一个函数表达式:
dst = src1*alpha + src2*beta + gamma;
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 8 int main(int argc, char** argv) 9 { 10 Mat src = imread("test.jpg"); 11 Mat dst, gray; 12 13 //滤波降噪 14 GaussianBlur(src, src, Size(3, 3),0,0,BORDER_DEFAULT); 15 16 //转成灰度图 17 cvtColor(src, gray, COLOR_BGR2GRAY); 18 19 //运行Sobel算子,得到边缘 20 //求x方向梯度 21 //Laplacian(src, dst, CV_16S, 3, 1,0,BORDER_DEFAULT); 22 Laplacian(src, dst, CV_16S);//后几个参数有默认值 23 24 //由于是16位图片,需要将图片转化成为8位图形进行显示 25 convertScaleAbs(dst, dst); 26 27 imshow("效果图", dst); 28 29 waitKey(0); 30 return 0; 31 32 }
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 8 int main(int argc, char** argv) 9 { 10 Mat src = imread("test.jpg"); 11 Mat dst, gray,grad_x, grad_y,abs_grad_x,abs_grad_y; 12 13 14 //转成灰度图(sobel和scharr可以不用转换成灰度图) 15 cvtColor(src, gray, COLOR_BGR2GRAY); 16 17 //均值滤波降噪,也可以用其他滤波方法 18 blur(gray, src, Size(3, 3)); 19 20 //运行Sobel算子,得到边缘 21 //求x方向梯度 22 Scharr(src, grad_x, CV_16S, 1, 0); 23 convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,想将图片转化成为8位图形进行显示 24 imshow("x方向的Scharr", abs_grad_x); 25 26 //运行Sobel算子,得到边缘 27 //求y方向梯度 28 Scharr(src, grad_y, CV_16S, 0, 1); 29 convertScaleAbs(grad_y, abs_grad_y); 30 imshow("y方向的Scharr", abs_grad_y); 31 32 //合并梯度 33 addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst); 34 35 36 imshow("合成的整体效果图", dst); 37 38 waitKey(0); 39 return 0; 40 41 }