C OpenCV Sobel運算元邊緣檢測

2021-09-27 07:32:58 字數 2685 閱讀 1501

邊緣指的是畫素值發生躍遷的地方,是影象的顯著特徵之一,在影象特徵提取,物件檢測,模式識別等方面都有重要的作用。

如何捕捉/提取邊緣 ——對影象求一階導數

delta=f(x)-f(x-1),delta越大,說明畫素在x方向變化越大,邊緣訊號越強

用sobel運算元進行卷積運算,提取邊緣

是離散微分運算元,用來計算灰度的近似梯度

sobel運算元功能集合高斯平滑和微分求導

又被稱為一階微分運算元,求導運算元,在水平和垂直兩個方向上求導,得到影象x方向和y方向的梯度影象。

soble的x方向梯度-1

0+1-20

+2-10+1

sobel的y方向梯度-1

-2-100

0+1+2+1

最終的影象梯度:g=√gx

2+gy

2為了加快計算速度,將影象梯度的計算方法簡化為:g=|gx|+|gy|

在求取導數近似值的時候,kernel=3時不是很準確,opencv使用改進版本的scharr函式,運算元如下:

x方向上的梯度:-30

+3-10

0+10-10

+1y方向上的梯度:

-3-10-30

00+3+10

+3

cv::sobel(

inputarray src, //輸入影象

outputarray dst, //輸出影象,大小與輸入影象一致

int depth, //輸出影象深度

int dx, //x方向,幾階導數

int dy, //y方向,幾階導數

int ksize, //sobel運算元的kernel大小,必須是1,3,5,7

double scale=1,

double delta=0,

int bordertype =border_default

)

實現步驟:

高斯模糊->轉灰度影象->sobel運算元邊緣檢測

影象的輸入深度和輸出深度的對比(輸入必須大於輸入)

input depth( )

output depth

cv_8u

-1/cv_16s/cv_32f/cv_64f

cv_16u/cv_16s

-1/cv_32f/cv_64f

cv_32f

-1/cv_32f/cv_64f

cv_64f

-1/cv_64f

#include #include #includeusing namespace cv;

mat src, dst,gray;

int main(int argc, char** ar**)

char inputimage = "input image";

char outputimage = "output image";

char grayimage = "gray image";

namedwindow(inputimage, window_autosize);

namedwindow(outputimage, window_autosize);

namedwindow(grayimage, window_autosize);

imshow(inputimage, src);

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

cvtcolor(src, gray, color_bgr2gray);

imshow(grayimage, gray);

mat xgrad; //x方向上的梯度

mat ygrad; //y方向上的梯度

mat xygrad;

//scharr(gray, xgrad, cv_16s, 1, 0, 3); 可以理解為加強的sobel運算元

//scharr(gray, xgrad, cv_16s, 1, 0, 3);

sobel(gray, xgrad, cv_16s, 1, 0, 3);

sobel(gray, ygrad, cv_16s, 0, 1, 3);

convertscaleabs(xgrad, xgrad); //把xgrad統一變成正的

convertscaleabs(ygrad, ygrad); //把ygrad統一變成正的

imshow("xgrad", xgrad);

imshow("ygrad", ygrad);

//使用按照權重相加的方法將xy兩個方向的計算結果進行整合。

//addweighted(xgrad, 0.5, ygrad, 0.5, 0, xygrad);

//絕對值相加

mat sobeloutput1;

sobeloutput1= mat(xgrad.size(), xgrad.type());

int width = xgrad.cols;

int height = ygrad.rows;

for (int row = 0; row < height; row++)

} imshow(outputimage, sobeloutput1);

waitkey(0);

return 0;

}

Halcon封裝的找邊運算元 靈活好用

我們在做halcon找邊的時候有很多種方式,比如得到想要的邊緣輪廓,然後根據邊緣輪廓擬合邊緣。今天我們講一下另外一種擬合邊的方式。視覺行業的從業者應該都聽過或者用過visionpro,工具化的開發方式,強大的資料流確實好用,再加上很多優化後的工具,在執行時間和穩定性方面做的非常好。但是有時候很你會發...

樹邊,前向邊,後向邊,橫叉邊

樹邊,前向邊,後向邊,橫叉邊,應該說,不是乙個圖本身有的概念,應該是圖進行dfs時才有的概念。圖進行dfs會得到一棵dfs樹 森林 在這個樹上才有了這些概念。對圖進行dfs,可以從任意的頂點開始,遍歷的方式也是多樣的,所以不同的遍歷會得到不同的dfs樹,進而產生不同的樹邊,前向邊,後向邊,橫叉邊。所...

SparkRDD運算元 sample運算元

val newrdd oldrdd.sample withreplacement,fraction,seed withreplacement表示是抽出的資料是否放回,true為有放回的抽樣,false為無放回的抽樣 fraction表示隨機抽樣的資料數量 seed用於指定隨機數生成器種子 def s...