5.2 基本邊緣檢測算子—Sobel


Sobel算子是應用廣泛的離散微分算子之一,用於圖像處理中的邊緣檢測,計算圖像灰度的近似梯度。

基於圖像卷積來實現在水平方向和垂直方向檢測對應方向上的邊緣。

對於源圖像與奇數Sobel水平核Gx、垂直核Gy進行卷積可計算水平與垂直變換。

Sobel算子在進行邊緣檢測時候效率較高,對精度要求不是很高時候,是一種較為常用的邊緣檢測方法。

Sobel算子對沿着x軸和y軸的排列表示得很好,但是對於其他角度的表示卻不夠精確,這時候我們可以使用Scharr濾波器。

5.2.1 非極大值一直Sobel檢測

步驟1/2/3/4

https://blog.csdn.net/gone_huilin/article/details/53223622

https://bbs.csdn.net/topics/370004267

5.2.2 圖像直接卷積實現Sobel

5.2.3 圖像卷積下非極大值抑制Sobel

非極大值抑制雖然能夠較好剔除虛假邊緣點,但對於某些特定場景下的邊緣檢測並不適用,例如污損文本字符識別。

5.2.4 Sobel庫函數實現

 1 /////////////////////////////////5.2.4 Sobel庫函數實現//////////////////////////////
 2 ////////https://blog.csdn.net/gone_huilin/article/details/53223636
 3 #include <opencv2/core/core.hpp>
 4 #include <opencv2/highgui/highgui.hpp>
 5 #include "opencv2/imgproc/imgproc.hpp"
 6 #include <iostream>
 7 using namespace cv;
 8 int main()
 9 {
10     cv::Mat srcImage = imread("D:\\樓房.jpg");
11     if (!srcImage.data)
12         return -1;
13     cv::Mat srcGray;
14     cvtColor(srcImage, srcGray, CV_RGB2GRAY);
15     imshow("srcGray", srcGray);
16     // 定義邊緣圖,水平及垂直
17     cv::Mat edgeMat, edgeXMat, edgeYMat;
18     // 求x方向Sobel邊緣
19     Sobel(srcGray, edgeXMat, CV_16S, 1, 0, 3, 1,
20         0, BORDER_DEFAULT);
21     // 求y方向Sobel邊緣
22     Sobel(srcGray, edgeYMat, CV_16S, 0, 1, 3, 1,
23         0, BORDER_DEFAULT);
24     // 線性變換轉換輸入數組元素成8位無符號整型
25     convertScaleAbs(edgeXMat, edgeXMat);
26     convertScaleAbs(edgeYMat, edgeYMat);
27     // x與y方向邊緣疊加
28     addWeighted(edgeXMat, 0.5, edgeYMat, 0.5, 0, edgeMat);
29     cv::imshow("edgeYMat", edgeYMat);
30     imshow("edgeMat", edgeMat);
31     // 定義Scharr邊緣圖像
32     cv::Mat edgeMatS, edgeXMatS, edgeYMatS;
33     // 計算x方向Scharr邊緣
34     Scharr(srcGray, edgeXMatS, CV_16S, 1, 0, 1,
35         0, BORDER_DEFAULT);
36     convertScaleAbs(edgeXMatS, edgeXMatS);
37     // 計算y方向Scharr邊緣
38     Scharr(srcGray, edgeYMatS, CV_16S, 0, 1, 1,
39         0, BORDER_DEFAULT);
40     // 線性變換轉換輸入數組元素成8位無符號整型
41     convertScaleAbs(edgeYMatS, edgeYMatS);
42     // x與y方向邊緣疊加
43     addWeighted(edgeXMatS, 0.5, edgeYMatS, 0.5, 0, edgeMatS);
44     cv::imshow("edgeMatS", edgeMatS);
45     cv::waitKey(0);
46     return 0;
47 }
View Code

5.3 基本邊緣檢測算子--Laplace

拉普拉斯算子是最簡單的各向同性二階微分算子,具有旋轉不變形。

根據微分特性點,該像素點的二階微分為零的點為邊緣點。

圖像中奇異點如亮點變得更亮,對於圖像中灰度變化劇烈的區域,拉普拉斯算子能實現其邊緣檢測。其利用二次微分特性與峰值間過零點來確定邊緣位置,對奇異點或邊界點更加敏感,常應用於圖像銳化(突出圖像的細節或增強被模糊的圖像細節,實現灰度反差增強,使圖像變得清晰。積分運算或加權平均讓圖像變得模糊)工作。

 1 ///////////////////////////////////5.2.5 基本邊緣檢測算子--Laplace//////////////////////////////
 2 //////https://blog.csdn.net/Chenyukuai6625/article/details/74784626
 3 #include <opencv2/opencv.hpp>  
 4 #include<opencv2/highgui/highgui.hpp>  
 5 #include<opencv2/imgproc/imgproc.hpp>  
 6 
 7 using namespace cv;
 8 
 9 int main()
10 {
11     //【0】變量的定義  
12     Mat src, src_gray, dst, abs_dst;
13 
14     //【1】載入原始圖    
15     src = imread("D:\\日光.jpg");
16 
17     //【2】顯示原始圖   
18     imshow("【原始圖】圖像Laplace變換", src);
19 
20     //【3】使用高斯濾波消除噪聲  
21     GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
22 
23     //【4】轉換為灰度圖  
24     cvtColor(src, src_gray, CV_RGB2GRAY);
25 
26     //【5】使用Laplace函數  
27     Laplacian(src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
28 
29     //【6】計算絕對值,並將結果轉換成8位  
30     convertScaleAbs(dst, abs_dst);
31 
32     //【7】顯示效果圖  
33     imshow("【效果圖】圖像Laplace變換", abs_dst);
34 
35     waitKey(0);
36 
37     return 0;
38 }
View Code

5.4 基本邊緣檢測算子——Roberts

Roberts算子是利用局部差分尋找邊緣的一種算子,是最簡單的邊緣檢測算子。Roberts算子利用對角線方向相鄰兩像素之差近似梯度賦值來檢測邊緣,檢測垂直邊緣的效果要優於其他方向邊緣,定位精度高,但對噪聲抑制能力較弱。

https://blog.csdn.net/qq_20823641/article/details/52079628 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM