OpenCV 中的邊緣檢測__canny邊緣檢測演算法

來源:互聯網
上載者:User

OpenCV 提供了四種不同的邊緣檢測運算元,或者說高通濾波器:Sobel,Scharr 和 Laplacian 運算元以及Canny 運算元,具體檢測步驟如下: 映像濾波:邊緣檢測的演算法主要是基於映像灰階值的一階和二階導數,但導數通常對雜訊很敏感,因此必須採用濾波器來改善與雜訊有關的邊緣檢測器的效能。常用的高斯平滑濾波。 增強邊緣:可以將映像灰階點鄰域值有顯著變化的點凸顯出來。在具體編程實現時,可通過計算梯度幅值來確定。 映像檢測:對映像中的各個點求梯度,梯度值較大的地方往往是 edge。 一、Sobel、Scharr 和 Laplacian 運算元 Sobel 運算元
高斯平滑與微分操作的結合體,所以它的抗雜訊能力很好,在映像的任何一點使用此運算元,將會產生對應的梯度向量或是其法向量。 可設定卷積核的大小(ksize), 若 ksize=−1 ksize=-1,則會使用 3x3 3x3 的Scharr 濾波器(千年備胎),它的效果要比 3x3 3x3 的Sobel 濾波器好。 求Sobel 運算元水平和垂直方向的梯度,其實就是用相應的卷積核和原始映像逐像素卷積。 Laplacian 運算元
OpenCV 在計算拉普拉斯運算元時直接調用Sobel X 和 Y 方向的運算元 ksize=1 ksize = 1時,運算元使用預設的卷積核( 3∗3 3*3) 代碼及結果顯示

img = cv2.imread('D:/dave.jpg')# 參數1,0 為只在x方向求一階導數,最大可以求2階導數sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3)# 參數0,1 為只在y方向求一階導數,最大可以求2階導數sobely = cv2.Sobel(img, -1, 0, 1, ksize=3)laplacian = cv2.Laplacian(img, -1, ksize=3)

二、Canny 邊緣檢測步驟 高斯平滑濾波:消除雜訊 對映像中的每個像素點計算其梯度幅值和方向
對平滑後的映像使用 Sobel 運算元計算水平方向和豎直方向的一階導數(映像梯度 Gx G_x 和 Gy G_y) 根據( Gx G_x 和 Gy G_y)計算得到每個像素的梯度幅值和方向:
Edge_Gradient(G)=G2x+G2y−−−−−−−√ Edge\_Gradient(G) = \sqrt{G_x^2 + G_y^2}
Angle(θ)=tan−1(GyGx) Angle(\theta )=tan^{-1}(\frac{G_y}{G_x}) 梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直,水平,和兩個對角線。 非極大值抑制(Non-maximum Suppression)
對每一個像素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中梯度幅值最大的,如果是就保留,不是極大值就抑制(如設定為0)。 由於梯度變化較大的地區通常比較寬,所以通過NMS可以進一步排除邊緣附近的像素點,僅僅保留了一些細線條(候選邊緣)。
NMS演算法在物體檢測中應用的主要目的是:消除多餘(交叉重複)的視窗,找到最佳物體檢測位置。

滯後閾值(Hysteresis Thresholding) 若某像素(A)的梯度幅值超過高閾值(maxVal),該像素被保留為邊緣像素。 若某像素(D)梯度幅值小於低閾值(minVal),該像素被排除。 若某像素(C)的梯度幅值在兩個閾值之間,,該像素僅僅在串連到一個高於高閾值的像素時,才被認為是邊緣像素,否則該像素(B)被排除。

OpenCV 中的 Canny 邊緣檢測:cv2.Canny(img, minVal, maxVal)

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread('messi5.jpg')edges = cv2.Canny(img, minVal, maxVal)plt.subplot(121), plt.imshow(img, cmap='gray')plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(edges, cmap='gray')plt.title('Edge Image'), plt.xticks([]), plt.yticks([])plt.show()
三、參考資料

1、OpenCV 邊緣檢測:Canny運算元、Sobel運算元、Laplace運算元以及Scharr濾波器
2、OpenCV-Python Tutorials

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.