【第15節(jié)】OpenCV中Canny邊緣檢測(cè)
目標(biāo)
了解Canny邊緣檢測(cè)的概念
學(xué)習(xí)函數(shù)CV2.Canny()
1、原理
????????Canny邊緣檢測(cè)是一種非 常流行的邊緣檢測(cè)算法,是John F.Canny在1986年提出的。它是一個(gè)有很多步構(gòu)成的算法,我們接下來會(huì)逐步介紹。
1.1 噪聲去除
????????由于邊緣檢測(cè)很容易受到噪聲影響,所以是使用高斯濾波器去除噪聲,這個(gè)前面我們已經(jīng)學(xué)過了。
1.2 計(jì)算圖像梯度
????????對(duì)平滑后的圖像使用Sobel 算子計(jì)算水平方向和豎直方向的一-階導(dǎo)數(shù)(圖像梯度)(Gx和Gy)。根據(jù)得到的這兩幅梯度圖(Gx和Gy)找到邊界的梯度和方向,公式如下:

????????梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直、水平和兩個(gè)對(duì)角線。
1.3 非極大值抑制
????????在獲得梯度的方向和大小之后,應(yīng)該對(duì)整幅圖像做一個(gè)掃描,去除那些非邊界上的點(diǎn)。對(duì)每一個(gè)像素進(jìn)行檢查,看這個(gè)點(diǎn)的梯度是不是周圍具有相同梯度方向的點(diǎn)中最大的。如下圖所示:

????????現(xiàn)在你得到的是一個(gè)包含“窄邊界”的二值圖像。
1.4 滯后閾值
????????現(xiàn)在要確定哪些邊界才是真正的邊界。這時(shí)我們需要設(shè)置兩個(gè)閾值:minVal和maxVal。當(dāng)圖像的灰度梯度高于maxVal時(shí)被認(rèn)為是真的邊界,那些低于minVal的邊界會(huì)被拋棄。如果介于兩者之間的話,就要看這個(gè)點(diǎn)是否與某個(gè)被確定為真正的邊界點(diǎn)相連,如果是就認(rèn)為它也是邊界點(diǎn),如果不是就拋棄。如下圖:

????????A高于閾值maxVal所以是真正的邊界點(diǎn),C雖然低于maxVal但高于minVal并且與A相連,所以也被認(rèn)為是真正的邊界點(diǎn)。而B就會(huì)被拋棄,因?yàn)樗粌H低于maxVal而且不與真正的邊界點(diǎn)相連。所以選擇合適的maxVal和minVal對(duì)于能否得到好的結(jié)果非常重要。在這一步一些小的噪聲點(diǎn)也會(huì)被除去,因?yàn)槲覀兗僭O(shè)邊界都是一些長(zhǎng)的線段。
2、OpenCV中的Canny邊界檢測(cè)
????????在OpenCV中只需要一個(gè)函數(shù): CV2.Canny(), 就可以完成以上幾步。讓我們看如何使用這個(gè)函數(shù)。這個(gè)函數(shù)的第一個(gè)參數(shù)是輸入圖像。第二和第三個(gè)分別是minVal和maxVal。第三個(gè)參數(shù)設(shè)置用來計(jì)算圖像梯度的Sobel卷積核的大小,默認(rèn)值為3。最后一個(gè)參數(shù)是L2gradient,它可以用來設(shè)定求梯度大小的方程。如果設(shè)為True,就會(huì)使用我們上面提到過的方程,否則使用方程: Edge- Gradient (G)= |G2|+ |G引|代替,默認(rèn)值為False。
結(jié)果:
