天天看點

深度學習傳統CV算法——邊緣檢測算法綜述

邊緣檢測

  • ​​邊緣概述​​
  • ​​認識邊緣​​
  • ​​定義​​
  • ​​輪廓和邊緣的關系​​
  • ​​邊緣的類型​​
  • ​​邊緣檢測的概念​​
  • ​​概念​​
  • ​​邊緣檢測方法​​
  • ​​基本方法​​
  • ​​圖像濾波​​
  • ​​圖像增強​​
  • ​​圖像檢測​​
  • ​​圖像定位​​
  • ​​邊緣檢測算子的概念​​
  • ​​常見的邊緣檢測算子​​
  • ​​用梯度算子實作邊緣檢測的原理​​
  • ​​梯度算子​​
  • ​​邊緣點​​
  • ​​梯度​​
  • ​​梯度算子​​
  • ​​梯度如何衡量​​
  • ​​使用梯度算子實作邊緣檢測​​
  • ​​原理​​
  • ​​實作​​
  • ​​參考​​

邊緣概述

認識邊緣

定義

邊緣是不同區域的分界線,是周圍(局部)灰階值有顯著變化的像素點的集合,有幅值與方向兩個屬性。這個不是絕對的定義,主要記住邊緣是局部特征,以及周圍灰階值顯著變化産生邊緣。

輪廓和邊緣的關系

一般認為輪廓是對物體的完整邊界的描述,邊緣點一個個連接配接起來構成輪廓。邊緣可以是一段邊緣,而輪廓一般是完整的。人眼視覺特性,看物體時一般是先擷取物體的輪廓資訊,再擷取物體中的細節資訊,比如看到幾個人站在那,我們一眼看過去馬上能知道的是每個人的高矮胖瘦,然後才擷取臉和衣着等資訊。

總結:邊緣組合起來可以構成輪廓,輪廓可以由多個邊緣組成。

邊緣的類型

簡單分為4種類型,階躍型、屋脊型、斜坡型、脈沖型,其中階躍型和斜坡型是類似的,隻是變化的快慢不同,同樣,屋脊型和脈沖型也是如此。在邊緣檢測中更多關注的是階躍和屋脊型邊緣。見圖1,(a)和(b)可認為是階躍或斜坡型,(c)脈沖型,(d)屋脊型,階躍與屋脊的不同在于階躍上升或下降到某個值後持續下去,而屋脊則是先上升後下降。

深度學習傳統CV算法——邊緣檢測算法綜述

邊緣檢測的概念

概念

邊緣檢測是圖像處理與計算機視覺中極為重要的一種分析圖像的方法,它的目的是找到圖像中亮度變化劇烈的像素點構成的集合,表現出來往往是輪廓。如果圖像中邊緣能夠精确的測量和定位,那麼,就意味着實際的物體能夠被定位和測量,包括物體的面積、物體的直徑、物體的形狀等就能被測量。在對現實世界的圖像采集中,有下面4種情況會表現在圖像中時形成一個邊緣。

  1. 深度的不連續(物體處在不同的物平面上);
  2. 表面方向的不連續(如正方體的不同的兩個面);
  3. 物體材料不同(這樣會導緻光的反射系數不同);
  4. 場景中光照不同(如被樹萌投向的地面);

    例如上面的圖像是圖像中水準方向7個像素點的灰階值顯示效果,我們很容易地判斷在第4和第5個像素之間有一個邊緣,因為它倆之間發生了強烈的灰階跳變。在實際的邊緣檢測中,邊緣遠沒有上圖這樣簡單明顯,我們需要取對應的門檻值來區分出它們。

邊緣檢測方法

基本方法

一般圖像邊緣檢測方法主要有如下四個步驟:

圖像濾波

作用:進行去噪

傳統邊緣檢測算法主要是基于圖像強度的一階和二階導數,但導數的計算對噪聲很敏感,是以必須使用濾波器來改善與噪聲有關的邊緣檢測器的性能。需要指出的是,大多數濾波器在降低噪聲的同時也造成了了邊緣強度的損失,是以,在增強邊緣和降低噪聲之間需要一個折衷的選擇。

圖像增強

增強邊緣的基礎是确定圖像各點鄰域強度的變化值。增強算法可以将鄰域(或局部)強度值有顯著變化的點突顯出來。邊緣增強一般是通過計算梯度的幅值來完成的。

