GPUImage詳細(xì)解析(十二)Sobel邊界檢測

前言

卷積運(yùn)算是一個看似復(fù)雜的概念,今天來揭開這個神秘的面紗。
卷積矩陣:卷積矩陣是一個由權(quán)重?cái)?shù)據(jù)組成的矩陣,中心像素周圍像素的亮度乘以這些權(quán)重然后再相加就能得到中心像素的轉(zhuǎn)化后數(shù)值。
本文對GPUImage中的Sobel邊界檢測濾鏡進(jìn)行解析。

效果

正文

GPUImage的Sobel邊界檢測濾鏡是
GPUImageSobelEdgeDetectionFilter。
GPUImageSobelEdgeDetectionFilter繼承GPUImageTwoPassFilter,由兩個濾鏡組成,分別是黑白濾鏡和邊界檢測濾鏡。首先是把輸入的圖像變成亮度圖,再由邊界檢測的濾鏡轉(zhuǎn)換成邊界圖。GPUImageSobelEdgeDetectionFilter對外的屬性有三個,分別是:
texelWidth:邊界檢測時八方向的像素值寬度,默認(rèn)是1/size.width;(1像素的寬度)
texelHeight:邊界檢測時八方向的像素值高度,默認(rèn)是1/size.height;(1像素的高度)
edgeStrength:邊界檢測后,對邊界的亮度增強(qiáng)程度,默認(rèn)是1.0;(不變)
3x3矩陣中,紋理的距離寬度和高度;

邊界檢測的原理:一個像素為邊界的表現(xiàn)是左右、上下的顏色差異很大,那么通過特定的卷積矩陣來運(yùn)算,快速得到左右和上下方向的差異值之后,就可以通過這個值的大小來確定邊界;
Sobel邊界檢測的卷積矩陣如下:
水平的卷積矩陣:

-1, 0, +1
-2, 0, +2
-1, 0, +1

垂直的卷積矩陣:

?1, ?2, ?1
 0,  0,  0
+1, +2, +1

如果左右的顏色差異值很小/大,那么通過水平卷積矩陣得到的值就會很小/大;
如果上下的顏色差異值很小/大,那么通過垂直卷積矩陣得到的值就會很小/大;
于是通過兩個卷積矩陣分別得到水平差異值h和垂直差異值v后,再用sqrt(h2+v2)就可以得到邊界值。

繪制的流程

  • 1、攝像機(jī)采集圖像,得到Y(jié)UV顏色空間的圖像;
  • 2、把YUV的圖像分成亮度紋理和色度紋理,并用YUV到RGBA的轉(zhuǎn) 換矩陣,把兩個紋理合成RGBA的圖像;
  • 3、根據(jù)RGB不同的權(quán)值,把RGB顏色空間的圖像,轉(zhuǎn)換為亮度圖;
  • 4、對每一個像素,根據(jù)八方向的像素值,用水平卷積矩陣算出水平方向的差異值h;用垂直卷積矩陣算出垂直方向的差異值v;根據(jù)sqrt(h2+v2)求出明亮程度,得到邊界圖;
  • 5、調(diào)整邊界圖的大小,顯示到屏幕上。
整個流程用圖來表示

流程圖中的Texture#10,表示的是紋理對象10;綁定在紋理單元5是通過GPU Frame Capture查看。如下圖,我們可以看到紋理單元2、3、4、5中分別綁定著紋理對象3、4、9、10,并且當(dāng)前渲染的目標(biāo)是紋理對象3。


遇到的問題

1、GPU Frame Debugger 無法正常工作

這個也是別人遇到過的問題點(diǎn)擊http://www.openradar.me/28262556 可以查看。

2、無法消除的warning
System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles Reading from public effective user settings

這兩個問題,其實(shí)是同一個問題:GPU Frame Capture在默認(rèn)情況下會調(diào)用Metal的API,在正常的設(shè)備調(diào)試,會出現(xiàn)以下兩行代碼

Metal GPU Frame Capture Enabled
Metal API Validation Enabled

在調(diào)試demo過程中,我用的是Xcode8.1 + iOS 10.2.1;
iOS的版本高于Xcode版本。
解決方案:升級Xcode或者換用低版本的iOS系統(tǒng)。

總結(jié)

在處理每個像素時,根據(jù)八方向求出邊界值的過程與像素處理順序無關(guān);
這個處理的過程可以用片段著色器進(jìn)行并行計(jì)算,極大地提高處理效率。

本身攝像頭得到的YUV顏色空間里面就包括了亮度圖,但是在本文的demo中卻是經(jīng)歷了YUV到RGBA的轉(zhuǎn)換,再由RGBA到亮度圖的轉(zhuǎn)換,這里是一個可優(yōu)化的地方。

代碼不復(fù)雜,見github。

引用:《objc期刊》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容