1. 程式人生 > >【轉載】超畫素分割與超畫素合併/區域合併/多尺度分割

【轉載】超畫素分割與超畫素合併/區域合併/多尺度分割

     最近兩年,超畫素分割方法非常火爆,計算機視覺、模式識別許多方向都興起了超畫素研究的熱潮,提出的方法也比較多。其實這不是個什麼新鮮的東西,以前的許多分割演算法所獲得的結果都可以稱為超畫素,如Watershed,meanshift,graph-based segmentation,只不過後來興起一種加入形狀約束,使得到的區域如同細胞一般比較緊湊。個人覺得這對某些應用還是有一些好處的,比如這些小區域排列規整,可以把以前基於畫素的方法改造改造加以應用,統計特徵比較好保持等。

    鑑於最近總有一些朋友在問超畫素合併怎麼弄?原因其實很簡單,超畫素分割的程式碼很多都已經被公開了,沒有技術含量,應用又做不來,找個相對容易入手點兒的。總結一下目前常用的超畫素分割方法,以及基本的區域合併方法,希望對感興趣的朋友們有用。

1、超畫素分割方法

      常見的超畫素分割方法:TurboPixel,SLIC,NCut,Graph-based,Watershed(Marker-based Watershed),Meanshift等等, 這裡列舉幾種我常用的方法及其效果


需要指出的是,其實分水嶺方法效果非常好的,在TurboPixel那個文章中實現的分水嶺方法絕對有問題。真實的效果絕對不是那個樣子。

      演算法的效率:這個是本人比較關心的問題,因為是個急性子,等不得程式跑半天出不來結果。這也是為什麼上面只列舉了4種方法(其實還有些效果非常好的方法,只是自己想的,沒有參考文獻),因為有些方法效率太低,比如TurboPixel,NCut什麼的,等得讓我難受死。整體而言,在效率方面,以上四種方法都非常好,處理481*321的影象只需要0.15 s左右(筆記本i7 4500U, 2.1Ghz),對較大的影像效率也非常好。 經典的Turbopixel, NCut什麼的在效率上被甩了N條街了....

      個人建議:如果非常看重緊湊度,選擇NCut和SLIC;非常看重效率,SLIC和Watershed;非常看重邊緣精確度和後期區域合併效果:Marker-based Watershed 和 Meanshift。 如果你僅僅是止步於超畫素層次,就開始應用了,那麼選擇SLIC吧,速度,緊湊度都非常好;如果要做後面的區域合併,SLIC不一定拼得過後面三種方法。

2、區域合併方法

        區域合併基本方法:區域合併是實現比較精細的分割重要方法,常採用的方法可以是層次區域合併(Hierarchical Stepwise Region Merging),也可以是簡單的剔除小區域(EDISON原始碼裡面的Prune函式)。層次區域合併雖已提出多年,但仍然是頂尖的方法(K. Harris, 1998, IEEE TIP, Hybrid image segmentation using watershed and fast region merging),這個文章裡面提及了區域鄰接圖(Region Adjacent Graph, RAG)和最近鄰域圖(Nearest Neighbor Graph,NNG)的概念,非常清晰明瞭。雖然後來有些人對RAG和NNG翻譯了一下,在中文期刊上發表了不少文章,其實都是簡單的實現了一遍,翻譯了一下。在我看來沒有啥創新,不過大家可以搜搜看,作為學習的參考。對這些方法的改進提了一些,但是有些是站不住腳的,僅僅是因為程式設計水平有限,沒有把別人的方法實現好,以此卻說別人的方法效率低。具體我就不點出來了。

RAG和NNG記錄區域合併一個簡單的示例


區域合併的代價:最早,區域合併是問題的數學解釋其實是分片的影像擬合(Jean-Marie Beaulieu,1989, IEEE TPAMI, Hierarchy in Picture Segmentation: A Stepwise Optimization Approach ),每次的區域合併都會帶來整個擬合誤差的增加,這個增加量稱之為合併代價,在圖2中表現為,圖的每條邊都是有權重的,這個權重就表示這兩個區域合併對整個影象擬合誤差帶來的增加量,具體的推導參見原文吧。

                                                                                     

其中N表示面積,μ表示區域的光譜平均值,這個合併代價後來又衍生出了很多版本,這個是大家關注的重點。比如把(μi-μj)2換成光譜直方圖距離的,加入形狀約束的,加入紋理約束的等等。這個選擇取決於你處理的影象是啥,比如對於SAR影象,可能得更多的考慮統計特性,對於高光譜的遙感影像,得考慮光譜曲線相似性等。因為個人是研究遙感影象處理的,對於普通的遙感影象,自然影像,推薦Multi-resolution, object-oriented fuzzy analysis of remote sensing data for GIS-ready information這篇文章中的準則,主要是其適應性比較好,比較穩定。(順便打個小廣告:A Spatially-Constrained Color-Texture Model for Hierarchial VHR Image Segmentation,其實效果也很好,不過稍慢一些,畢竟模型複雜很多)。以下是兩者準則下的效果:

