imgproc模組 Sobel邊緣檢測運算元

2021-08-02 12:47:50 字數 3160 閱讀 9192

1.目的

(1)如何使用opencv函式sobel對影象求導數

(2)如何使用opencv函式scharr對影象求導數

2.原理

(1)影象邊緣

影象邊緣是影象畫素發生顯著變化的位置。使用卷積運算可以近似計算影象梯度,檢測影象邊緣,梯度值大意味影象內容發生顯著變化,可以認為該處為影象的邊緣處。

(2)sobel運算元

[1]sobel運算元是乙個一階離散微分運算元,可以用它來計算灰度影象的近似梯度

[2]sobel 運算元結合了高斯平滑和微分求導。

[3]計算

<1>兩個方向的梯度

a.水平變化: 將 i 與乙個奇數大小的核心 gx 進行卷積。比如,當核心大小為3時, gx 的計算結果為:

b.垂直變化: 將:math:i 與乙個奇數大小的核心 gy 進行卷積。比如,當核心大小為3時, gy 的計算結果為:

<2>近似梯度計算

或者:

note:

當核心大小為 3 時, 以上sobel核心可能產生比較明顯的誤差(畢竟,sobel運算元只是求取了導數的近似值)。 為解決這一問題,opencv提供了 scharr 函式,但該函式僅作用於大小為3的核心。該函式的運算與sobel函式一樣快,但結果卻更加精確,其核心為:

3.部分**解釋

(1)sobel

/*

sobel引數解釋

src:輸入影象

ddepth:影象深度

x_order:x方向梯度

y_order:y方向梯度

kernel_size:核大小(為奇數)

scale:尺度,計算導數時的縮放因子

delta:梯度偏置值,對計算結果的偏置

border_default:預設邊界設定

*/sobel(src, gradx, ddepth, 1, 0, 2

*kernel_size+1, scale, delta, border_default);

sobel(src, grady, ddepth, 0, 1, 2

*kernel_size+1, scale, delta, border_default);

(2)scharr

/*

scharr引數解釋

src:輸入影象

ddepth:影象深度

x_order:x方向梯度

y_order:y方向梯度

scale:尺度,計算導數時的縮放因子

delta:梯度偏置值,對計算結果的偏置

border_default:預設邊界設定

*///scharr只能使用大小為3的卷積核

scharr(src, gradx, ddepth, 1, 0, scale, delta, border_default);

scharr(src, grady, ddepth, 0, 1, scale, delta, border_default);

4.完整**

(1)commoninclude.h

#include

using

namespace

std;

#include

#include

#include

using

namespace cv;

(2)edge.cpp

#include "commoninclude.h"

int edge_type = 0;

int kernel_size = 3;

int scale = 1;

int max_edge_type = 3;

int max_kernel_size = 11;

int ddepth = cv_16s;

double delta = 0;

char windownameorigin = "origin";

char windownameedge = "edge";

/*0:sobel

1:scharr

2:laplace

3:canny

*/mat src, grad;

mat gradx, grady;

mat absgradx, absgrady;

void edgedetector(int, void*)

imshow(windownameedge, grad);

}int main(int argc, char** argv)

src = imread(argv[1]);

if(!src.data)

namedwindow(windownameedge, cv_window_autosize);

//高斯處理

gaussianblur(src, src, size(3,3), 0, 0, border_default);

//轉化為灰度影象

cvtcolor(src, src, cv_bgr2gray);

imshow(windownameorigin, src);

createtrackbar("edge type:\n0 sobel\n1 scharr\n2 laplace \n3 canny", windownameedge,

&edge_type, max_edge_type,

edgedetector);

createtrackbar("kernel size:2*n+1", windownameedge,

&kernel_size, max_kernel_size,

edgedetector);

edgedetector(0,0);

waitkey(0);

}

參考文獻1.

imgproc模組 Remapping重對映

1.目的 1 如何使用opencv函式remap實現簡單的重對映 2.原理 把乙個影象中乙個位置的畫素放置到另乙個指定位置的過程,為了完成對映過程,有必要獲得一些插值為非整數畫素座標,因為源影象與目標影象的畫素座標不是一一對應的。我們通過重對映來表達每個畫素的位置 x,y g x,y f h x,y...

imgproc模組 模板匹配

1.目的 1 使用opencv函式matchtemplate 在輸入影象中搜尋影象塊 2 使用opencv函式minmaxloc 尋找陣列中的最大或者最小值 2.原理 1 模板匹配 給定乙個影象塊,搜尋配對的影象塊,當模板是矩形時候,並不一定所有的矩形塊內容都是相關的,在這種情況下,可以利用掩碼分離...

imgproc模組 Laplace邊緣檢測運算元

1.目的 1 如何使用opencv函式laplacian實現laplacian運算元的離散模擬 2.原理 在一階導數的極值位置,二階導數為0。所以我們也可以用這個特點來作為檢測影象邊緣的方法。laplacian運算元的定義 opencv函式 laplacian 實現了laplacian運算元。實際上...