1. 程式人生 > >六 OpenCV圖像處理4 Canny 邊緣檢測

六 OpenCV圖像處理4 Canny 邊緣檢測

alt left 最大的 max plt src 分享 body 邊界

1.Canny 邊緣檢測原理

步驟:

·1噪聲去除: 由於邊緣檢測很容易受到噪聲影響,所以第一步是使用 5x5 的高斯濾波器 去除噪聲

·2計算圖像梯度

對平滑後的圖像使用 Sobel 算子計算水平方向和豎直方向的一階導數(圖 像梯度)(Gx 和 Gy)

根據得到的這兩幅梯度圖(Gx 和 Gy)找到邊界的梯 度和方向

梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直,水平,和 兩個對角線。

·3

非極大值抑制

在獲得梯度的方向和大小之後,應該對整幅圖像做一個掃描,去除那些非 邊界上的點。對每一個像素進行檢查,看這個點的梯度是不是周圍具有相同梯 度方向的點中最大的。如下圖所示:

得到的是一個包含“窄邊界”的二值圖像。

·4滯後閥值

現在要確定那些邊界才是真正的邊界。這時我們需要設置兩個閾值: minVal 和 maxVal

當圖像的灰度梯度高於 maxVal 時被認為是真的邊界, 那些低於 minVal 的邊界會被拋棄。如果介於兩者之間的話,就要看這個點是 否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是 就拋棄

A 高於閾值 maxVal 所以是真正的邊界點,C 雖然低於 maxVal 但高於 minVal 並且與 A 相連,所以也被認為是真正的邊界點。而 B 就會被拋棄,因 為他不僅低於 maxVal 而且不與真正的邊界點相連。所以選擇合適的 maxVal 和 minVal 對於能否得到好的結果非常重要

2.OpenCV Canny 函數

  

OpenCV中的Canny函數

  這個函數的第一個參數是輸入圖像。

  第二和第三 個分別是 minVal 和 maxVal。

  第三個參數設置用來計算圖像梯度的 Sobel 卷積核的大小,默認值為 3。

  最後一個參數是 L2gradient,它可以用來設定 求梯度大小的方程。如果設為 True,就會使用我們上面提到過的方程,否則 使用方程:Edge?Gradient(G) = |G2 x | + |G2 y | 代替,默認值為 False。

3.Demo

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

img = cv.imread(‘E:\\fruits_copy.jpg‘)

edges = cv.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap = ‘gray‘)

plt.title(‘Original Image‘)

plt.subplot(122),plt.imshow(edges,cmap = ‘gray‘)

plt.title(‘Edge Image‘)

plt.show()

閥值不同,得到的結果差別也很大

技術分享

技術分享

技術分享

六 OpenCV圖像處理4 Canny 邊緣檢測