W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在本教程中,您將學(xué)習(xí)如何:
cv :: Sobel
? 來(lái)計(jì)算圖像中的衍生物。cv :: Scharr
? 計(jì)算 3 \ cdot 3 的內(nèi)核的更準(zhǔn)確的導(dǎo)數(shù) 3?3
你可以很容易地注意到,在邊緣,像素強(qiáng)度以臭名昭著的方式發(fā)生變化。表達(dá)變化的一個(gè)好方法是使用衍生工具。梯度的高變化表示圖像的重大變化。
假設(shè)要運(yùn)行的圖像是:I
雖然有時(shí)使用以下簡(jiǎn)單的方程:
3
,上面顯示的 Sobel 內(nèi)核可能會(huì)產(chǎn)生明顯的不準(zhǔn)確(畢竟 Sobel 只是導(dǎo)數(shù)的近似值)。OpenCV 通過(guò)使用? cv :: Scharr
? 函數(shù)解決了大小為 3 的內(nèi)核的不精確性。這與標(biāo)準(zhǔn)的 Sobel 功能一樣快,但更準(zhǔn)確。它實(shí)現(xiàn)以下內(nèi)核:
您可以在 OpenCV 參考(?cv :: Scharr
?)中查看此功能的更多信息。此外,在下面的示例代碼中,您會(huì)注意到,在 ?cv :: Sobel
? 函數(shù)的代碼之上,還有一個(gè)注釋的?cv :: Scharr
?函數(shù)的代碼。取消注釋(并且顯然評(píng)論 Sobel 的內(nèi)容)應(yīng)該給你一個(gè)這個(gè)功能如何工作的想法。
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
int main( int argc, char** argv )
{
Mat src, src_gray;
Mat grad;
const char* window_name = "Sobel Demo - Simple Edge Detector";
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
String imageName("../data/lena.jpg");
// 默認(rèn)情況下
if (argc > 1)
{
imageName = argv[1];
}
src = imread( imageName, IMREAD_COLOR );
// 加載一張圖片
if( src.empty() )
{
return -1;
}
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor( src, src_gray, COLOR_BGR2GRAY );
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
//Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
//Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
convertScaleAbs( grad_x, abs_grad_x );
convertScaleAbs( grad_y, abs_grad_y );
addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
imshow( window_name, grad );
waitKey(0);
return 0;
}
Mat src, src_gray;
Mat grad;
const char* window_name = "Sobel Demo - Simple Edge Detector";
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
src
?:
String imageName("../data/lena.jpg");
// 默認(rèn)情況下
if (argc > 1)
{
imageName = argv[1];
}
src = imread( imageName, IMREAD_COLOR );
// 加載一張圖片
if( src.empty() )
{
return -1;
}
cv :: GaussianBlur
?應(yīng)用于我們的圖像以減少噪聲(內(nèi)核大小= 3)
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor(src,src_gray,COLOR_BGR2GRAY);
cv :: Sobel
?,如下所示:
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
//Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
//Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
該函數(shù)采用以下參數(shù):
src_gray
?:在我們的示例中,輸入圖像。這里是?CV_8U
?;grad_x / * grad_y *
?:輸出圖像;ddepth
?:輸出圖像的深度。我們將其設(shè)置為?CV_16S
?以避免溢出;x_order
?:?x
?方向上導(dǎo)數(shù)的順序;y_order
?:?y
?方向上導(dǎo)數(shù)的順序;scale
?,?delta
?和?BORDER_DEFAULT
?:我們使用默認(rèn)值。請(qǐng)注意,為了計(jì)算?x
?方向的梯度,我們使用:
。我們以?
y
?方式做類似的事情。
CV_8U
?:
convertScaleAbs(grad_x,abs_grad_x);
convertScaleAbs(grad_y,abs_grad_y);
最后,我們?cè)噲D接近梯度通過(guò)將兩個(gè)方向的梯度(注意,這是不是在所有的精確計(jì)算!但它有利于我們的目的)。
addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,grad);
最后,我們展示我們的結(jié)果:
imshow(window_name,grad);
waitKey(0);
這是將我們的基本檢測(cè)器應(yīng)用于?lena.jpg
?的輸出:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: