目錄
- 一、Sobel演算法
- 1、演算法概述
- 2、主要函式
- 二、C++代碼
- 三、python代碼
- 四、結果展示
- 1、灰度圖
- 2、X方向一階邊緣
- 2、Y方向一階邊緣
- 3、整幅影像的一階邊緣
- 五、相關鏈接
一、Sobel演算法
1、演算法概述
? ?Sobel邊緣檢測演算法比較簡單,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如Canny檢測的準確,然而在很多實際應用的場合,sobel邊緣卻是首選,Sobel算子是高斯平滑與微分操作的結合體,所以其抗噪聲能力很強,用途較多,尤其是在對效率要求較高,而對細紋理不太關系的時候,
? ?使用Sobel算子提取影像邊緣分3個步驟:
- 提取X方向的邊緣,X方向一階Sobel邊緣檢測演算法為:
[ ? 1 0 1 ? 2 0 2 ? 1 0 1 ] (1) \left[ \begin{matrix} -1 & 0 & 1\\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right] \tag{1} ????1?2?1?000?121????(1) - 提取Y方向的邊緣,Y方向一階Sobel邊緣檢測演算法為:
[ ? 1 ? 2 ? 1 0 0 0 1 2 1 ] (2) \left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right] \tag{2} ????101??202??101????(2) - 綜合兩個方向的邊緣資訊得到整幅影像的邊緣,
2、主要函式
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src:傳入的影像ddepth:影像的深度dx、dy:指的是求導的階數,0表示這個方向上沒有求導,所填的數一般為0、1、2,ksize:是Sobel算子的大小,即卷積核的大小,必須為奇數1、3、5、7,如果ksize=-1,就演變成為3x3的Scharr算子,scale是縮放導數的比例常數,默認情況為沒有伸縮系數,borderType:是判斷影像邊界的模式,這個引數默認值為cv2.BORDER_DEFAULT,dst及dst之后的引數都是可選引數,
二、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]]])
# 可選引數alpha是伸縮系數,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、整幅影像的一階邊緣

五、相關鏈接
[1] python+OpenCV影像處理(八)邊緣檢測
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323276.html
標籤:其他
