图像边缘算子
(1)常見邊緣檢測算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia
?
(2) 其中一階邊緣算子:Roberts 、Sobel 、Prewitt、Kirsch。
? ? ? ? ?其中二階邊緣算子:Laplacian、Log/Marr、Canny
?
(3)Roberts算子
?
算法:遍歷整幅圖像,對每個像素做Roberts模板運算。
?
(4)Sobel算子
?
算法:遍歷整幅圖像,對每個像素做Sobel模板運算。
?
(5)Prewitt算子
?
算法:遍歷整幅圖像,對每個像素做Prewitt模板運算。
?
(6)Kirsch算子
算法:遍歷整幅圖像,對每個像素做Prewitt模板運算。
?
(6)Laplacian算子
???
Laplacian算子模板有兩個,分別是4鄰域(左邊的3*3矩陣)、8鄰域(右邊的3*3矩陣)。
算法:遍歷整幅圖像,對每個像素做Laplacian模板運算。
?
(7)LoG(Laplacian of Gauss)算子
算法:遍歷整幅圖像,對每個像素做LoG模板運算。
?
(7)Canny
Canny邊緣檢測算子是一種多級檢測算法。1986年由John F. Canny提出,同時提出了邊緣檢測的三大準則:
低錯誤率的邊緣檢測:檢測算法應該精確地找到圖像中的盡可能多的邊緣,盡可能的減少漏檢和誤檢。
最優定位:檢測的邊緣點應該精確地定位于邊緣的中心。
圖像中的任意邊緣應該只被標記一次,同時圖像噪聲不應產生偽邊緣。
?
Canny算法實現:
1)高斯模糊。
這一步很簡單,類似于LoG算子(Laplacian of Gaussian)作高斯模糊一樣,主要作用就是去除噪聲。因為噪聲也集中于高頻信號,很容易被識別為偽邊緣。應用高斯模糊去除噪聲,降低偽邊緣的識別。但是由于圖像邊緣信息也是高頻信號,高斯模糊的半徑選擇很重要,過大的半徑很容易讓一些弱邊緣檢測不到。
2)計算梯度幅值和方向。
圖像的邊緣可以指向不同方向,因此經典Canny算法用了四個梯度算子來分別計算水平,垂直和對角線方向的梯度。但是通常都不用四個梯度算子來分別計算四個方向。常用的邊緣差分算子(如Rober,Prewitt,Sobel)計算水平和垂直方向的差分Gx和Gy。這樣就可以如下計算梯度模G和方向θ:
?
3) 非最大值抑制。
目的:為確定邊緣,必須保留局部梯度最大的點,二抑制非極大值(NMS)。
利用已求出的θ值,梯度的方向用于非極大值的抑制,將角度離散化0、1、2、3的一個。知道梯度角,即知道梯度線(如上圖所示)。
鄰域的中心像素C與沿著梯度線的兩個像素比較。如果C的梯度值小于沿著梯度線的連個相鄰像素的梯度值,則令C=0;
4)雙閥值。
Canny算法應用雙閥值,即一個高閥值和一個低閥值來區分邊緣像素。如果邊緣像素點梯度值大于高閥值,則被認為是強邊緣點。如果邊緣梯度值小于高閥值,大于低閥值,則標記為弱邊緣點。小于低閥值的點則被抑制掉。
5)滯后邊界跟蹤。
至此,強邊緣點可以認為是真的邊緣。弱邊緣點則可能是真的邊緣,也可能是噪聲或顏色變化引起的。為得到精確的結果,后者引起的弱邊緣點應該去掉。通常認為真實邊緣引起的弱邊緣點和強邊緣點是連通的,而又噪聲引起的弱邊緣點則不會。所謂的滯后邊界跟蹤算法檢查一個弱邊緣點的8連通領域像素,只要有強邊緣點存在,那么這個弱邊緣點被認為是真是邊緣保留下來。
?
?
?
?
總結
- 上一篇: python 读取当前文件夹下所有后缀为
- 下一篇: 构造函数,拷贝构造函数,赋值函数