前言
本文是關于OpenGL ES的系統(tǒng)性學習過程,記錄了自己在學習OpenGL ES時的收獲。
這篇文章的目標是學習OpenGL ES 2.0中的像素點的代數(shù)運算。
環(huán)境是Xcode8.1+OpenGL ES 2.0
目前代碼已經(jīng)放到github上面,OpenGL ES入門08-圖像邊緣檢測
歡迎關注我的 OpenGL ES入門專題
概述
邊緣檢測是圖像處理和計算機視覺中的基本問題,邊緣檢測的目的是標識數(shù)字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。 這些包括:1、深度上的不連續(xù);2、表面方向不連續(xù);3、物質屬性變化;4、場景照明變化。 邊緣檢測是圖像處理和計算機視覺中,尤其是特征提取中的一個研究領域。
Canny 算子
Canny邊緣檢測算子是John F. Canny于 1986 年開發(fā)出來的一個多級邊緣檢測算法。Canny算子是一個具有濾波,增強,檢測的多階段的優(yōu)化算子,在進行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還將經(jīng)過一個非極大值抑制的過程,最后Canny算子還采用兩個閾值來連接邊緣。
Canny算子求邊緣點具體算法步驟如下
- 用高斯濾波器平滑圖像。
- 用一階偏導有限差分計算梯度幅值和方向
- 對梯度幅值進行非極大值抑制
- 用雙閾值算法檢測和連接邊緣.
Laplacian 算子
Laplace算子是一種各向同性算子,二階微分算子,在只關心邊緣的位置而不考慮其周圍的象素灰度差值時比較合適。Laplace算子對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用于無噪聲圖象。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進行低通濾波。所以,通常的分割算法都是把Laplacian算子和平滑算子結合起來生成一個新的模板。
二維函數(shù)f(x,y)的拉普拉斯是一個二階的微分,定義為:
其中:
拉普拉斯算子還可以表示成模板的形式:
拉普拉斯算子擴展模板
Sobel 算子
Sobel算子是計算機視覺領域的一種重要處理方法。主要用于獲得數(shù)字圖像的一階梯度,常見的應用和物理意義是邊緣檢測。在技術上,它是一個離散的一階差分算子,用來計算圖像亮度函數(shù)的一階梯度之近似值。在圖像的任何一點使用此算子,將會產生該點對應的梯度矢量或是其法矢量。Sobel算子并沒有將圖像的主題與背景嚴格地區(qū)分開來,也就是Sobel算子并沒有基于圖像灰度進行處理,由于Sobel算子并沒有嚴格地模擬人的視覺生理特征,所以提取的圖像輪廓有時并不能令人滿意。
檢測水平邊沿橫向模板
檢測垂直平邊沿縱向模板
圖像梯度的大小
梯度方向
對于給定的圖像
近似公式的計算的結果
參考資料
《OpenCV3編程入門》