區域生長法快速入門,不帶種子點的選取

2021-09-10 03:38:01 字數 1461 閱讀 5393

這裡實現的區域生長法,是最原始的區域生長法,基本原理是判斷畫素點的強度值是和種子點的強度值差是否小於閾值,如果小於閾值則被標記。

實現過程中利用了棧的先進後出的思想,將8鄰域中符合生長要求的點壓入棧,然後依次取出,然後在取出的點的基礎上對8鄰域再次進行生長。

學習部分

1、獲取畫素點座標值

分成兩種,第一種是利用指標來取值的,第二種是利用點來訪問強度值的,可以使用pt點,也可以使用x,y的座標訪問,但是這邊涉及到opencv的座標問題,y要放在前面。

startptvalue = ((unsigned char*)(srcimg.data + pt.y*srcimg.step))[pt.x];//該畫素點所在行的首位址,然後再加上該畫素點所在的列

markimg.at(pt) = 255;

markimg.at(y, x) = 255;

2、建立一張黑色的影象 

mat img = mat::zeros(srcimg.size(), cv_8uc1);
cv_(s|u|f)ccv_8(每個畫素點佔8bite)u(unsigned)c(channel)1

3、修改

①生長準則是將生長點和種子點的強度值相比,而不是將8鄰域的點和當前棧中取出的點的強度值相比,可以利用乙個全域性灰度值作為生長準則

②生長過程有很多點被重複生長(標記圖中強度為0的點,不符生長準則的可能會被二次生長)

/**

*@brief 區域生長法,輸入影象應為灰度圖

*@para srcimg 區域生長原影象

*@para pt 種子點

*@para thre 閾值

**/void regiongrowing(mat srcimg, mat& dstimg, point pt, int thre)

,,,,,,, }; //8鄰域

vectorgrowptvec;//生長點棧

growptvec.push_back(pt);//將初始生長點壓入棧

//unsigned char *pdata = (unsigned char *)(markimg.data + pt.y*markimg.step);

//pdata[pt.x] = 255;//標記初始生長點

markimg.at(pt) = 255;

//startptvalue = ((unsigned char*)(srcimg.data + pt.y*srcimg.step))[pt.x];//該畫素點所在行的首位址,然後再加上該畫素點所在的列

startptvalue = srcimg.at(pt);

while (!growptvec.empty())

}} }

markimg.copyto(dstimg);

}

int main()

區域生長法

區域生長的基本思想是將具有相似性質的畫素集合起來構成區域。具體先對每個需要分割的區域找乙個種子畫素作為生長的起點,然後將種子畫素周圍鄰域中與種子畫素具有相同或相似性質的畫素 根據某種事先確定的生長或相似準則來判定 合併到種子畫素所在的區域中。將這些新畫素當做新的種子畫素繼續進行上面的過程,直到再沒有...

區域生長法分割

區域生長法的基本思想就是將具有相似性的畫素集合起來形成乙個區域。具體做法就是,首先選擇乙個種子點,通過比較種子點鄰域的相似性,將鄰域中滿足相似性準則的畫素歸入種子點所在的區域,然後將這新的畫素點定為種子點,重複上述過程,直到沒有滿足相似性準則的新的鄰域畫素點產生為止。通過區域生長,乙個區域就形成了。...

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

區域生長演算法是一種影象分割方法,能夠將影象中具有相同特徵的連通區域分割出來,同時保證較好的邊緣資訊。區域生長演算法的優點是簡單,容易實現 但空間和時間複雜度較高,對分割影象要求較高,否則容易形成孔洞和過分割。如果要實現區域生長演算法,基本演算法流程是 1.選取種子點p x0,y0 用堆疊表示種子區...