一.邊緣檢測綜述
1.1基本概念介紹
開篇的一些廢話……
其實,這里面介紹的整體還是比較基礎、偏向新手入門的概念,不過本身自己也對這個領域了解的沒多少,可能寫的並不怎么樣,但是對於自己而言,確實也花了不少時間,在寫這個文檔的過程中,因為有很多不明白的地方,倒逼着我去查一些資料。這里需要感謝很多人在網上分享的優質的博客,以及學長、老師的對我疑問的解答,也希望這之后這里的介紹能夠幫一些新人入門,日后他人再查找時有一個墊腳石,同時,也可以作為自己的一個快速回顧,更多的是,在寫的過程中,本身是有很多收獲的。
除了最后的參考文獻外,對我在canny算子的理解上有比較重要幫助的文章有OpenCV的官方文檔;知乎上一個專欄數字圖像處理:邊緣檢測,需要注意的是,這里的非極大值抑制講的稍微有點問題,我在參考后已經更正。
譚升的博客也對我理解一下sobel算子的模板是怎么來的也提供了提供了一個新的角度,這里致謝!譚升的博客
阮一峰的博客對我理解圖像與波的過程起了很大幫助!阮一峰:圖像與波。這里也表示感謝!
還有一些學長也給我解釋了一些問題,這里也要說聲謝謝!
在最后再補充一下說明,這個本來是一個作業,要求是讀一篇sci或者頂會論文。雖然說取其上者得其中,取其中者得其下,在最開始的時候,確實很多概念不懂,對於現在以及傳統的方法具體是怎樣的都不了解,最開始頂多知道如Matlab有個edge函數,Opencv也有現成的函數,但是這些是怎么實現的,他們背后的原理,我都不清楚。所以,我選取的還是那些博士、碩士論文作為經典邊緣檢測的一個參考,雖然這些普通的論文的質量相比於頂會論文差很多,但是對於新手而言可能會容易懂一些。
本人水平有限,如果文章哪里有錯誤的地方,請見諒並請指出,我會作出修改。
1.1.1邊緣的定義及應用
什么是邊緣?這個問題看起來基礎但又至關重要,否則,邊緣檢測,連要檢測的是什么都不知道,那檢測出來的必然不會是好的結果。
目前,在傳統的邊緣檢測中,都是把邊緣定於為顏色急劇變化的區域。
在深度學習出現之前,傳統的Sobel濾波器,Canny檢測器具有廣泛的應用,但是這些檢測器只考慮到局部的急劇變化,特別是顏色、亮度等的急劇變化,通過這些特征來找邊緣。但這些特征很難模擬較為復雜的場景,如伯克利的分割數據集(Berkeley segmentation Dataset),僅通過亮度、顏色變化並不足以把邊緣檢測做好。2013年,開始有人使用數據驅動的方法來學習怎樣聯合顏色、亮度、梯度這些特征來做邊緣檢測。當然,還有些流行的方法,比如Pb, gPb,StrucutredEdge。為了更好地評測邊緣檢測算法,伯克利研究組建立了一個國際公認的評測集,叫做Berkeley Segmentation Benchmark。從圖中的結果可以看出,即使可以學習顏色、亮度、梯度等low-level特征,但是在特殊場景下,僅憑這樣的特征很難做到魯棒的檢測。比如上圖的動物圖像,我們需要用一些high-level 比如 object-level的信息才能夠把中間的細節紋理去掉,使其更加符合人的認知過程(舉個形象的例子,就好像畫家在畫這個物體的時候,更傾向於只畫外面這些輪廓,而把里面的細節給忽略掉)。[1]
在CNN的方法中,在HED(Holistically-Nested Edge Detection)方法之前,都是采用局部的信息作為特征,把圖像分解為很多patch,再去把從這些patch得到的特征合並。這樣就是缺少高層次的特征,而在HED方法中,一改之前邊緣檢測方法基於局部策略的方式,而是采用全局的圖像到圖像的處理方式。即不再針對一個個patch進行操作,而是對整幅圖像進行操作,為高層級信息的獲取提供了便利。與此同時,該方法使用了multi-scale 和multi-level, 通過groundtruth的映射在卷積層側邊插入一個side output layer,在side output layer上進行deep supervision,將最終的結果和不同的層連接起來。[5]
[2]
這是HED方法與Canny算子檢測效果的對比,可以看出HED方法比canny算法有一個明顯的優勢。這可能意味着之后邊緣檢測研究的發展方向。
[2]
如圖所示,加上deep supervision后,該方法可以在不同尺度得到對應抽象程度的邊緣。
[2]
可見,該方法的效果有了很大提升(最上面的藍色線即是該方法)。
可以預見,未來的邊緣的定義必將是更高層次的抽象,但是由於本人能力所限,同時,目前大部分傳統的邊緣檢測方法中都是把邊緣當作上面定義的“顏色急劇變化的區域”,因此,本文后面對於邊緣的定義也是“顏色急劇變化的區域”。
邊緣特征是圖像的一個重要特征,圖像的邊緣一般是圖像的灰度或者顏色發
生劇烈變化的地方,而這些變化往往是由物體的形狀結構、外部的環境光照和物體
的表面對光線反射造成的。圖像的邊緣能直接反映物體的輪廓和拓撲結構信息。圖
像邊緣檢測技術是數字圖像處理、模式識別、計算視覺的重要基礎之一。圖像的邊
緣檢測技術廣泛應用於工業檢測、圖像分割`,、運動檢測、人臉識別和目標
跟蹤等領域。圖像邊緣檢測的結果直接影響物體檢測和識別的效果。[3]
1.2邊緣檢測方法簡介
對於傳統邊緣檢測,目前大致有三類邊緣檢測方法:
圖像中的邊緣檢測一直是機器視覺領域中的研究熱點,從年代至今,人們已經從不同的角度、不同的應用背景提出了很多方法,歸納起來分為三大類。
第一類是經典的邊緣檢測方法,如微分算子法、最優算子法和擬合法等。
第二類是以能量最小化為准則的全局提取方法,其特征是運用嚴格的數學方法對此問
題進行分析,給出一維值代價函數作為最優提取依據,從全局最優的觀點提取邊緣,如松馳法。
第三類是以小波變換、數學形態學、模糊數學、分形理論等近年來發展起來的高新技術為基礎的圖像邊緣提取方法,尤其是基於多尺度特性的小波變換提取圖像邊緣的方法是目前研究較多的課題。其中,以上每一類都包含各種不同的邊緣檢測算法。[1]
此外,還誕生了一些如基於神經網絡的邊緣檢測等近年來新興起的方式。
在這里,由於本人並沒有深入、系統地學習過圖像處理,能力所限,主要介紹一下經典的邊緣檢測算法里的算子的方法,以及在傳統的圖像識別里的sift特征里同樣提到的尺度空間概念。
1.2.1經典的邊緣檢測
這些方法都是前人研究留下的結晶,我認為首先先把他們的研究盡可能地去理解好,才能幫助啟發我們自己的算法,在這個整理的過程中,我看到了很多思路在不同領域的運用。
1.2.1.1微分算子法
微分算子法是我們目前相對來說最熟悉的一種方法,是最原始、最基礎的邊緣檢測的算法。這類算法主要是基於梯度,分為一階微分算子和二階微分算子兩類。一階微分算子即通過計算其像素點的灰度或RGB值的梯度變化,一階微分較大者有較大可能是邊緣,常見的有sobel算子,Robert算子,prewitt算子等。所有基於梯度的邊緣算子之間的根本區別在於算子應用的方向,以及在這些方向上逼近圖像一維導數的方式和將這些近似值合成為梯度幅值的方式不同。[3]在數字圖像中常常以圖像的一階差分運算代替圖像的一階微分運算。
∆_x I(i,j)=I(i,j)-I(i-1,j) ①
∆_y I(i,j)=I(i,j)-I(i,j-1) ②
Roberts算子就是直接運用該差分,得到的模板。
但是一階微分算子由於是一個梯度,具有方向性,因此在模板上,它具有一定的方向的選擇性,如果圖像中邊緣比較契合該方向,則檢測效果會比較好,如果邊緣方向大多與該方向垂直,則可能檢測效果比較差。由於該問題,出現了具有各項同性的Laplacian算子。
∇⋅∇ψ=(∂^2 ψ)/(∂x^2 )+(∂^2 ψ)/(∂y^2 ) ③
由於各項同性,對於各方向無差別,所以,它也有無法提供邊緣方向的問題;另外,由於Laplacian算子是二階微分,其近似也是通過二階差分,所以該算子對於噪聲的影響也會比一階差分更大,這也是我們在一些文章中看到說Laplacian算子對噪聲敏感的由來。
在實際計算中,一般通過卷積操作來近似計算,一階微分和二階微分在形式都比較相近,在卷積過程中,均通過相應的模板進行運算。
以下是常見的一階微分模板:
以下是二階微分Laplacian算子的模板:
以下是用MATLAB自帶的edge函數實現的邊緣檢測效果對比
一個比較直觀的感受是,最優算子法的canny算子和LOG算子的閾值明顯比微分算子法的sobel算子或Roberts算子要低,后者的漏檢率相對較高,相應地噪聲會比較少;前者的漏檢率較低,誤檢率也相應地提高了,在這幾種算子中canny算子對背景的塔的檢測也更好,但是對於海水的檢測則顯得不是那么好。
1.2.1.1.1關於銳化算子模板里所有數之和為0的原因
當時在上面介紹自己的已完成的部分的時候,講到對這些算子模板的介紹時,老師曾在下面提到“模板里所有數加起來為0”,當時並不知道為什么,最近,我在學習圖像處理以及在查詢相關論文時看到一些零碎的概念,突然就明白了這里是一個“灰度偏移”的概念。我們可以想象,如果把這個濾波器放進一個圖像的一個局部,如果這里不是邊緣,也就是這個局部的點的灰度或者RGB的值會非常接近,當進行卷積運算時,這里的值就會很接近於0,也就是不是邊緣。
以Laplacian算子的模板為例。
假設這個矩陣是圖像的非邊緣部分 ,那么它的和就為0。反之,如果模板中各數和不為0,那么,即使在非邊緣,卷積得到的值也可能得到一個不小的值,造成這里可能是邊緣的誤判。因此,算子模板里所有數之和一般均為0.
1.2.1.1.2關於算子模板究竟如何得來的個人理解
我拿最簡單、最好理解的Roberts算子為例,進行說明。
我把Roberts算子模板再次拿過來:
從這個算子的運算可以看出,是該點與對角線元素的灰度差的相反數,其實是一階差分的計算,而一階差分又是一階微分的近似。
也是說 模板–(等於)–>差分–(近似於)–>梯度。
然后我覺得其他的算子應該也是大概這麽個思路,可是像sobel算子具體怎么來的,我現在能力有限,並不是很能推出。
我找了很多博客都沒找到sobel算子怎么來的。
在OpenCv的官網上的OpenCv-Python Tutorials里的Image Gradients這一章節里,對sobel算子有這樣一句描述:sobel算子是高斯平滑和微分的結合,因此它更抗噪聲。
我猜想這里可能是因為高斯函數的加入導致了這樣的算子,但是OpenCv上只是主要講解該函數的用法而不是詳細介紹該算子,因此對於它的推導過程我仍然是不清晰。
在譚升的博客里,有這樣的描述:sobel算子模板理解–譚升
這個帕斯卡三角也給出了關於sobel算子55,77等更大維度的濾波器的參數的推廣。
但是究竟是不是這樣,我沒有一個確定的答案,我甚至懷疑是不是也是根據實踐的經驗得到的而不是從0到有一步步推出來的,就像神經網絡的架構,因為某次實踐中發現這個架構的效果比較好,就拿來了這個架構,而不是從理論上推出,這導致了神經網絡一直被提出新的架構,而不是能夠根據某個理論直接提出一個最優的架構,似乎與這些不斷提出的算子也有着一些相似之處。
1.2.1.2最優算子法
這類方法是在微分算子的基礎上發展起來的邊緣檢測算子,根據信噪比求得檢測邊緣的最優濾波器。常用的有Canny算子和LOG算子(拉普拉斯高斯算法)。
1.2.1.2.1 Canny算子
Canny算子則是種一階微分的邊緣檢測算法,它也是先通過Gaussian函數進行平滑,然后對圖像進行一階微分求極大值確定邊緣。Canny首次在邊緣提取算法中引入“非極大值抑制”的思想。如我最開始接觸到邊緣檢測是在吳恩達的深度學習的視頻里一樣,這個非極大值抑制的概念我也是在目標檢測這一章中最先看到的,它是用來優化YOLO算法的,不過現在在查閱邊緣檢測的論文里又出現了這個概念,而且是邊緣檢測里先引入,我就更加感受到雖然在不同的方向,卻有很多共通的思想。
下面,我會更詳細地介紹它的具體過程。
1.2.1.2.1.1噪聲去除
前面已經提到,導數對噪聲很敏感,因此,我們會先對圖像進行高斯平滑,具體的高斯平滑的概念我會在后面介紹。
1.2.1.2.1.2計算圖像梯度
這里根據sobel算子計算出水平方向和豎直方向的一階導數(圖像梯度G_X和G_y),並據此計算邊緣的梯度的方向。
對於梯度的計算,考慮到開方運算相對比較耗時,實際計算中可以用以下公式替代:
1.2.1.2.1.3非極大值抑制
上一步得到的梯度圖像存在邊緣粗寬、弱邊緣干擾等眾多問題,因此還要用非極大值抑制來處理,C表示為當前非極大值抑制的點,g1-4為它的8連通鄰域點的一部分。
圖中藍色線段表示上一步計算得到的角度圖像C點的值,即梯度方向。dTmp1和dTmp2是在C點梯度方向的插值(因為梯度方向的對應的點不一定落在八鄰域里)。
這樣就使得邊緣細化。因此最后生成的圖像應為一副二值圖像,邊緣理想狀態下都為單像素邊緣。
1.2.1.2.1.4滯后閾值
現在要確定那些邊界才是真正的邊界。這時我們需要設置兩個閾值:minVal 和 maxVal。這也是我們經常看到的所謂的Canny算子的雙閾值,當圖像的灰度梯度高於 maxVal 時被認為是真的邊界,那些低於 minVal 的邊界會被拋棄。如果介於兩者之間的話,就要看這個點是否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是就拋棄。如下圖:
A 高於閾值 maxVal 所以是真正的邊界點, C 雖然低於 maxVal 但高於minVal 並且與 A 相連,所以也被認為是真正的邊界點。而 B 就會被拋棄,因為他不僅低於 maxVal 而且不與真正的邊界點相連。所以選擇合適的 maxVal和 minVal 對於能否得到好的結果非常重要。在這一步一些小的噪聲點也會被除去,因為我們假設邊界都是一些長的線段,而不是孤立的點,與老師提到的方法是一致的。
顯然,這里的一個難點就在於如何處理中間的部分,即尋找弱邊緣。這里的判斷介於中間的點是否與邊緣相連,與老師最開始在課上講的方法基本一致,這個方法的實現也是比較麻煩,同時,由於計算代價過大,因為使用的是遞歸思維,且所找尋到的弱邊緣點為數不多,因此實際應用中常常舍去這一步驟,取而代之的是基於形態學的邊緣細化操作。
1.2.1.2.2LOG算子
LOG算子是一種二階微分的邊緣檢測算法,是在拉普拉斯算子的基礎上改進,也就是在拉普拉斯算子前先用Gaussian函數對圖像進行平滑。事實上,我們已經在前面提到,Laplacian算子由於其是二階差分,對噪聲比較敏感,因此在進行Laplacian算子的計算時,先對其進行平滑處理,可能會使該算子的效果更好,也是比較方便我們理解的一種算子。
1.2.1.3擬合法
在我目前的學習來說,基本還沒有接觸過基於擬合法的邊緣檢測。因此,也算是比較陌生的一類。主要是因為擬合這一過程的計算量比較大,是基於圖像的統計特征去提取邊緣,一般用的也就比較少,只在一些比較大的視覺系統里用到。這里只是提一下,它的基本思想是根據最小二乘方法把圖像的局部區域近似表示為一組基函數的線性組合,再根據擬合參數求得邊緣,這種方法具有更高的抗噪聲能力。
1.2.2多尺度邊緣檢測----sift特征
最開始上課時老師曾提到過這個sift特征不變性的概念,當時也是完全不了解,后來同樣也是在學習圖像識別時偶然發現這樣一個概念。Sift特征是一種傳統的圖像識別的手段,它是一種模仿人的生理的設計,考慮到了一種視覺的不變性。比如一頭大象,我們近處看,可能是大象很大,如果在遠處看,那么看的大象可能就比較小,就是基於這樣一種“近大遠小”的理念,他們提出了“尺度空間”的概念。
通過不同的標准差,可以產生不同的尺度大小,尺度大的則模擬了近處看,尺度小即模擬了遠處看。同時,尺度大時噪聲的影響相對較小,相應地,也損失了圖像的細節;而尺度小時受噪聲影響比較大,圖像細節則保持地更好。通過不同尺度下進行分別檢測,加以綜合,以期能夠結合大小尺度的優勢,那么其關鍵就在於如何選擇不同的尺度以及如何進行多尺度的綜合。目前所看到的論文中,大多是采用從粗到細或從細到粗的綜合策略。
1.3.基於神經網絡的邊緣檢測簡介
隨着深度學習的快速發展,基於神經網絡的邊緣檢測也被提出,這種方法實質上是將邊緣提取過程視為邊緣模式的識別過程,只是在算法實現上利用了神經網絡[1]。神經網絡所具有的自組織性、自學習性以及自適應性決定了神經網絡用於邊緣檢測的可行性。傳統的微分算子以及最優算子法均需要人工設置閾值,閾值設置過高可能導致邊緣斷裂、不連續,從而丟失邊緣信息。閾值設置過低可能導致提取的邊緣中出現過多的偽邊緣,甚至將噪聲當做邊緣提取。[1]而基於神經網絡的邊緣檢測則不需要人工設置閾值,只需要通過樣本中學習,就能獲得一定的特征。神經網絡的主要問題是,其學習的質量受樣本質量影響較大,如果樣本的質量不夠好,那么學習的最后過程也必然不會好;另外一方面,是神經網絡的結構設計上,需要人為去設計。
另外,在學習《數字圖像處理》【岡薩雷斯】時發現,像一些所謂濾波器、padding、pooling等操作並非只是CNN特有,而是傳統圖像處理里本來就存在的,同樣感受到這樣的一種交叉融合。
1.4.邊緣檢測的步驟
其實在我看了一下剛雷薩斯的數字圖像處理時發現這里的圖像濾波和圖像增強都是通過空間濾波或頻率域濾波實現的,但是時間所限其實我並沒有怎么看,只是粗略地看了一下大概,所以並不是很能深入理論地去介紹,更多的是通過比較直觀、比較簡單的去介紹這些內容。
邊緣檢測主要包括以下四個步驟:濾波、增強、檢測、定位。[4]
1.4.1圖像濾波
1.4.1.1為什么叫濾波?圖像與波的關系?
提到圖像處理,我們會經常看到圖像濾波,濾波器等等概念,但是為什么要稱為“圖像濾波”,“濾波器”呢,圖像跟波有什么關系呢?
沒錯,圖像還真的與波有很大的關系,事實上,圖像是可以用波來表示的。
那么,圖像如何用波來表示的呢?這里,我又想到了CNN,在CNN的最后,常常將最后的卷積層展開為1維向量,如下圖:
上圖中用紅色標記的部門,就是將這樣的5516的張量展開為11400的張量。這里其實也是傳統機器學習里對於圖片的處理方式。看到這,有沒有一點聯想呢?
圖像,實際上也是一個(None,None,3)(對於彩色圖而言)的張量,(None表示可能是任意值)。類似地,我們可以將圖像的三個通道分別展開為RGB三個通道的一維的向量。
下面這張圖片是一張4004003的張量
如果把每一行所有像素(上例是400個)的紅、綠、藍的值,依次畫成三條曲線,就得到了下面的圖形。
X軸代表展開的一維向量的下標,Y抽代表8位二進制大小的灰度值。
可以看到,圖像就這樣表示為波的形式,同時,對比原圖可以發現,曲線波動較大的地方,也是圖像出現突變的地方。
這說明波動與圖像是緊密關聯的,圖像本質上就是各種色彩波的疊加。
1.4.1.2頻率
在用波來表示的圖像中,圖像就是色彩的波動:波動大,就是色彩急劇變化;波動小,就是色彩平滑過渡。即頻率越大的地方,色彩變化越劇烈,也越可能是邊緣;頻率越小,色彩變化越平緩,越不可能是邊緣。看到這里,想必大家也就明白了,頻率在這里,就充當了一個“梯度”的作用,用來衡量其是邊緣的程度。
1.4.1.3常見濾波器介紹
我們知道了頻率的含義,對於濾波器的理解就會更深一步,在我粗略地看岡薩雷斯的數字圖像處理的時候,在頻率域這一章節中看到了很多次兩個名詞,就是下面提到的低通濾波器和高通濾波器,但是當初看的時候,並不知道圖像可以表示為波,也不知道這兩個概念該如何理解,直至恰巧看到了阮一峰的博客,才豁然開朗。
物理上對波的處理已經比較深入,這里舉出兩類常用的濾波器,包括:
(1)低通濾波器(lowpass):減弱或阻隔高頻信號,保留低頻信號,即可以起到“平滑”的作用。需要注意的是,高通信號包括噪聲和邊緣,在平滑去噪的同時,也會造成邊緣的模糊。
(2)高通濾波器(highpass):減弱或阻隔低頻信號,保留高頻信號,即可以起到“銳化”的作用。
實際上,在前面提到的微分算子所用到的模板就是屬於高通濾波器,這里就不再重復,通常,在使用高通濾波器前,需要先使用低通濾波器,為什么呢?
前面我們提到了目前傳統邊緣檢測主要還是基於微分算子,而無論是一階導數還是二階導數,對噪聲都比較敏感,因此,在進行檢測前,我們需要使用低通濾波器來進行去燥以降低噪聲的影響。事實上,最優算子法(LOG算子和Canny算子)也就是這樣做的,它們分別對二階微分算子Laplacian和一階微分算子先進行Gaussian平滑,然后再進行檢測操作。
下面,我會介紹一下兩種常見的低通濾波器:
1.4.1.3.1均值濾波
均值濾波就是將每個點的8領域作為模板,計算其灰度的平均值作為該點的灰度值。均值濾波本身存在着固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。因此,在實際應用中,我們常用的是下面提到的高斯濾波。
1.4.1.3.2高斯濾波
高斯濾波,在前面尺度空間那部分我已經稍微地提到了一些它的相關概念,這里主要是做一些補充。
這是一個常見的高斯分布的圖像,我們可以只看紅黃藍三條曲線,在這里,一個曲線與坐標軸的面積的總和是一定的。在圖像中,我們的縱坐標其實就是灰度值的大小,我們可以通過控制其標准差,來控制其平滑的程度,標准差越大,整體就越平滑。我們可以看到通過控制標准差,可以很顯著地將中央的值很高的點降低很多。其表現形式也是中央高,然后周圍相等距離的領域的值相同,因此也算子的模板也是這種形式。
1.4.1.4中值濾波
中值濾波不是濾波器,但是也有着圖像平滑的效果,因此也將其列在這里。如果要再次與CNN聯想,我會想到pooling這個概念,在CNN中,pooling有最大值池化和均值池化,這里的中值濾波,在我看來,就像是“中值池化”。
中值濾波是指,將一個點的3*3的領域的灰度值排序后的中值作為該點的灰度。它的思想是,將可能是孤立點的“偽邊緣點”(噪聲)丟棄,保留的總是不太可能是噪聲的點。假如有一個點與周圍的點的灰度相差極大,那么它也就是一個噪聲點,通過中值濾波,它就被忽略掉而被用中值代替。當然,這樣也有局限性,即如果這樣的噪聲點有5個,即可能存在過濾失敗的可能。中值濾波主要用於解決胡椒噪聲(又叫脈沖噪聲)的問題(即這種孤立的噪聲比較多的噪聲),效果比較好。
1.4.2圖像增強
圖像增強包括平滑和銳化。
平滑:可以將整體的灰度值變得更加平坦,如上面的Gaussian濾波等,主要用於去噪。平滑操作是很多邊緣檢測對圖像進行預處理的不可缺少的一步。
銳化:即使原本大的更大,原本小的更小,將有顯著灰度變化的點的變化放大。
這樣做有什么用呢?之前在學python爬蟲的時候,有一個驗證碼識別的例子,正好與銳化相關。
這是一個比較常見的驗證碼的圖像,我們要用OCR對其進行識別,可是這個圖像有很多的干擾線條,如果直接識別,識別效果會很差。但是如果通過轉灰度、二值化處理,就會變成下面這樣,黑白分明,無多余的線條干擾,識別的成功率就大大提高。
Import tesserocr
from PIL import Image
Image = Image.open('imagename.jpg')
Image = image.convert('L')
threshold = 127
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
Image = image.point(table, '1')
result =tesserocr.image_to_text(image)
print(result)
這里其實也是這樣一個思想,我先設定一個閾值,如果小於這個閾值(原本比較小的)我就讓它為0(讓它更小),大於這個閾值的(原本比較大的)我就讓它為1(讓它更大)。
這是在驗證碼識別里講到的,它的思想就是銳化,目的就是去掉一些干擾,讓圖像更清晰,這只是簡單的二值化處理,還有其他的很多更復雜的方法,但是這些方法背后的思想都是一樣的。
1.4.3圖像檢測
設置一個閾值,灰度變化的梯度或者再加上其他的一些評估條件與閾值比較,找出邊緣,其實這一步相對比較直接,重點在於前面的預處理的工作。
1.4.4圖像定位
關於圖像定位,因為我本身還沒專門去看過傳統數字圖像處理方面的東西,然后我現在所了解的其實是基於深度學習的目標檢測方法。
在深度學習中,圖像定位的實現,其實就是在原有的圖像分類中加以改進。在圖像分類中,本來要輸出的只是經過softmax函數得到的是某類圖像的概率值,而在目標檢測中,其實就是把輸出的結果,除了輸出softmax值外,還會有一個標簽標記是否檢測到物體,如果檢測到物體,就會用四個參數,分別表示矩陣的左上角的坐標x,y,以及矩陣的長和寬,通過這樣一個矩陣把目標定位出來。
根據所看到的一些資料,目前圖像定位大概有以下大類:
①基於灰度:一般稱為模板匹配, 直接以灰度進行匹配效果不好,對光照很敏感,所以一般會以灰度歸一化互相關(NCC)作為匹配依據,增強光照變化下的魯棒性,為了降低計算量,多采用圖像金字塔來實現先粗后精的方式加快匹配速度,匹配出像素位置后,會進一步做亞像素插值,使匹配出的位置達到更高的精度,處理旋轉和縮放也很直接,就是在限定的角度范圍和縮放比例內,取一定的步長生成多張模版,一一進行匹配。模版匹配處理遮擋比較困難,對光照變化想當敏感,如果有遮擋,一般情況下就不好使了。
②基於特征:比如上面提到的sift特征,surf特征,這個方法在OpenCV中也有一些現成的函數,其大致思路就是提取特征點,用算法迭代求出相互匹配的特征,求出這些匹配特征點之間的變換關系。處理旋轉縮放也很直接,選用具有仿射或投影不變性的特征即可。基於特征的匹配,對光照不太敏感,也可以一定程度上處理遮擋,提速和提高精度的方法和模版匹配里提到的基本相同,當然如果圖像中提取不到足夠多的特征點的話,這個方法就很難奏效了。
③基於幾何形狀:就是提取模版中的邊緣和梯度,梯度方向等圖像高頻的部分,作為匹配的依據,對抗旋轉縮放,提速,提高精度也和上面的類似。這一部分完整公開可用的代碼很少,幾乎沒有,opencv里也沒涉及,但這個算法被絕大多數商業庫采用,因為它可以在光照變化,形變以及遮擋的情況下達到很高的魯棒性。
參考文獻
References:
[1]. 董鴻燕, 邊緣檢測的若干技術研究, 2008, 國防科學技術大學. 第 148頁.
[2]. Xie, S. and Z. Tu, Holistically-Nested Edge Detection. International Journal of Computer Vision, 2017. 125(1/3): p. 3-18.
[3]. 曾俊, 圖像邊緣檢測技術及其應用研究, 2011, 華中科技大學. 第 119頁.
[4]. 段瑞玲, 李慶祥與李玉和, 圖像邊緣檢測方法研究綜述. 光學技術, 2005(03): 第415-419頁.
[5] 程明明 邊緣檢測年度進展概述 VALSE2017