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 }




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 }


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