CS131专题-3:图像梯度、边缘检测(sobel、canny等)
目錄
1 前言
2 圖像梯度
2.1 梯度公式的離散形式
2.2 圖像的梯度表示
2.3 圖像梯度的最簡單計算方法
2.4 直接應用梯度找圖像邊緣的問題以及解決方案
3 邊緣檢測??
3.1 好的邊緣檢測器應具備的要素
3.2 簡單的邊緣檢測算子
3.2.1——Prewitt(普魯伊特)算子
3.2.2——soble(索貝爾)算子
3.2.3——Laplacian(拉普拉斯)算子
3.2.4——Roberts羅伯特交叉算子
3.2.5——上述4種算子的總結:
3.3 Canny邊緣檢測
3.3.1——常規邊緣檢測算法的2個問題
3.3.2——canny算法的原理
3.3.3——高斯核對canny算法的影響
1 前言
為什么要研究邊緣檢測?
答:直觀地說,圖像中的大多數語義和形狀信息都可以用‘邊緣’來體現。(更深層的生理原因是哺乳動物的大腦神經元對邊緣信息非常敏感)
形成圖像邊緣常見的一些原因:
- 表面形狀的突變
- 背景深度的不連續
- 顏色的突變
- 光線陰影的不連續
2 圖像梯度
2.1 梯度公式的離散形式
數學中梯度定義如下:
因為圖像是離散的二維函數,最小單位就是1像素,所以圖像中梯度公式就變為:
最簡單來說,圖像的梯度,就是兩個臨近像素點的差值。當然也可以用左右臨近的6個像素點差值和表示,這里對 f(x) 不同的看待方法,就產生了Opencv中常用的sobel、Prewitt等不同的梯度計算算子,后面會介紹它們。
2.2 圖像的梯度表示
邊緣是圖像強度函數中變化迅速的地方,邊緣可以用梯度值表示,如下:
通常情況下,圖像的梯度我們表示如下:
梯度向量指向圖像強度增長最快的方向:
梯度的方向計算公式為(角度值相對于x軸方向):
梯度的模長(幅值)——數學意義是此處梯度變化的大小,物理意義是為圖像邊緣的強度或可能性:
2.3 圖像梯度的最簡單計算方法
我們要獲得X方向梯度圖,本質上就是讓梯度圖中每個位置的像素點值代表原圖中相應位置的左右兩個像素值之差。這剛好直接把原圖跟[-1, 0, 1]行向量進行卷積就能得到!!!如下是對一個高斯核圖像進行X方向求導的示意圖:
幾點注意:
- 上圖中3D高斯核的‘水平面’代表2D高斯核圖中像素0值,高于水平面的是正數(圖像的灰度值本身就是全為正),但是得到的求導圖像,開始出現負值。
- 是跟[-1, 0, 1]卷積還是[1, 0, -1]卷積,沒有本質區別,雖然結果區域的正負號會變化,但只要事先統一確認方向,最終判定邊緣或搞其他操作,正負號并不產生影響。
提示:求Y方向梯度圖像同理,而求梯度的模長圖像,只要求X和Y的平方和再開根號就能得到。
對高斯核(可以視為一個圖像)的X和Y方向求導的3D和2D可視化結果如下:
對一般的圖像求導結果的可視化如下:(同樣注意:下圖灰度值大小并不代表具體的求導值結果,梯度值中也有負數)
2.4 直接應用梯度找圖像邊緣的問題以及解決方案
如果像下面這樣的‘簡單干凈’圖像,可以直接用圖像梯度找到邊緣:
但是大多情況下,圖像是有各種噪聲的,比如:
當圖像的像素存在大量噪點時,相鄰的像素差異大,所求梯度也會偏大,無法提取邊緣信息:(注意:之前我們講的圖像梯度是僅計算相鄰兩個像素點灰度值變化幅度,所以只要圖像模糊或有噪聲等,圖像中任何位置都可能梯度變化成隨機值)
解決方案:
- 先平滑處理:使用平滑濾波器去噪,使圖像信號變得平滑。
- 然后再對平滑后的信號求導,取極值。
過程和理論效果如下:
上述方案降低計算量的方法:
根據卷積的計算性質有:
我們可以先對平滑核求導,再進行卷積相乘,從而減少計算量,如下:
不同σ值高斯核對圖像平滑去噪后,再對圖像求導的結果如下:
3 邊緣檢測??
3.1 好的邊緣檢測器應具備的要素
- 精度要好:把假陽性(誤檢)、假陰性(漏檢)檢測概率搞得盡量低。
- 位置要準:檢測到的邊緣位置要和原圖一致。
- 連續+盡量窄:如下圖最左邊是好的邊緣返回結果,右邊3個時差的返回結果。
3.2 簡單的邊緣檢測算子
先提示幾點:
- 很多算子的核寬可以指定和變化。
- 彩色圖相當于3種灰度圖的疊加,彩色圖求梯度需要先轉成一個灰度圖。轉灰度圖主要有兩種方法:
- 方法1:Gray=(R+G+B)/3;
- 方法2:Gray=0.299R+0.587G+0.114B;(這種參數考慮到了人眼的生理特點)
- 圖像梯度對噪音非常敏感,需要先對圖像進行平滑,然后求梯度。通常濾波和邊緣檢測是矛盾的概念,抑制了噪聲會使得圖像邊緣模糊,這會增加邊緣定位的不確定性;實際工程經驗表明,使用高斯核函數可以在抗噪聲干擾和邊緣檢測精確定位之間提供較好的折衷方案。
- 使用opencv的梯度算子,實際上要取個閾值,梯度圖元素的絕對值超過閾值的部分視為邊緣。低于閾值的像素點用0值表示,表示此處沒邊緣,不為0的像素點,灰度值越高表面此處邊緣強度越大。
3.2.1——Prewitt(普魯伊特)算子
卷積核長這樣:
其利用像素點上下、左右鄰點的灰度差。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對于幅值較小的邊緣點,其邊緣反而丟失了。
效果:
3.2.2——soble(索貝爾)算子
卷積核長這樣:
Sobel 算子在 Prewitt 算子的基礎上增加了權重的概念,認為相鄰點的距離遠近對當前像素點的影響是不同的,距離越近的像素點對應當前像素的影響越大,從而實現圖像銳化并突出邊緣輪廓。
效果:
3.2.3——Laplacian(拉普拉斯)算子
四鄰域模板核長這樣:
八鄰域模板核長這樣:
效果:
3.2.4——Roberts羅伯特交叉算子
卷積核長這樣:
這網上普遍說是最簡單的算子,而且最先介紹。元素值是少并簡單,但理解感覺是最難的,而且用的很少,所以我放在最后介紹。
這是Roberts于1963年提出的交叉算子邊緣檢測方法。該方法最大優點是計算量小,速度快。但該方法由于是采用偶數模板,如下圖所示,所求的(x,y)點處梯度幅度值,其實是圖中交叉點處的值,從而導致在圖像(x,y)點所求的梯度幅度值偏移了半個像素(見下圖)。
3.2.5——上述4種算子的總結:
1)Robert算子對陡峭的低噪聲圖像效果較好,尤其是邊緣正負45度較多的圖像,但定位準確率較差;
2)Prewitt算子對灰度漸變的圖像邊緣提取效果較好,而沒有考慮相鄰點的距離遠近對當前像素點的影響;
3)Sobel算子考慮了綜合因素,對噪聲較多的圖像處理效果更好。
4)Laplacian算子對噪聲比較敏感,由于其算法可能會出現雙像素邊界,常用來判斷邊緣像素位于圖像的明區或暗區,很少用于邊緣檢測;
3.3 Canny邊緣檢測
該算法誕生于1986年,這可能是計算機視覺中應用最廣泛的邊緣檢測器,著重講一講。
3.3.1——常規邊緣檢測算法的2個問題
問題1:邊緣很粗
在如sobel這樣的邊緣檢測算子,對圖像求梯度圖后,會設置一個閾值,絕對值超過閾值的像素為視為邊緣,這就導致得到的邊緣圖中‘邊緣’會很粗。
問題2:漸變邊低于閾值
由于sobel中梯度閾值是全局性的,不能太高也不能太低,這就導致很多不明顯的漸變邊被擦除。
3.3.2——canny算法的原理
該算法整個過程如下:
- 對原始圖像進行灰度化
- 對圖像進行平滑(高斯濾波)
- 求圖像平滑后的梯度圖、以及梯度方向圖
- NMS非極大值抑制篩選
- 雙閾值+連通與否篩選
第1,2,3步
2,3個步理解簡單,但工程上具體實現時其實是這樣的:先對高斯核求導,然后求導后的高斯核對原灰度圖進行卷積操作。這樣做的目的簡化計算量,之前專題內容里有提到過原理。
假設對某圖完成1,2,3步后結果如下:
第4步:NMS
為了解決梯度圖中‘邊緣’很粗問題,我們要利用非極大值抑制算法來找到沿著梯度方向的局部最大像素點,非局部最大像素點全部變為0,就像下面這種情況:
具體怎么實現上述非極大值抑制想法呢?思想和方法很簡單,編程也不復雜,如下:
- 找沿著梯度方向線上的局部最大像素點:首先要明白,我們要找到并保留的是沿著梯度方向線上的局部最大像素點,而不是各方向局部最大像素點。因為,邊緣線一般是連通的,不能只找上下左右梯度幅值最大的那個,這么找得到的邊緣線就必定斷裂了。
- 判定方法——看C點像素值是否比dTmp1和dTmp2都大:上圖C點是梯度圖中某個像素點,它周圍有8個臨近像素點,還有一根C點位置梯度方向的可視化直線,這根直線在g1,g2像素點之間有個交點dTmp1,在g3,g4像素點之間有個交點dTmp2。雖然這兩個交點的像素值本就不存在,但可以通過附近的兩個像素點通過線性插值估算出來(這里也要用到梯度方向)。如果C像素點梯度幅值比那兩個交點大,那么這個C點就保留,否則的話,這個像素點置為0。
使用NMS算法的效果如下:(邊緣幾乎都變成單像素寬度了,亮度強度代表梯度幅值大小即是邊緣的強度)
上圖放大觀察后會發現,經過NMS后的梯度圖,邊緣寬度基本為1個像素寬度了,篩除了大量冗余的邊緣像素點。
第5步:雙閾值 + 連通區域分析
對梯度圖每個像素都做上述這種篩選,就得到極大值抑制之后的新梯度圖。走到這一步,如果直接設個梯度幅值閾值,也能直接得到沒有‘粗’邊緣的梯度圖了,但是全圖一刀切的梯度閾值肯定不好,一個好辦法是設置兩個閾值,一個高一個低,超過高標準閾值的梯度點視為‘確定邊緣’,在高標準和低標準之間的視為‘待確認邊緣’,低于低標準閾值的視為‘非邊緣’。
其中‘待確認邊緣’的進一步確認方法就是:看這個點是否在任何一個‘確定邊緣’點所形成的連通區域線上,如果在則保留,不在則排除。
如上圖,B位置的邊緣線,它們沒有跟任何一個超過maxVal閾值的點有連通,它們將全部排除。而C區域的一些梯度像素點因為和超過高閾值的梯度像素點有連通,所以這些梯度幅值雖然不大的邊緣點,同樣會被保留。
使用雙閾值 + 連通區域分析 與 單閾值的對比效果如下:
上圖右下角就是canny算法處理的最終效果,比較好的解決了上面提到的兩個問題。
3.3.3——高斯核對canny算法的影響
采用不同σ的高斯核,canny算法最終得到的效果會有較大變化,本質原因是高斯核的σ越大,則對圖像平滑效果越明顯,越是會把邊緣給平滑掉。
所以,高斯核的σ越小,最終得到的邊緣會越密集詳細,反之,邊緣會稀疏(僅保留非常明顯的邊緣)。根據這一特性,你可以根據需要,通過控制σ來讓自己獲取詳略不同的邊緣圖。
我們現在知道了計算機視覺中邊緣提取的全過程,它能有什么用呢?下一專題開始介紹其用途以及實現不同用途所需要的不同算法。
2021年11月10日完成。
總結
以上是生活随笔為你收集整理的CS131专题-3:图像梯度、边缘检测(sobel、canny等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS131专题-2:高斯核、噪声、滤波
- 下一篇: 原创:项羽分封天下非常公平,为何天下诸侯