區域生長演算法是一種影象分割方法,能夠將影象中具有相同特徵的連通區域分割出來,同時保證較好的邊緣資訊。
區域生長演算法的優點是簡單,容易實現;但空間和時間複雜度較高,對分割影象要求較高,否則容易形成孔洞和過分割。
如果要實現區域生長演算法,基本演算法流程是:
1. 選取種子點p(x0,y0),用堆疊表示種子區域,將種子點push到種子堆疊中
2. 將種子堆疊中第乙個種子點pop出堆疊,並以該點為中心,遍歷該中心8鄰域畫素
3. 判斷遍歷畫素點是否已經在種子區域中,如果否,判斷遍歷畫素點是否滿足相鄰種子點相似性,如果畫素點(x,y)滿足相似性,將(x,y)push到堆疊中
4. 重複步驟 2-3,直至種子堆疊為空。
從基本思想可以知道,影響區域生長演算法的要素有三個:種子點的選取;搜尋路徑的選擇;畫素相似性的判斷。
種子點的選取:一般情況下,區域生長演算法是半互動式的分割演算法,需要使用者選取種子點。也可以是通過其他演算法計算出來的種子點。
搜尋路徑的選擇:搜尋路徑一般選擇相鄰的畫素,以二維影象為例,一般為8鄰域搜尋,或者4鄰域搜尋;以三維影象為例,一般為26鄰域搜尋或者6鄰域搜尋。
畫素相似性的判斷:相似性一般以畫素值的相近程度為判斷標準,例如,可以設定一定灰度範圍做為相似的標準。也可以通過計算滿足某種形狀或者性質作為判斷標準。
接著根據上文中提到的演算法,作者提出一種c++的實現方法,該實現不基於任何類庫,以二維影象為例,假設影象的資料型別為char型。
首先,為了便於操作,需要定義種子點的類:
class point2d
point2d(int ix, int iy)
~point2d(){}
point2d operator+(const point2d& a) const
point2d operator-(const point2d& a) const
bool operator=(const point2d & a)
int x;
int y;
};然後,定義種子點的鄰域資訊:
const point2d pointshift2d[8] =
;然後,定義區域生長演算法類的標頭檔案:
class regiongrowing
;然後,是區域生長演算法類的實現:
#include "regiongrowing.h"
#include
regiongrowing::regiongrowing()
regiongrowing::~regiongrowing()
void regiongrowing::setseedpoint(point2d &p)
void regiongrowing::setthreshold(int low, int high)
bool regiongrowing::regiongrow2d()
int index = this->seedpoint.y * this->width + this->seedpoint.x;
int seedvalue = this->inputdata[index];
std::stackpointstack;
pointstack.push(this->seedpoint);
memset(this->outputdata, 0, sizeof(char)*this->width*this->height);
while (!pointstack.empty())}}
return true;
}char* regiongrowing::getoutput()
區域生長演算法的一種C 實現
區域生長演算法是一種影象分割方法,能夠將影象中具有相同特徵的連通區域分割出來,同時保證較好的邊緣資訊。區域生長演算法的優點是簡單,容易實現 但空間和時間複雜度較高,對分割影象要求較高,否則容易形成孔洞和過分割。如果要實現區域生長演算法,基本演算法流程是 1.選取種子點p x0,y0 用堆疊表示種子區...
邏輯回歸演算法的一種實現
邏輯回歸演算法的一種實現 1 import numpy as np import matplotlib.pyplot as plt 載入資料集,將資料集中兩列資料分別儲存到datamat和labelmat def loaddataset datamat labelmat fr open home j...
快速排序演算法的一種實現
參考部落格 白話經典演算法系列之六 快速排序 快速搞定 功能 實現快速排序演算法 include 方法宣告 intadjustsort int a,int m,int n void quicksort int a,int m,int n int main void printf 排序前的陣列順序.n...