邊緣檢測常用運算元:
基於一階微分的邊緣檢測方法:
roberts 運算元考慮影象的2*2鄰域,是最簡單的邊緣檢測運算元,演算法過程簡述:
【1】,遍歷影象(除去上邊緣和左邊緣),對每個畫素做roberts模板運算。
【2】,將結果儲存到目標影象,結束。
sobel運算元考察的是3*3鄰域,由兩個卷積核組成,見上圖,演算法過程簡述:
【1】,遍歷影象(除去邊緣,防止越界),對每個畫素做sobel模板卷積運算。
【2】,比較兩個計算結果的大小,取較大者複製到目標影象,結束。
prewitt運算元和sobel運算元類似,所不同的是選用不同的模板而已,演算法過程相同。
krisch運算元同樣考究3*3鄰域,所不同的是選用了八個卷積核,見上圖,演算法過程簡述:
【1】,遍歷影象(除去邊緣,防止越界),對每個畫素做krisch模板卷積運算。
【2】,比較八個計算結果的大小,取較大者複製到目標影象,結束。
基於二階微分的邊緣檢測方法:
laplacian 運算元是二階導數邊緣運算元,考察的是3*3鄰域,上圖是兩種比較常用的模板,演算法簡述如下:
【1】,遍歷影象(除去邊緣,防止越界),對每個畫素做laplancian模板卷積運算,注意是只做其中的一種模板運算,並不是兩個。
【2】,複製到目標影象,結束。
gauss-laplacian考察的是5*5的鄰域,檢測的同時,引入了濾波,是雜訊得以平滑,上圖是一種常用的運算元,演算法簡述。
【1】,遍歷影象(除去邊緣,防止越界),對每個畫素做gauss -laplancian模板卷積運算。
【2】,複製到目標影象,結束。
canny邊緣檢測是非常重要的一種邊緣檢測演算法,主要過程如下:
【1】,用高斯濾波器平滑影象。
已經學習過,根據高斯函式,構造高斯模板,進行濾波,不在贅述。
【2】,用一階偏導的有限差分來計算梯度的幅值和方向;
計算梯度作用模板,遍歷畫素,進行模板運算即可。
幅值和方向:
其中,phi 表示是幅值,theta 是方向,用影象副本進行儲存。
【3】,對梯度幅值進行非極大值抑制;
為確定邊緣,必須保留區域性梯度最大的點,而抑制非極大值(nms)。
解決辦法是,利用梯度的方向:
已經求出theta 的值,梯度的方向用於非極大值的抑制,將梯度角離散化到0,1,2,3中的乙個(通過線性對映),採用近似的演算法。知道了梯度角,也就知道了梯度線方向。
鄰域的中心畫素m與沿著梯度線的兩個畫素相比。如果m的梯度值不比沿梯度線的兩個相鄰畫素梯度值大,則令m=0。
【4】,用雙閾值演算法檢測和連線邊緣。
減少假邊緣段數量的典型方法是對n[i,j]使用乙個閾值。將低於閾值的所有值賦零值。但問題是如何選取閾值?
解決方法:
雙閾值演算法。雙閾值演算法對非極大值抑制圖象作用兩個閾值τ1和τ2,且2τ1≈τ2,從而可以得到兩個閾值邊緣圖象n1[i,j]和n2[i,j]。由於n2[i,j]使用高閾值得到,因而含有很少的假邊緣,但有間斷(不閉合)。雙閾值法要在n2[i,j]中把邊緣連線成輪廓,當到達輪廓的端點時,該演算法就在n1[i,j]的8鄰點位置尋找可以連線到輪廓上的邊緣,這樣,演算法不斷地在n1[i,j]中收集邊緣,直到將n2[i,j]連線起來為止。
邊緣檢測 Sobel運算元
依賴opencv來做一些資料結構和顯示的工作,但主要的計算法部分是自己實現的。後面爭取依次給出常見的集中邊緣提取的演算法實現。下次補上原理推到說明。sobel.cpp 定義控制台應用程式的入口點。include stdafx.h include cv.h include highgui.h incl...
邊緣檢測運算元
看了很多邊緣檢測的文章,有些不夠詳細,有些不算綜合,所以打算總結一下!以下內容均為個人理解,如有問題,望指正!首先,我想要解釋一下什麼是邊緣。通俗地講,灰度值變化劇烈的地方就是邊緣。那麼如何判斷灰度值變化?如何度量 劇烈 各類演算法給出了自己的規範或者說是原則。所以,各類運算元就跳出來了。由於各類運...
Laplacian iOS 運算元 邊緣檢測
基本概念 laplacian運算元是n維歐幾里德空間的乙個二階微分運算元,定義為梯度grad的散度div,因此如果f是二階可微的函式,則其定義為 計算拉普拉斯變換 laplacian void laplacian inputarray src,輸入影象,及源影象,mat類即可,且須為單通道8位影象 ...