深度學習筆記(21) 邊緣檢測

2021-09-24 05:26:53 字數 2691 閱讀 2644

在計算機視覺中使用的比較多的就是卷積神經網路

卷積運算是卷積神經網路最基本的組成部分

邊緣檢測相對比較容易理解,就把它作為卷積運算的入門樣例

在人臉識別中:

神經網路的前幾層有可能是檢測邊緣的

後面的層有可能檢測到物體的部分區域

更靠後的一些層可能檢測到完整的物體

這個例子中就是人臉

給了上面這樣一張,讓電腦去搞清楚這張**裡有什麼物體

可能做的第一件事是檢測中的垂直邊緣

比如說,在這張中的欄杆就對應垂直線

與此同時,這些行人的輪廓線某種程度上也是垂線

這些線是垂直邊緣檢測器的輸出

同樣,可能也想檢測水平邊緣

比如說這些欄杆就是很明顯的水平線

看乙個例子,這是乙個6×6的灰度影象

因為是灰度影象,所以它是6×6×1的矩陣

而不是6×6×3的,因為沒有rgb三通道

為了檢測影象中的垂直邊緣,可以構造乙個3×3矩陣

在共用習慣中,在卷積神經網路的術語中,它被稱為過濾器

構造乙個3×3的過濾器,像這樣

在**它有時候會被稱為,而不是過濾器

對這個6×6的影象進行卷積運算,卷積運算用 「 * 」 來表示

用3×3的過濾器對其進行卷積

這個卷積運算的輸出將會是乙個4×4的矩陣,可以將它看成乙個4×4的影象

為了計算第乙個元素,在4×4左上角的那個元素,使用3×3的過濾器,將其覆蓋在輸入影象

然後進行元素乘法(element-wise products)運算,所以

然後將該矩陣每個元素相加得到最左上角的元素

即3+1+2+0+0+0+(-1)+(-8)+(-2)=-5

一步一步向右移動,到達邊緣時,移動下一行

重新從左向右移動,得到下圖

為了更清楚一點,這個 -16 是通過底部右下角的3×3區域得到的

來看另外乙個例子,了解垂直邊緣檢測是怎麼做到的

這是乙個簡單的 6×6 影象,左邊的一半是10,右邊一般是0

如果把它當成乙個,左邊畫素值10是比較亮的畫素值,右邊畫素值0比較暗

有乙個特別明顯的垂直邊緣在影象中間

這條垂直線是從黑到白的過渡線,或者從白色到深色

這裡的維數似乎有點不正確,檢測到的邊緣太粗了

因為在這個例子中,太小了

如果用乙個1000×1000的影象,而不是6×6的

會發現其會很好地檢測出影象中的垂直邊緣

在這個例子中,在輸出影象中間的亮處

表示在影象中間有乙個特別明顯的垂直邊緣

從垂直邊緣檢測中可以得到的啟發是,因為使用3×3的矩陣(過濾器)

所以垂直邊緣是乙個3×3的區域

左邊是明亮的畫素,中間的並不需要考慮,右邊是深色畫素

在這個6×6影象的中間部分,明亮的畫素在左邊,深色的畫素在右邊

就被視為乙個垂直邊緣

卷積運算提供了乙個方便的方法來發現影象中的垂直邊緣

相似的,水平邊緣過濾器也是乙個3×3的區域,它的上邊相對較亮,而下方相對較暗

總而言之,通過使用不同的過濾器,可以找出垂直的或是水平的邊緣

在歷史上,在計算機視覺的文獻中,曾公平地爭論過怎樣的數字組合才是最好的

所以還可以使用sobel的過濾器:

還有一種叫做scharr的過濾器:

它的優點在於增加了中間一行元素的權重,這使得結果的魯棒性會更高一些

它有著和之前完全不同的特性,實際也是一種垂直邊緣檢測

如果將其翻轉90度,就能得到對應水平邊緣檢測

當真正想去檢測出複雜影象的邊緣

不一定要去使用那些研究者們所選擇的這九個數字,但可以從中獲益匪淺

把這矩陣中的9個數字當成9個引數,並且在之後可以學習使用反向傳播演算法

其目標就是去理解這9個引數

將矩陣的所有數字都設定為引數,通過資料反饋,讓神經網路自動去學習它們

會發現神經網路可以學習一些低階的特徵,例如這些邊緣的特徵

儘管比起那些研究者們要更費勁一些

但確實可以動手寫出這些東西

不過構成這些計算的基礎依然是卷積運算

使得反向傳播演算法能夠讓神經網路學習任何它所需要的3×3的過濾器

並在整幅上去應用它

去輸出這些,任何它所檢測到的特徵

不管是垂直的邊緣,水平的邊緣,還有其他奇怪角度的邊緣

所以這種將這9個數字當成引數的思想,已經成為計算機視覺中最為有效的思想之一

參考:

邊緣檢測學習筆記

cv2.sobel src,ddepth,dx,dy,ksize src 影象 ddepth 影象深度 cv 64f表示雙精度浮點型 dx,dy水平和數值方向 ksize sobel運算元,取值3 31的奇數。因為運算元矩陣一定要存在中心點。import cv2 as cv defshowimg i...

OpenCV學習筆記 6 邊緣檢測筆記

void roberts inputarray src,outputarray dst,int ddepth,int x 1,int y 0,int bordertype border default void conv2d inputarray src,inputarray kernel,outp...

opencv學習筆記2 邊緣檢測

總結 roberts運算元檢測方法對具有陡峭的低雜訊的影象處理效果較好,但是利用 roberts 運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。sobel運算元檢測方法對灰度漸變和雜訊較多的影象處理效果較好,sobel 運算元對邊緣定位不是很準確,影象的邊緣不止乙個畫素。prewitt...