OpenCV實現(xiàn)Sobel邊緣檢測的示例
一、Sobel算法
1、算法概述
Sobel邊緣檢測算法比較簡單,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如Canny檢測的準確,然而在很多實際應用的場合,sobel邊緣卻是首選,Sobel算子是高斯平滑與微分操作的結合體,所以其抗噪聲能力很強,用途較多。尤其是在對效率要求較高,而對細紋理不太關系的時候。
使用Sobel算子提取圖像邊緣分3個步驟:
提取X方向的邊緣,X方向一階Sobel邊緣檢測算法為:

提取Y方向的邊緣,Y方向一階Sobel邊緣檢測算法為:

綜合兩個方向的邊緣信息得到整幅圖像的邊緣。
2、主要函數(shù)
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src:傳入的圖像ddepth:圖像的深度dx、dy:指的是求導的階數(shù),0表示這個方向上沒有求導,所填的數(shù)一般為0、1、2。ksize:是Sobel算子的大小,即卷積核的大小,必須為奇數(shù)1、3、5、7。如果ksize=-1,就演變成為3x3的Scharr算子,scale是縮放導數(shù)的比例常數(shù),默認情況為沒有伸縮系數(shù)。borderType:是判斷圖像邊界的模式,這個參數(shù)默認值為cv2.BORDER_DEFAULT。dst及dst之后的參數(shù)都是可選參數(shù)。
二、C++代碼
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
//----------------讀取圖像-----------------
Mat img = imread("1.jpg");
//黑白圖像邊緣檢測結果較為明顯
Mat gray_img;
cvtColor(img, gray_img, COLOR_BGR2GRAY);
Mat resultX, resultY, resultXY;
//-------------Sobel邊緣檢測--------------
//X方向一階邊緣
Sobel(img, resultX, CV_16S, 2, 0, 1);
convertScaleAbs(resultX, resultX);
//Y方向一階邊緣
Sobel(img, resultY, CV_16S, 0, 1, 3);
convertScaleAbs(resultY, resultY);
//整幅圖像的一階邊緣
resultXY = resultX + resultY;
//顯示圖像
imshow("resultX", resultX);
imshow("resultY", resultY);
imshow("resultXY", resultXY);
waitKey(0);
return 0;
}
三、python代碼
import cv2
img = cv2.imread("1.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# -------------------Sobel邊緣檢測------------------------
x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可選參數(shù)alpha是伸縮系數(shù),beta是加到結果上的一個值,結果返回uint類型的圖像
Scale_absX = cv2.convertScaleAbs(x) # convert 轉換 scale 縮放
Scale_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# ----------------------顯示結果----------------------------
cv2.imshow('img', gray_img)
cv2.imshow('Scale_absX', Scale_absX)
cv2.imshow('Scale_absY', Scale_absY)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、結果展示
1、灰度圖

2、X方向一階邊緣

2、Y方向一階邊緣

3、整幅圖像的一階邊緣

五、相關鏈接
到此這篇關于OpenCV實現(xiàn)Sobel邊緣檢測的示例的文章就介紹到這了,更多相關OpenCV Sobel邊緣檢測內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

