區域生長演算法的一種C 實現

2021-08-08 22:45:29 字數 2191 閱讀 9570

區域生長演算法是一種影象分割方法,能夠將影象中具有相同特徵的連通區域分割出來,同時保證較好的邊緣資訊。

區域生長演算法的優點是簡單,容易實現;但空間和時間複雜度較高,對分割影象要求較高,否則容易形成孔洞和過分割。

如果要實現區域生長演算法,基本演算法流程是:

1. 選取種子點p(x0,y0),用堆疊表示種子區域,將種子點push到種子堆疊中

2. 將種子堆疊中第乙個種子點pop出堆疊,並以該點為中心,遍歷該中心8鄰域畫素

3. 判斷遍歷畫素點是否已經在種子區域中,如果否,判斷遍歷畫素點是否滿足相鄰種子點相似性,如果畫素點(x,y)滿足相似性,將(x,y)push到堆疊中

4. 重複步驟 2-3,直至種子堆疊為空。

從基本思想可以知道,影響區域生長演算法的要素有三個:種子點的選取;搜尋路徑的選擇;畫素相似性的判斷。

種子點的選取:一般情況下,區域生長演算法是半互動式的分割演算法,需要使用者選取種子點。也可以是通過其他演算法計算出來的種子點。

搜尋路徑的選擇:搜尋路徑一般選擇相鄰的畫素,以二維影象為例,一般為8鄰域搜尋,或者4鄰域搜尋;以三維影象為例,一般為26鄰域搜尋或者6鄰域搜尋。

畫素相似性的判斷:相似性一般以畫素值的相近程度為判斷標準,例如,可以設定一定灰度範圍做為相似的標準。也可以通過計算滿足某種形狀或者性質作為判斷標準。

接著根據上文中提到的演算法,作者提出一種c++的實現方法,該實現不基於任何類庫,以二維影象為例,假設影象的資料型別為char型。

首先,為了便於操作,需要定義種子點的類:

1

class

point2d

25 point2d(int ix, int

iy)6

1011 ~point2d(){}

1213 point2d operator+(const point2d& a) const

1417

18 point2d operator-(const point2d& a) const

1922

23bool

operator=(const point2d &a)

2427

28int

x;29

inty;

30 };

然後,定義種子點的鄰域資訊:

const point2d pointshift2d[8] =;
然後,定義區域生長演算法類的標頭檔案:

class

regiongrowing

;

然後,是區域生長演算法類的實現:

1 #include "

regiongrowing.h

"2 #include 3

4regiongrowing::regiongrowing()59

10 regiongrowing::~regiongrowing()

1114

15void regiongrowing::setinputdata(char *pdata, int width, int

height)

1621

22void regiongrowing::setseedpoint(point2d &p)

2326

27void regiongrowing::setthreshold(int low, int

high)

2832

33bool

regiongrowing::regiongrow2d()

3439

40int index = this->seedpoint.y * this->width + this->seedpoint.x;

41int seedvalue = this->inputdata[index];

4243 std::stackpointstack;

44 pointstack.push(this->seedpoint);

4546 memset(this->outputdata, 0, sizeof(char)*this->width*this->height);

4748

while (!pointstack.empty())

4966}67

}6869return

true;70

}7172char*regiongrowing::getoutput()

73

區域生長演算法的一種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...