1. 程式人生 > >主動輪廓線模型Snake模型簡介&openCV中cvSnakeImage()函式程式碼分析

主動輪廓線模型Snake模型簡介&openCV中cvSnakeImage()函式程式碼分析

主動輪廓線模型又稱為Snake模型,自Kass於1987年提出以來,已廣泛應用於數字影象分析和計算機視覺領域。由於Snake模型具有良好的提取和跟蹤特定區域內目標輪廓的能力,因此非常適合於醫學影象如CT和MR影象的處理,以獲得特定器官及組織的輪廓。簡單的來講,Snake模型就是一條可變形的引數曲線及相應的能量函式,以最小化能量目標函式為目標,控制引數曲線變形,具有最小能量的閉合曲線就是目標輪廓。 Snake模型具有一些經典方法所無法比擬的優點:影象資料、初始估計、目標輪廓及基於知識的約束統一於一個過程中;經適當的初始化後,它能自主地收斂於能量極小值狀態;尺度空間中由初到精地極小化能量可以極大地擴充套件捕獲區域和降低複雜性。同時,

Snake模型也有其自身的缺點:對初始位置敏感,需要依賴其他機制將Snake放置在感興趣的影象特徵附近;由於Snake模型的非凸性,它有可能收斂到區域性極值點,甚至發散。

Snake模型稱為動態輪廓模型(Active Contour  Model)是Kass與1987年提出的,它對於在噪聲和對比度不敏感,能將目標從複雜背景中分割出來,並能有效的跟蹤目標的形變和非剛體的複雜運動而被廣泛用於影象分割和物體跟蹤等影象處理領域。

Snake主要原理是先提供待分割影象的一個初始輪廓的位置,並對其定義個能量函式,是輪廓沿能量降低的方向靠近。當能量函式達到最小的時候,提供的初始輪廓收斂到圖形中目標的真實輪廓。

Snake能量函式是有內部能量函式和外部能量函式組成,內部能量控制輪廓的平滑性和連續性,外部能量由影象能量和約束能量組成,控制輪廓向著實際輪廓收斂,其中約束能量可根據具體的物件形態定義,使得snake具有很大的靈活性。

Snake模型發展10多年來,許多學者對於經典的snake模型做了改進,提出各種改進的snake模型,其中梯度向量流(Gradient Vector  Flow,GVF)模型擴大了經典snake的外力作用範圍,加強了對目標凹輪廓邊緣的吸引力,提高了傳統的snake模型。

Snake模型主要研究的方面:

1.表示內部能量的曲線演化    2.外力    3.能量最小化

Snake模型初始輪廓的選擇

由於snake模型對於初始位置比較敏感,因此要求初始輪廓儘可能的靠近真實輪廓,而當影象邊緣模糊,目標比較複雜或與其他的物體靠的比較近時,其初始輪廓更不易確定。

現有的初始輪廓確定的方法有以下幾種:1.人工勾勒影象的邊緣    2.序列影象差分邊界    3.基於序列影象的前一幀影象邊界的預測  4.基於傳統影象分割結果進行邊界選取

分水嶺演算法

分水嶺演算法是由S.Beucher  F.Meyer最早引入影象分割領域,它的基本思想是來源於測地學上的側線重構,其內容是把影象看做是測地學上的拓撲地貌。進行分水嶺模型計算的比較經典的演算法是L  Vincent提出的,在該演算法中首先是對每個畫素的灰度級進行從低到高排序,然後用等級對壘模擬淹沒,初始時,等級佇列中為淹沒的初始點,在從低到高實現淹沒的過程中,對每一個區域性極小值在H階高度的影響域採用先進先出(FIFO)結構進行判斷及標註,直到最後一個值被淹沒,從而正確劃分各個區域。

整個洪水淹沒的迴圈迭代過程可以通過以下兩個步驟表示:

分水嶺演算法的優點:

1.分水嶺演算法對於影象中由於畫素差別較小而產生微弱邊緣具有良好的響應,可以得到封閉連續的邊緣,而且可以保證在照明,陰影等影響下分割邊緣的封閉性和連續性

