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

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

綜合兩個(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è)方向上沒(méi)有求導(dǎo),所填的數(shù)一般為0、1、2。ksize:是Sobel算子的大小,即卷積核的大小,必須為奇數(shù)1、3、5、7。如果ksize=-1,就演變成為3x3的Scharr算子,scale是縮放導(dǎo)數(shù)的比例常數(shù),默認(rèn)情況為沒(méi)有伸縮系數(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");
//黑白圖像邊緣檢測(cè)結(jié)果較為明顯
Mat gray_img;
cvtColor(img, gray_img, COLOR_BGR2GRAY);
Mat resultX, resultY, resultXY;
//-------------Sobel邊緣檢測(cè)--------------
//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邊緣檢測(cè)------------------------
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)鏈接
[1] python+OpenCV圖像處理(八)邊緣檢測(cè)
到此這篇關(guān)于OpenCV實(shí)現(xiàn)Sobel邊緣檢測(cè)的示例的文章就介紹到這了,更多相關(guān)OpenCV Sobel邊緣檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++實(shí)現(xiàn)通訊錄管理系統(tǒng)(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-12-12
C語(yǔ)言實(shí)現(xiàn)牛頓迭代法解方程詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)牛頓迭代法解方程詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
C語(yǔ)言實(shí)現(xiàn)bmp圖像對(duì)比度擴(kuò)展
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)bmp圖像對(duì)比度擴(kuò)展,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C++ 學(xué)習(xí)之旅二 說(shuō)一說(shuō)C++頭文件
作為一個(gè)二手的.net程序員,你看到了C++頭文件一定就犯迷糊了,這到底是個(gè)啥玩意。再我糾結(jié)了24個(gè)小時(shí), google20次,度娘10下,看過(guò)10來(lái)騙文章以后,我可能稍微開竅了。我對(duì)C++頭文件總結(jié),與.net比較如下2012-11-11
Qt實(shí)現(xiàn)界面滑動(dòng)切換效果的思路詳解
這篇文章主要介紹了Qt實(shí)現(xiàn)界面滑動(dòng)切換效果,主要包括設(shè)計(jì)思路及主要函數(shù)講解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解
這篇文章主要為大家詳細(xì)介紹了c++有關(guān)文件創(chuàng)建、讀取和寫入的api:CreateFile、ReadFile、WriteFile的具體使用,需要的可以參考下2023-04-04
C語(yǔ)言學(xué)習(xí)之關(guān)鍵字的示例詳解
關(guān)鍵字,這名字一聽,就很關(guān)鍵。而有些關(guān)鍵字,你可能不是很了解,更別談使用。所以,這篇文章將帶你見識(shí)常見的關(guān)鍵字,一起領(lǐng)略它們的風(fēng)采吧2022-10-10

