前言
本文是關(guān)于OpenGL ES的系統(tǒng)性學(xué)習(xí)過程,記錄了自己在學(xué)習(xí)OpenGL ES時的收獲。
這篇文章的目標(biāo)是學(xué)習(xí)OpenGL ES 2.0中的像素點(diǎn)的代數(shù)運(yùn)算。
環(huán)境是Xcode8.1+OpenGL ES 2.0
目前代碼已經(jīng)放到github上面,OpenGL ES入門08-圖像邊緣檢測
歡迎關(guān)注我的 OpenGL ES入門專題
概述
邊緣檢測是圖像處理和計算機(jī)視覺中的基本問題,邊緣檢測的目的是標(biāo)識數(shù)字圖像中亮度變化明顯的點(diǎn)。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。 這些包括:1、深度上的不連續(xù);2、表面方向不連續(xù);3、物質(zhì)屬性變化;4、場景照明變化。 邊緣檢測是圖像處理和計算機(jī)視覺中,尤其是特征提取中的一個研究領(lǐng)域。
Canny 算子
Canny邊緣檢測算子是John F. Canny于 1986 年開發(fā)出來的一個多級邊緣檢測算法。Canny算子是一個具有濾波,增強(qiáng),檢測的多階段的優(yōu)化算子,在進(jìn)行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導(dǎo)的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還將經(jīng)過一個非極大值抑制的過程,最后Canny算子還采用兩個閾值來連接邊緣。
Canny算子求邊緣點(diǎn)具體算法步驟如下
- 用高斯濾波器平滑圖像。
- 用一階偏導(dǎo)有限差分計算梯度幅值和方向
- 對梯度幅值進(jìn)行非極大值抑制
- 用雙閾值算法檢測和連接邊緣.
Laplacian 算子
Laplace算子是一種各向同性算子,二階微分算子,在只關(guān)心邊緣的位置而不考慮其周圍的象素灰度差值時比較合適。Laplace算子對孤立象素的響應(yīng)要比對邊緣或線的響應(yīng)要更強(qiáng)烈,因此只適用于無噪聲圖象。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進(jìn)行低通濾波。所以,通常的分割算法都是把Laplacian算子和平滑算子結(jié)合起來生成一個新的模板。
二維函數(shù)f(x,y)的拉普拉斯是一個二階的微分,定義為:

其中:

拉普拉斯算子還可以表示成模板的形式:

拉普拉斯算子擴(kuò)展模板

Sobel 算子
Sobel算子是計算機(jī)視覺領(lǐng)域的一種重要處理方法。主要用于獲得數(shù)字圖像的一階梯度,常見的應(yīng)用和物理意義是邊緣檢測。在技術(shù)上,它是一個離散的一階差分算子,用來計算圖像亮度函數(shù)的一階梯度之近似值。在圖像的任何一點(diǎn)使用此算子,將會產(chǎn)生該點(diǎn)對應(yīng)的梯度矢量或是其法矢量。Sobel算子并沒有將圖像的主題與背景嚴(yán)格地區(qū)分開來,也就是Sobel算子并沒有基于圖像灰度進(jìn)行處理,由于Sobel算子并沒有嚴(yán)格地模擬人的視覺生理特征,所以提取的圖像輪廓有時并不能令人滿意。
檢測水平邊沿橫向模板

檢測垂直平邊沿縱向模板

圖像梯度的大小

梯度方向

對于給定的圖像

近似公式的計算的結(jié)果

參考資料
《OpenCV3編程入門》