首頁 > 軟體

OpenCV實現Sobel邊緣檢測的範例

2022-08-03 18:04:17

一、Sobel演演算法

1、演演算法概述

Sobel邊緣檢測演演算法比較簡單,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如Canny檢測的準確,然而在很多實際應用的場合,sobel邊緣卻是首選,Sobel運算元是高斯平滑與微分操作的結合體,所以其抗噪聲能力很強,用途較多。尤其是在對效率要求較高,而對細紋理不太關係的時候。

使用Sobel運算元提取影象邊緣分3個步驟:

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

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

綜合兩個方向的邊緣資訊得到整幅影象的邊緣。

2、主要函數

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
  • src:傳入的影象
  • ddepth:影象的深度
  • dxdy:指的是求導的階數,0表示這個方向上沒有求導,所填的數一般為0、1、2。
  • ksize:是Sobel運算元的大小,即折積核的大小,必須為奇數1、3、5、7。如果ksize=-1,就演變成為3x3的Scharr運算元,scale是縮放導數的比例常數,預設情況為沒有伸縮係數。
  • borderType:是判斷影象邊界的模式,這個引數預設值為cv2.BORDER_DEFAULT。
  • dstdst之後的引數都是可選引數。

二、C++程式碼

#include <iostream>
#include <opencv2opencv.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影象處理(八)邊緣檢測

到此這篇關於OpenCV實現Sobel邊緣檢測的範例的文章就介紹到這了,更多相關OpenCV Sobel邊緣檢測內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com