two-pass就是通過掃瞄兩遍影象,就可以將影象中存在的所有連通區域找出並標記。
基本思路:首先將影象二值化,將不是background的畫素點都標記為同乙個初始label,background的畫素點都標記為0,然後第一遍掃瞄過程中同乙個連通區域內的畫素中可能會被賦予乙個或多個不同label,這些同一連通域的不同label是相連的,在此過程中記錄下它們的連通性;第二遍掃瞄就是根據第一遍記錄下來的所有label的連通性來統一乙個連通域內不同的label值。
此處我們考慮4鄰域的情況,設影象的初始label值為l,第一次掃瞄過程中掃瞄到影象中某個點的label值為lab[x, y],該點左鄰label值為left,上鄰label值為up,該點label賦值的賦值邏輯為:
if lab[x, y]不為0:
if left, up都為0:
lab[x, y]賦值為l, l++
if left, up只有乙個為0:
lab[x, y]賦值為left,up中非零的一方
if left, up都不為0:
lab[x, y]賦值為left, up中最小的一方
else:
掃瞄到background處直接跳過
在第一遍的掃瞄過程中用union-find記錄各個label值之間的連通性。
c++**實現:
}//彩色顯示
cv::scalar getrandomcolor()
void labelcolor(const cv::mat& labelimg, cv::mat& colorlabelimg)
std::mapcolors;
int rows = labelimg.rows;
int cols = labelimg.cols;
colorlabelimg.release();
colorlabelimg.create(rows, cols, cv_8uc3);
colorlabelimg = cv::scalar::all(0);
for (int i = 0; i < rows; i++)
cv::scalar color = colors[pixelvalue];
*data_dst++ = color[0];
*data_dst++ = color[1];
*data_dst++ = color[2];
}else}}
printf("color num : %d \n", num );
}int main()
程式輸出:
程式輸入:
opencv連通域分析
opencv連通域分析 include include using namespace std using namespace cv typedef struct connectedcomponentanalysis struct cca struct enum connectedcomponent...
opencv實現連通域
文章 在本文中使用影象連通域統計使用opencv中的cvfloodfill方法,但是在cvfloodfill方法中cvconnectedcomp引數無法返回具體點座標位置資訊,找了些資料 給cvseq分配空間但是還是contour內容沒有值,估計是opencv2.00版本不支援。如果想獲取點座標資訊...
opencv實現連通域
在本文中使用影象連通域統計使用opencv中的cvfloodfill方法,但是在cvfloodfill方法中cvconnectedcomp引數無法返回具體點座標位置資訊,找了些資料 給cvseq分配空間但是還是contour內容沒有值,估計是opencv2.00版本不支援。如果想獲取點座標資訊有兩種...