輪廓追蹤與C 實現

2021-06-04 02:31:06 字數 1314 閱讀 9885

輪廓追蹤是影象處理中常見的方法,主要目的是追蹤二值影象中目標物體的外輪廓,所得結果為單畫素閉合輪廓。

流       程:

1. 確定種子點,即追蹤的起始畫素(如最左上方在輪廓上的畫素點);                   

2. 以相應的追蹤規則搜尋外部輪廓點。

追蹤規則:以種子點為起點,按某以確定方向(如順時針)尋找與當前輪廓點相鄰(8鄰域)的輪廓點(第乙個相鄰),再以 此點為當前輪廓點按照前述方法搜尋,直到最後搜尋到 的點與種子點相同為止。

注        意:搜尋過程中,下一次搜尋的起始方向,是上一次搜尋到當前畫素方向的逆時針45度方向(如果搜尋方向是順時針)。如當前畫素在上個輪廓畫素的右鄰域,那麼當前畫素可以從其右上角方向搜尋,因為這時其上鄰域必不是輪廓畫素。這樣做可以減少演算法的計算量。

追蹤過程如圖1所示:其中紅色點表示種子點,黑色點表示輪廓點,藍色點表示目標物體內部點,搜尋方向是順時針。

我的**中dircection是搜尋方向,定義如下:

int[,] direction = new int[8, 2] , , , , , , , };

在**中的abrect是乙個矩形物件,指的是追蹤目標所在矩形,這是我原來**中要用的東西,和這個演算法沒有關係。

圖1.追蹤過程圖示

c#實現:

unsafe protected void tracecontour(byte* imagedata, int wid, int hei)

for (int i = 0; i < wid; i++)

//尋找種子點

for (int i = 1; i < hei - 1; i++)

}if (bfindstartpoint)

}//尋找種子點失敗

if (!bfindstartpoint)

return ;

//搜尋方向

/** 7 0 1

* 6 + 2

* 5 4 3

*/

int begindirect = 0;//從0開始順時針搜尋

int kk = ss;

int k = 0;

int bb = 0;

bool bfindpoint = false;

point pt = new point();

while (bfindstartpoint)

else if (imagedata[kk] == 255)

else}}

}

C 中OpenCVSharp實現輪廓檢測

opencv提供了函式 findcontours 用於對物體輪廓進行檢測,該函式實現演算法是由s.suzuki k.abe於1985年發表的。opencvsharp封裝了這個函式,有2個引數 contours,hierarchy 要做特別的說明。public static void findcont...

實現光線追蹤

參考文章 作者正大三,剛好選修到計算機圖形學這門課,基於興趣,便試著實現全域性光照的效果,由此,寫下此篇文章。所謂光線追蹤,是指從眼睛出發,經過影象平面每一畫素,投射光線到場景中,求該光線與場景中幾何圖形的最近交點,然後求該交點的顏色屬性,並將該顏色值記錄下來,再根據相交點的材質判斷性地進行反射 折...

OpenCV 初識輪廓(Python實現)

什麼是輪廓 輪廓可以簡單認為成將連續的點 連著邊界 連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用 怎樣查詢輪廓 cv2.findcontours image,mode,method offset 尋找乙個二值影象的輪廓。注意黑色表示背景,白色表示物體,即在黑色背景...