分水嶺演算法對於目標物體之間或者是目標物體同背景物體之間粘連的情況有較好的處理效果。能夠較好的分割這類目標物體。

3.影象內部的陰暗變化對於分水嶺演算法影響較小,可以在一定程度上減小由於陰暗便哈帶來的影象分割影響

與其他邊緣分割運算元比較:

Canny運算元可以很好的勾勒出物體的輪廓,過分的強調輪廓的特性,而沒有強調物體的輪廓必須是封閉的,在影象中顯示的輪廓是不封閉的,物體內部陰暗變化也被當做邊界檢測出來,形成大量的偽邊緣。

分水嶺演算法分割得到的輪廓曲線時連續封閉的,影象內部的陰暗變化沒有生成獨立的輪廓線。

Snake模型的缺陷:

對初始位置敏感,易陷入區域性極值,無法收斂到輪廓深度凹陷部分,不具備自動拓撲變換功能等。

Snake模型的改進演算法:

1.Cohen提出的氣球(balloon)理論模型:應用壓力和高斯能力一起增大吸引範圍的方法,該壓力可使模型擴大或縮小,因此不再要求將模型初始化在所期望的物件邊界附近。在影象的梯度力場上疊加氣球裡,以使輪廓線作為一個整體進行膨脹或收縮,從而擴大了模型尋找影象特證的範圍。

優勢:對初始邊界不敏感            

存在的缺點:存在弱邊界,漏出邊界間隙等問題。

2.Xu提出梯度向量流(GVF)概念,用GVF場代替經典外力場,GVF場可以看做是對影象梯度場得逼近,這不僅使模型捕捉的範圍得到了提高,而且能使活動輪廓進入凹陷區。

優勢:有良好的收斂性,深入目標邊緣的凹陷區域           

存在的缺點:仍不能解決曲線的拓撲變化問題

區域性優化演算法:

1.Amini提出基於動態規劃的snake演算法。 2.變分法  3.貪婪演算法  4.有限差分法   5.有限元法

全域性優化演算法:

1.模擬退火     2.遺傳演算法    3.神經網路

Snake模型的蟻群演算法(Ant Colony Optimization)模型

蟻群演算法是最近幾年有義大利學者M.Dorigo等人首次提出的一種新型的模擬進化演算法,稱為蟻群系統,蟻群演算法通過候選解組成的群體的進化過程來尋求最優解,該過程包括兩個基本階段:適應階段和協同工作階段,演算法本身採用正反饋原理,加快了進化過程,不易陷入區域性最優解,而且個體之間不斷進行資訊交流和傳遞,有利於對解空間的進一步探索,因此有很強的發展解的能力。

Snake的進化模型

1.McInerney 提出一種拓撲自適應snake模型(Topology Adaptive  Snake,T-Snake)

該演算法基於仿射細胞影象分解(Affine Cell Image  Decomposition,ACID)先在待分割影象上加以三角網格,然後在影象區域的適當位置做一條初始曲線,最後取曲線與網格的交點作為snake的初始離散點,其第i個snake的離散點的座標為其中,相鄰兩點,之間由一條彈性樣條連線而成

由於T-Snake模型可藉助三角形網格和網格點的特徵函式來確定邊界三角形,可促使snake模型演化過程中的分裂和合並,從而保證了其具有能夠處理拓撲結果複雜影象的能力,因此能夠很好的滿足醫學影象拓撲結果複雜的特點。此演算法用於腦部MR切片有良好的效能。

2.雙T-Snake模型

雙T-Snake模型(Dual-T-Snakes)是在T-Snake模型的基礎上產生的,其主要思想是採用內外兩個初始輪廓,其中一個輪廓從目標外向內收縮和分裂,另一個輪廓從目標內部向外膨脹,兩個初始輪廓可以離目標邊界較遠,迭代的過程中對能量較大的輪廓增加驅動力,使其靠近與之相對應的輪廓,直到連個輪廓收斂到同一個為止

