計算機視覺工程師在面試過程中主要考察三個內容:圖像處理、機器學習、深度學習。然而,各類資料紛繁複雜,或是簡單的知識點羅列,或是有着詳細數學推導令人望而生畏的大部頭。爲了督促自己學習,也爲了方便後人,決心將常考必會的知識點以通俗易懂的方式設立專欄進行講解,努力做到長期更新。此專欄不求甚解,只追求應付一般面試。希望該專欄羽翼漸豐之日,可以爲大家免去尋找資料的勞累。每篇介紹一個知識點,沒有先後順序。想了解什麼知識點可以私信或者評論,如果重要而且恰巧我也能學會,會盡快更新。最後,每一個知識點我會參考很多資料。考慮到簡潔性,就不引用了。如有冒犯之處,聯繫我進行刪除或者補加引用。在此先提前致歉了!
邊緣檢測算子是用來提取圖形邊緣的卷積核
邊緣提取原理
邊緣處的像素值通常會有明顯變化
衡量連續的變化可以使用導數
衡量圖像像素間離散的變化使用差分
導數:(f(x+Δx)-f(x))/Δx
差分:f(x+1)-f(x)
梯度表示
梯度表示包含大小和方向
如果只有一個算子
只能表示大小
如果有兩個算子
兩個算子計算的梯度的方向是互相垂直的
如果計算的大小分別爲Gx和Gy
方向爲:
大小有三種:
Roberts
很直觀,我們會想到分別計算x方向和y方向的差分
於是我們得到兩個算子
[-1 1]
和
[-1
1]
但是我們可以發現它們計算的區域不同,只有一個點重合
所以升級爲
[-1 1
-1 1]
和
[-1 -1
1 1]
考慮到三個因素:
- 計算量
- 實驗效果
- 像素間距離很小,計算對角差分和相鄰的差分,實際意義相差不大(這點事個人理解)
於是最後產生了Roberts算子
Prewitt
以第一個算子爲例
想計算中心點x方向的梯度
額外考慮了上一行和下一行x方向的梯度
相當於取了平均
Sobel
在Prewitt取平均的基礎上
對當前行(列)增加了權重
相當於加權平均
實驗證明,這樣效果好一些
變種:
這個的加權平均就嚴格按照距離的比例關係來了
因爲對角的距離是相鄰距離的根號2倍
Laplacian
以上都是一階差分
Laplacian是二階差分
證明:
僅考慮x方向
一階:
中心點右邊的點:f(x+1)-f(x)
中心點左邊的點:f(x)-f(x-1)
二階:
中心點:
[f(x+1)-f(x)]-[f(x)-f(x-1)]=f(x+1)+f(x-1)-2f(x)
再考慮到y方向,相加即可得到Laplacian
擴展模式:
LoG(Laplacian of Gaussian)
原理
高斯平滑(模糊)和拉普拉斯結合
這個模板就不固定了
大小不再侷限於3x3
通常可以是5x5
根據方差不同
模板中的數值也不同
主要目的
高斯平滑可以去噪
該算子的一個例子(下文會介紹推導)
Canny
Canny嚴格來說應該是一種算法
步驟:
1.RGB變灰度圖(其它算子也都是計算灰度圖,沒有太大必要計算三通道再取平均,畢竟計算的是邊緣信息,顏色信息不重要)
2.高斯平滑去噪
3.使用任意算子計算梯度大小和方向(因爲要計算大小和方向,所以Laplacian等相關算子就不能用了)
4.非極大值抑制
將梯度方向分爲4部分(因爲向上和向下對於梯度沒影響,所以把360度轉換爲180度)
比如現在2行3列的7是中心點
它的方向是上下走向
找到上下方向的相鄰點4和5
因爲7比4和5大
所以7保留
注意:
一定是該方向上相鄰的兩個點
比如方向爲右上
那麼相鄰的點就是右上角和左下角
5.雙閾值邊緣連接
設定兩個閾值high和low
梯度大小大於high的保留
梯度大小小於low的去除(梯度大小修改爲0)
梯度在low和high之間的做8鄰域連接
如果8鄰域內有大於high的,那麼該中心點保留,否則去除
8鄰域就是中心點周圍的8個點
關於高斯
噪聲通常是像素值突變的點
舉個例子
在5x5的範圍內,將所有像素值平均
可以減小這種突變
實現了去噪
這樣的壞處是,圖像的信息也沒了
爲了緩解上述情況
我們想到增加中心點的權重
離中心點距離越遠,權重越小
高斯分佈滿足這一條件
所以高斯平滑算子可以用以下公式得到
進一步
LoG是高斯和拉普拉斯的結合
拉普拉斯是二階差分
所以我們對上式關於x和y分別求二階導並相加
得到
比如中心點是(3,3)
那麼LoG算子(4,5)處的值就是把x=1,y=2代入上式
還有個超參數是高斯函數的方差
方差越大,高斯函數越平緩,去噪效果越好,圖像越模糊
優缺點分析
優缺點沒那麼絕對,也很難死記硬背,還是要學會分析
上文提到,平均可以去噪
那麼有平均思想的算子就對噪聲不敏感
比如Prewitt、Sobel
有了平均思想自然會造成一定的信息模糊
所以邊緣定位會因此效果下降
Roberts沒有這種平均思想
在噪聲小的條件下,邊緣定位就會準確一些
一階差分形容像素值變化趨勢
二階差分形容變化趨勢的快慢或者說劇烈程度
顯然噪聲的變化程度劇烈
那麼沒有去噪處理的Laplacian對噪聲就會敏感
四行分別是
常見邊緣
像素變化
一階差分
二階差分
因爲梯度大小要取絕對值或者平方
所以應該將小於0的部分向上翻轉
可以看出
二階差分算子容易檢測出雙邊緣
一階算子比較適合灰度漸變
Canny這種有很多步驟的就可以根據步驟分析
高斯平滑:去噪
雙閾值連接:連接一些弱邊緣
Canny更像一個集大成者
畢竟它已經上升到算法層面了
我覺得學會分析這些就夠了,優缺點還是挺難記的
完
歡迎討論 歡迎吐槽