通過對比就可發現了,其實SLIC對於區域合併而言,效果一般。其實在當前流行的超畫素分割中,SLIC已經算好的了,其他的方法效果相比真是沒法看了....

演算法效率:如果按照原版的RAG和NNG實現,速度非常快的,關鍵看你技術水平怎麼樣了,具體實現非常麻煩,我用到了RBTree這樣的結構,如果有用C++程式設計實現該功能的看官,可以考慮下什麼地方可以用這個優化下。在我實現的版本里,對於481*321的圖,採用以上超畫素分割方法和推薦的合併準則,對於約700個初始區域,包括讀取影像,區域合併,儲存結果,花費0.236s,1200個初始區域 0.26s,更極端的,154401個初始區域(1個畫素1個區域),花費2.1s,用我那個相比複雜一點的準則,時間略多一些,大概是前一組實驗的2.5倍時間。 2.1s合併掉15W個區域,速度其實已經滿足絕大多數的計算機視覺和模式識別中的影象處理需求了,如果進行並行可以實現近乎實時了。

3、區域合併的終止/尺度選擇

何時終止區域合併的過程?這是研究的熱點之一。常用的方法是設定一個閾值,當合並的代價值超過給定的閾值時,合併終止。然而一個重要的問題是,這個值常常需要手動設定。這無法實現對不同影像的精確分割。

在遙感影象處理領域,可以稱之為尺度選擇,有一些自動尺度選擇的方法,大家可以搜尋一下 “分割 最優尺度選擇”,如:ISPRS Journal上發表的Unsupervised image segmentation evaluation and refinement using a multi-scale approach這都是採用了全域性同質性和異質性來度量分割質量的方法,文章雖然是發表了,但經過我的測試該方法也僅僅只能在特定的軟體(eCognition)和演算法環境下可用,且對於許多影像,效果不行。當用這個策略來確定區域合併停止閾值時,很多時候會失敗。是失敗,而不是效果不好。因為在某些情況下按照這個準則,區域合併一開始就應該停止。 (許多中文文章跟這個是換湯不換藥)。 還有IJGIS上的一篇文章 ESP: a tool to estimate scale parameter for multiresolution image segmentation of remotely sensed data,雖然引用比較多,但是最終還是有人敢於說實話(在這篇文章中:Semiautomatic Object-Oriented Landslide Recognition Scheme From Multisensor Optical Imagery and DEM Jiann-Yeou Rau, Jyun-Ping Jhan, and Ruey-Juin Rau),這玩意兒純屬扯淡!IJGIS這麼牛叉的期刊怎麼登了這麼一篇水文?

言歸正傳,這塊兒,個人僅限於對遙感影象處理領域有些瞭解,可能在計算機視覺和模式識別中的很多方法不知道。在此,僅推薦一個比較簡單,但是有效的方法。藉助於ISPRS Journal那篇文章的方法,你可以計算初始分割和每次合併之後的 Global Homogeneity,依次合併得到一個序列,直到所有的可能的合併進行到底(只剩下一個1個區域了),這時候你就可以得到一條Global Homogeneity演化的曲線,大概如下(紅線),那麼把最低點和最高點連成直線,計算所有點到這條直線的距離,距離最大的點就是區域合併該停止的點。 這個只能保證你得到一個比較好的結果,但是對於很多計算機視覺的應用,大概已經足夠了。至於更好的方法,暫時還不太適合公開...


什麼?都合併完了才來找該在哪兒停止? 是的,有時候往往就是這樣曲折。但是你也不必重新執行一遍區域合併的,只需要把之前的區域合併順序重新遍歷一遍,找到停止點,把結果反算出來就OK了。

4、更多的思考

(a) 你研究超畫素幹嘛的?不要一味追求當前的所謂超畫素....

     (b) 你確定你真的是改進了當前的方法?還是僅僅沒有閱讀足夠的資料,說不定別人已經做過了,或者你程式設計實現能力太弱了....

     (c) 路在何方? 這個領域可以研究的還是比較多的,區域合併準則、停止條件(尺度選擇)、多尺度層次關係組織、應用等都還有許多進步的空間。對於遙感影像,還需要解決超大影像並行快速處理,比如給你一個20W*20W畫素大小的影象,可能一幅影象就有100G,你怎麼辦?

     (d) 超畫素的合併方法提供了豐富的層次結構資訊,你用上了麼?

     (e) 這些東西咋用啊? 遙感影象分類、目標識別、場景分類、顯著性檢測、目標提取等等等等等...具體咋樣看情況..

     (f) 文獻推薦: Scale-Sets image Analysis, IJCV,2006,個人認為可能會是該領域後續許多問題的指導思想之一。

有關超畫素的程式碼,請參考:http://blog.csdn.net/anshan1984/article/details/8918167