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類(lèi)型的圖像 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語(yǔ)言實(shí)現(xiàn)楊輝三角實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)楊輝三角的方法,主要通過(guò)數(shù)組簡(jiǎn)單實(shí)現(xiàn),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-09-09C語(yǔ)言算法練習(xí)之?dāng)?shù)組元素排序
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組元素排序的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09基于C語(yǔ)言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
這篇文章主要為大家詳細(xì)介紹如何基于C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-07-07C++ map的簡(jiǎn)單使用實(shí)現(xiàn)
map是STL的一個(gè)關(guān)聯(lián)容器,它以<key,value>一對(duì)一的形式存儲(chǔ),且map的內(nèi)部自建一個(gè)紅黑樹(shù),使得其可以自動(dòng)排序,本文就介紹一下C++ map的簡(jiǎn)單使用,感興趣的可以了解一下2021-05-05Qt使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動(dòng)效果
我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么本文就拿Qt來(lái)做一個(gè)吧,本文將使用事件與定時(shí)器實(shí)現(xiàn)字幕滾動(dòng)的效果,感興趣的小伙伴可以了解一下2023-06-06Qt實(shí)現(xiàn)模糊匹配功能的實(shí)例詳解
對(duì)于瀏覽器的使用,我想大家一定不會(huì)陌生吧,輸入要搜索的內(nèi)容時(shí),會(huì)出現(xiàn)相應(yīng)的匹配信息。本文就來(lái)用Qt實(shí)現(xiàn)模糊匹配功能,感興趣的可以了解一下2022-10-10