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

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

綜合兩個(gè)方向的邊緣信息得到整幅圖像的邊緣。
2、主要函數(shù)
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src:傳入的圖像ddepth:圖像的深度dx、dy:指的是求導(dǎo)的階數(shù),0表示這個(gè)方向上沒有求導(dǎo),所填的數(shù)一般為0、1、2。ksize:是Sobel算子的大小,即卷積核的大小,必須為奇數(shù)1、3、5、7。如果ksize=-1,就演變成為3x3的Scharr算子,scale是縮放導(dǎo)數(shù)的比例常數(shù),默認(rèn)情況為沒有伸縮系數(shù)。borderType:是判斷圖像邊界的模式,這個(gè)參數(shù)默認(rèn)值為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");
//黑白圖像邊緣檢測結(jié)果較為明顯
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是加到結(jié)果上的一個(gè)值,結(jié)果返回uint類型的圖像
Scale_absX = cv2.convertScaleAbs(x) # convert 轉(zhuǎn)換 scale 縮放
Scale_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# ----------------------顯示結(jié)果----------------------------
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()
四、結(jié)果展示
1、灰度圖

2、X方向一階邊緣

2、Y方向一階邊緣

3、整幅圖像的一階邊緣

五、相關(guān)鏈接
到此這篇關(guān)于OpenCV實(shí)現(xiàn)Sobel邊緣檢測的示例的文章就介紹到這了,更多相關(guān)OpenCV Sobel邊緣檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
這篇文章主要為大家詳細(xì)介紹如何基于C語言實(shí)現(xiàn)一個(gè)簡單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手嘗試一下2022-07-07
Qt使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動效果
我們經(jīng)常能夠在外面看到那種滾動字幕,那么本文就拿Qt來做一個(gè)吧,本文將使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動的效果,感興趣的小伙伴可以了解一下2023-06-06
Qt實(shí)現(xiàn)模糊匹配功能的實(shí)例詳解
對于瀏覽器的使用,我想大家一定不會陌生吧,輸入要搜索的內(nèi)容時(shí),會出現(xiàn)相應(yīng)的匹配信息。本文就來用Qt實(shí)現(xiàn)模糊匹配功能,感興趣的可以了解一下2022-10-10

