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

2021-09-02 05:51:22 字數 1864 閱讀 6452

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

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

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

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...