圖像檢測

在圖像中有許多點的梯度幅值比較大,而這些點在特定的應用領域中并不都是邊緣,是以應該用某種方法來确定哪些點是邊緣點。最簡單的邊緣檢測判斷依據是梯度幅值。

圖像定位

如果某一應用場合要求确定邊緣位置,則邊緣的位置可在子像素分辨率上來估計,邊緣的方位也可以被估計出來。

邊緣檢測算子的概念

深度學習傳統CV算法——邊緣檢測算法綜述

在數學中,函數的變化率由導數來刻畫,圖像我們看成二維函數,其上面的像素值變化,當然也可以用導數來刻畫,當然圖像是離散的,那我們換成像素的差分來實作。對于階躍型邊緣,圖2中顯示其一階導數具有極大值,極大值點對應二階導數的過零點,也就是,準确的邊緣的位置是對應于一階導數的極大值點,或者二階導數的過零點(注意不僅僅是二階導數為0值的位置,二值正負值過渡的零點)。故邊緣檢測算子的類型當然就存在一階和二階微分算子。

常見的邊緣檢測算子

近20多年來提出了許多邊緣檢測算子,在這裡僅讨論集中常見的邊緣檢測算子。

深度學習傳統CV算法——邊緣檢測算法綜述
  1. 常見的一階微分邊緣算子包括Roberts,Prewitt,Sobel,Kirsch以及Nevitia,
  2. 常見的二階微分邊緣算子包括Laplace算子,LOG算子,DOG算子和Canny算子等。
  3. 其中Canny算子是最為常用的一種,也是目前被認為最優秀的邊緣檢測算子。 此外本文還會介紹一種邊緣檢測方法SUSAN,它沒有用到圖像像素的梯度(導數)。以及本文會概述一些新興的邊緣檢測方法,如小波分析,模糊算法以及人工神經網絡等。

用梯度算子實作邊緣檢測的原理

梯度算子

邊緣點

對應于一階微分幅度的最大值點以及二階微分的零點。

梯度

一個曲面沿着給定方向的傾斜程度,在單變量函數中,梯度隻是導數,線上性函數中,是線的斜率——有方向的向量。

梯度算子

梯度屬于一階微分算子,對應一階導數。若圖像含有較小的噪聲并且圖像邊緣的灰階值過渡較為明顯,梯度算子可以得到較好的邊緣檢測結果。Canny,Sobel都屬于梯度算子

梯度如何衡量

對于連續函數f(x,y),我們計算出了它在(x,y)處的梯度,并且用一個矢量(沿x方向和沿y方向的兩個分量)來表示,如下:

對于連續函數 , 我們計算出了它在 處的梯度, 并且用一個矢量 沿 方向和沿 方向的兩個分量) 來表示, 如下:

現在我們需要衡量梯度的幅值, 可以用到以下三種範數:

要注意的是,由于使用2範數梯度要對圖像中的每個像素點進行平方及開方運算,計算複雜度高,在實際應用中,通常取絕對值或最大值來近似代替該運算以實作簡化,與平方及開方運算相比,取絕對值或最大值進行的邊緣檢測的準确度和邊緣的精度差異都很小。

使用梯度算子實作邊緣檢測

原理

基于梯度算子的邊緣檢測大多數是基于方向導數求卷積的方法

實作

以3×3的卷積模闆為例。

深度學習傳統CV算法——邊緣檢測算法綜述

設定好卷積模闆後,将模闆在圖像中移動,并将圖像中的每個像素點與此模闆進行卷積,得到每個像素點的響應R,用R來表征每個像素點的鄰域灰階值變化率,即灰階梯度值,進而可将灰階圖像經過與模闆卷積後轉化為梯度圖像。模闆系數𝑊𝑖(i=1,2,3,……9)相加的總和必須為零,以確定在灰階級不變的區域中模闆的響應為零。Z表示像素的灰階值 :

然後我們設定一個門檻值,如果卷積的結果R大于這個門檻值,那麼該像素點為邊緣點,輸出白色;如果R小于這個門檻值,那麼該像素不為邊緣點,輸出黑色。于是最終我們就能輸出一幅黑白的梯度圖像,實作邊緣的檢測。

參考

連結: ​​G-Lab​​.

繼續閱讀