3.Loop  Snake 模型

Loop  Snake模型是一種加強了拓撲控制的T-Snake模型,這種方法的關鍵集中在曲線的每一步進化中都要形成迴圈,其基本思想是,確保影象輪廓曲線精確地線性地對映到適當的分類中,然後在額外的記過loop-Tree的幫助下,儘可能少的時間內運用已經被snake探究的迴圈來決定是否進行區域劃分,這種模型的實質是對T-Snake模型的一種改進。由於加強了拓撲控制,使得Loop Snake模型既可以忽略背景中強噪聲又可以在演化過程中進行多次分裂。

4.連續snake模型

在Snake模型中,輪廓曲線由一條給定容許誤差範圍的光滑曲線組成,相對於離散snake來說,連續snake模型所需要的控制點少,比離散的更具優越性。

5.B-Snake模型

B-Snake模型是通過B樣條曲線來定義的,其輪廓曲線由各曲線段光滑相連而成,每一個曲線段都是由一個給定次數多項式表示,這種多項式是B樣條曲度函式的一種線性組合,並以控制點為係數。在有些B-Snake模型中並沒有明確應用內部能量,這是因為B樣條本身就含有內部能量,snake輪廓曲線只受外力影響著影象邊緣移動。可用於對影象切片分割區域的描述與跟蹤而用於器官的三維重建。

應用snake的優勢:由於生物或人體組織解剖結構的複雜性,以及軟組織形狀的易變性,那些僅依賴於影象本身的灰度,紋理屬性等低層次視覺屬性來進行分割的影象分割方法難以獲得理想的分割效果,因此醫學影象分割迫切需要有一種靈活的框架,能將基於影象本身低層次視覺屬性(邊緣,紋理,灰度,色彩)和人們對於待分割目標的知識經驗,如目標形狀的描述,亮度,色彩的經驗統計,醫生的經驗等,可以一種有機的方式整合起來,得到待分割區域的完整表達。

