中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?OpenCV?Canny邊緣檢測算法如何實現

發布時間:2022-07-18 09:39:05 來源:億速云 閱讀:174 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Python OpenCV Canny邊緣檢測算法如何實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Python OpenCV Canny邊緣檢測算法如何實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

Gaussian smoothing

總的來說,Canny邊緣檢測可以分為四個步驟:

由于邊緣檢測對噪聲敏感,因此對圖像應用高斯平滑以幫助減少噪聲。
具體做法是,采用一個5*5的高斯平滑濾波器對圖像進行濾波處理。

Computing the gradient magnitude and orientation

對平滑后的圖像,在水平、垂直兩個方向上使用Sobel算子(如下圖)計算梯度大小,得到兩個方向上的一階導數Gx與Gy。

Python?OpenCV?Canny邊緣檢測算法如何實現

在得到兩個方向上的梯度之后,對這兩個向量求和,得到這一點處的梯度大小與方向。

Python?OpenCV?Canny邊緣檢測算法如何實現

采用四舍五入,將梯度方向確定為上下左右與四個對角線方向之一(45°的倍數)。

Non-maxima suppression

在得到梯度大小與方向之后,對圖像進一步掃描,去除不構成邊緣的不重要的像素信息,這里采用的方法是非極大值抑制——在每個像素處,檢查像素是否在其梯度方向的鄰域中是局部最大值,只保留局部最大值的梯度。

Python?OpenCV?Canny邊緣檢測算法如何實現

在上圖中,點A位于邊緣上。梯度方向與邊緣方向垂直。為了確定要不要保留A點作為邊緣,需要將A點處的梯度大小與B、C兩點的梯度大小比較,如果A點的梯度大小不是局部最大,則將該點抑制。

因此,從結果上講,NMS其實是將B、C兩點抑制了,它們不會出現在結果中,因此這一步的效果是“thin edges”。

Hysteresis thresholding

定義上界與下界兩個閾值,并規定:

  • 任何梯度強度大于上界的像素都是邊;

  • 任何梯度強度小于下界的像素都不是邊;

  • 任何梯度介于兩個閾值之間的可能是邊,此時考察它們的連通性,如果它們和第一種情況(確定是邊緣的像素)相連接,就認為它們是邊緣,否則認為它們不是邊緣。

Python?OpenCV?Canny邊緣檢測算法如何實現

在上圖中,A點在maxVal閾值之上,確定是邊緣。C介于兩個閾值之間,但與A相連,因此它也是邊緣。B介于兩個閾值之間,它所在的曲線上并沒有任何像素點的梯度強度在maxVal之上,因此它不是邊緣。

需要指出的是,上面四步操作之后得到的是strong edges。

OpenCV實現

OpenCV提供了cv.Canny()方法,該方法將輸入的原始圖像轉換為邊緣圖像。

該方法的原型為:

cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> 	edges
cv.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges

image參數是array格式的輸入圖像。threshold1與threshold2分別是我們的下界閾值與上界閾值。apertureSize是用于查找圖像梯度的Sobel核的大小,默認為3。L2gradient指定了求梯度幅值的公式,是一個布爾型變量,默認為False。當它為True時,使用L2,否則使用L1。

下面是具體代碼:

def canny_detect(image_path, show=True):
    # 讀取圖像
    image = cv2.imread(image_path, 0)
    # 獲取結果
    edges = cv2.Canny(image, 100, 200)
    if show:
        # 繪制原圖
        plt.subplot(121)
        plt.imshow(image, 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()
    return edges
canny_detect('images/2.jpeg')

效果:

Python?OpenCV?Canny邊緣檢測算法如何實現

Python?OpenCV?Canny邊緣檢測算法如何實現

讀到這里,這篇“Python OpenCV Canny邊緣檢測算法如何實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特左旗| 桐城市| 松滋市| 西充县| 福泉市| 丰城市| 英吉沙县| 固始县| 阿拉善右旗| 响水县| 酒泉市| 南澳县| 壶关县| 永定县| 汉川市| 巧家县| 祁连县| 汾西县| 兴城市| 东港市| 庆元县| 高邮市| 龙泉市| 图们市| 乡城县| 兰考县| 上栗县| 克东县| 城步| 文昌市| 郧西县| 玉环县| 双城市| 普兰县| 庆元县| 洛川县| 洞头县| 南涧| 江北区| 和硕县| 镇江市|