1. 程式人生 > >OpenCV——邊緣檢測(sobel算子、Laplacian算子、scharr濾波器)

OpenCV——邊緣檢測(sobel算子、Laplacian算子、scharr濾波器)

scale 變換 得到 疊加 操作 fault sch laplacian 技術

技術分享圖片

技術分享圖片

技術分享圖片

 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 }

OpenCV——邊緣檢測(sobel算子、Laplacian算子、scharr濾波器)