Opencv中snake函式解析及例子:

  1. /*M/////////////////////////////////////////////////////////////////////////////////////// 
  2. // 
  3. //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 
  4. // 
  5. //  By downloading, copying, installing or using the software you agree to this license. 
  6. //  If you do not agree to this license, do not download, install, 
  7. //  copy or use the software. 
  8. // 
  9. // 
  10. //                        Intel License Agreement 
  11. //                For Open Source Computer Vision Library 
  12. // 
  13. // Copyright (C) 2000, Intel Corporation, all rights reserved. 
  14. // Third party copyrights are property of their respective owners. 
  15. // 
  16. // Redistribution and use in source and binary forms, with or without modification, 
  17. // are permitted provided that the following conditions are met: 
  18. // 
  19. //   * Redistribution's of source code must retain the above copyright notice, 
  20. //     this list of conditions and the following disclaimer. 
  21. // 
  22. //   * Redistribution's in binary form must reproduce the above copyright notice, 
  23. //     this list of conditions and the following disclaimer in the documentation 
  24. //     and/or other materials provided with the distribution. 
  25. // 
  26. //   * The name of Intel Corporation may not be used to endorse or promote products 
  27. //     derived from this software without specific prior written permission. 
  28. // 
  29. // This software is provided by the copyright holders and contributors "as is" and 
  30. // any express or implied warranties, including, but not limited to, the implied 
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed. 
  32. // In no event shall the Intel Corporation or contributors be liable for any direct, 
  33. // indirect, incidental, special, exemplary, or consequential damages 
  34. // (including, but not limited to, procurement of substitute goods or services; 
  35. // loss of use, data, or profits; or business interruption) however caused 
  36. // and on any theory of liability, whether in contract, strict liability, 
  37. // or tort (including negligence or otherwise) arising in any way out of 
  38. // the use of this software, even if advised of the possibility of such damage. 
  39. // 
  40. //M*/
  41. #include "_cv.h"
  42. #define _CV_SNAKE_BIG 2.e+38f
  43. #define _CV_SNAKE_IMAGE 1
  44. #define _CV_SNAKE_GRAD  2
  45. /*F/////////////////////////////////////////////////////////////////////////////////////// 
  46. //    Name:      icvSnake8uC1R     
  47. //    Purpose:   
  48. //    Context:   
  49. //    Parameters: 
  50. //               src - source image, 
  51. //               srcStep - its step in bytes, 
  52. //               roi - size of ROI, 
  53. //               pt - pointer to snake points array 
  54. //               n - size of points array, 
  55. //               alpha - pointer to coefficient of continuity energy, 
  56. //               beta - pointer to coefficient of curvature energy,  
  57. //               gamma - pointer to coefficient of image energy,  
  58. //               coeffUsage - if CV_VALUE - alpha, beta, gamma point to single value 
  59. //                            if CV_MATAY - point to arrays 
  60. //               criteria - termination criteria. 
  61. //               scheme - image energy scheme 
  62. //                         if _CV_SNAKE_IMAGE - image intensity is energy 
  63. //                         if _CV_SNAKE_GRAD  - magnitude of gradient is energy 
  64. //    Returns:   
  65. //F*/
  66. static CvStatus  
  67. icvSnake8uC1R( unsigned char *src,   //原始影象資料
  68.                int srcStep,         //每行的位元組數
  69.                CvSize roi,         //影象尺寸
  70.                CvPoint * pt,       //輪廓點(變形物件)
  71.                int n,            //輪廓點的個數
  72.                float *alpha,       //指向α的指標,α可以是單個值,也可以是與輪廓點個數一致的陣列
  73.                float *beta,        //β的值,同α
  74.                float *gamma,       //γ的值,同α
  75.                int coeffUsage,   //確定αβγ是用作單個值還是個陣列
  76.         CvSize win,       //每個點用於搜尋的最小的領域大小,寬度為奇數
  77.              CvTermCriteria criteria,   //遞迴迭代終止的條件準則
  78. int scheme )         //確定影象能量場的資料選擇,1為灰度,2為灰度梯度
  79. {  
  80.     int i, j, k;  
  81.     int neighbors = win.height * win.width;    //當前點領域中點的個數
  82.    //當前點的位置
  83.     int centerx = win.width >> 1;            
  84. 相關推薦

    主動輪廓模型Snake模型簡介&openCVcvSnakeImage()函式程式碼分析

    主動輪廓線模型又稱為Snake模型,自Kass於1987年提出以來,已廣泛應用於數字影象分析和計算機視覺領域。由於Snake模型具有良好的提取和跟蹤特定區域內目標輪廓的能力,因此非常適合於醫學影象如CT和MR影象的處理,以獲得特定器官及組織的輪廓。簡單的來講,Snake模型就

    OpenCVfindcontours函式hierarchy輪廓層級詳解

    最近在查閱OpenCV輪廓處理函式方面時,我發現有部分文章對findcontours函式中輪廓層級提取的描述有錯誤,特寫一篇有關輪廓提取方面的文章(僅僅介紹容易出錯的hierarchy層級輪廓)。 函式原型為:findContours(image,contours,hier

    OpenCV-Python官方文件三——在OpenCV繪製函式

    在OpenCV中繪製函式 目標 · 學習使用OpenCV繪製不同的幾何形狀 · 您將學習以下函式:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等。 程式碼  &nbs

    最近鄰插值和雙線性插值的基本原理 以及OpenCVresize函式的用法改變影象的大小

    最近鄰插值和雙線性插值的基本原理 影象的縮放很好理解,就是影象的放大和縮小。傳統的繪畫工具中,有一種叫做“放大尺”的繪畫工具,畫家常用它來放大圖畫。當然,在計算機上,我們不再需要用放大尺去放大或縮小影象了,把這個工作交給程式來完成就可以了。下面就來講講計算機怎麼來放大縮小圖象;在本文中,

    OpencvcopyTo()函式的使用方法

    https://www.cnblogs.com/phoenixdsg/p/8420716.html 在Mat矩陣類的成員函式中copyTo(roi , mask)函式是非常有用的一個函式,尤其是後面的mask可以實現蒙版的功能,我們用幾個例項來說明它的作用。我們要注意mask的資料型別,必須是C

    OpenCVcopyTo()函式及Mask詳解(附程式碼詳解)

    copyTo函式有兩種重構方式: 第一種:A.copyTo(B),表示將A矩陣複製到B中 第二種:A.copyTo(B, mask),表示得到一個附加掩膜mask的矩陣B。 第一種方法就不多贅述,這裡主要詳細敘述第二種使用方法。  對於第二種mask引數的格

    OpenCVC++函式imread讀取圖片的問題

    #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <math.h> #include <stdlib.h> #include <s

    OpenCVcvResize函式圖象放縮

                    影象大小變換void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );src:輸入影象. dst:輸出影象. interpolation:差值方法: • CV_INTER_N

    opencvRNG 函式釋義

    RNG rng; // always produces 0 double a = rng.uniform(0, 1); // produces double from [0, 1) double a1 = rng.uniform((double)0, (double)1); // produces float

    opencv時間函式的操作

    計時函式:兩個簡單的計時函式,1.getTickCount()和getTickFrequency() getTickCount()函式返回CPU自某個時間以來走過的時鐘週期數 getTickFrequence()函式返回CPU一秒鐘所走的時鐘週期數這樣我們輕鬆可以以秒為單位對某運算進行計算計

    OpenCv學習筆記(三)---OpenCv基本資料型別--Point,Size,Rect,Scalar,Vec3b類型別的詳細解釋及其OpenCv原始碼的詳細分析

    /********************************************************************************************* 程式功能: OpenCv的基本資料結構原始碼的解讀,我們常用的Ope

    opencvsplit()函式執行出錯

    為什麼明明按照書本或程式碼一句一句敲的,還有錯誤? 錯誤如下: 0x1027FC43 (opencv_world300.dll) (split.exe 中)處有未經處理的異常:  0xC0000005:  寫入位置 0x00000000 時發生訪問衝突。 這是因為找

    opencvaddWeighted()函式用法總結(05)

    還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:addWeighted()函式是將兩張相同大小,相同型別的圖片融合的函式。他可以實現圖片的特效,不多說了

    opencvcopyTo函式的使用

    我們已經知道的是,使用copyTo函式可以得到一個複製的矩陣。 A.copyTo(B); 就可以得到和A一毛一樣的矩陣B。當然需要事先宣告B。並且兩者可以互不相關的做各種操作。 copyTo還有一個重構函式copyTo(B,MASK)。意思是可以得到一個附加掩膜MASK的矩

    opencvnamedWindow( )函式用法總結(02)

    還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:namedWindow()的功能就是新建一個顯示視窗。可以指定視窗的型別。 第二步,結果圖顯示:我

    opencvcreateTrackbar()函式用法總結(06)

    在opencv中滑動條是很方便的一個測試函式,我們可以不需要更改程式就可以更改變數的值來觀察效果。 還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:用

    Opencvreshape函式要注意的細節

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; void PrintMat( Mat &_m)

    OpenCVfindContours函式的使用

    從二值影象中找出物件的輪廓: OpenCV中函式findContours()用於中物件的輪廓,有兩種形式: 第一種: void findContours( InputOutputArray image, OutputArrayOfArrays contours,      

    opencv】雙目匹配程式碼分析

    雙目匹配程式碼分析 原理 通過將兩個水平放置的攝像頭獲取的影象,匹配相應的區域視差。方式有很多種,SAD是速度最快的方式,主要原理是塊匹配,計算每個搜尋塊在最大視差範圍內的sad值,選擇最小的sad值的水平位移距離作為視差輸出。 一、區準函式 主

    移動開發:OpenCVGPU函式

    The OpenCV GPU module is a set of classes and functions to utilize GPU computational capabilities. It is implemented using NVIDIA* CUDA*