OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV學習(二十一) :計算圖像連通分量:connectedComponents(),connectedComponentsWithStats()
1、connectedComponents()函數
Connected Components即連通體算法用id標注圖中每個連通體,將連通體中序號最小的頂點的id作為連通體的id。如果在圖G中,任意2個頂點之間都存在路徑,那么稱G為連通圖,否則稱該圖為非連通圖,則其中的極大連通子圖稱為連通體,如下圖所示,該圖中有兩個連通體:
計算二值圖像中為圖像的連通分量標注(標記)
2、connectedComponentsWithStats()函數
這是一個重載的成員函數,它與上述函數的不同之處在于它只接受什么參數。
注意0的區域標識的是background,而centroids則對應的是中心點,而label則對應于表示是當前像素是第幾個輪廓
3、示例:
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;int main() {Mat src =imread("F:/C++/2. OPENCV 3.1.0/TEST/test5.PNG",1);if(!src.data ) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定圖片存在~! \n"); return false; }imshow( "image", src );// 轉灰度Mat src_gray;cvtColor( src, src_gray, CV_BGR2GRAY );cv::Mat img_edge, labels, img_color, stats,centroids;// 二值化cv::threshold(src_gray, img_edge, 125, 255, cv::THRESH_BINARY);cv::imshow("Image before threshold", img_edge);// 白色代表有數據,黑色代表沒有數據,所以圖像輸入之前要轉換成”黑底白圖“bitwise_not(img_edge,img_edge); // 該函數計算輸入數組的逐元素逐位反轉:cv::imshow("Image after threshold", img_edge);// 計算連通分量// labels 輸出標簽圖// stats Nx5矩陣(CV_32S): 分別對應各個輪廓的x,y,width,height和面積int nccomps = cv::connectedComponentsWithStats ( img_edge, labels, stats, centroids);cout << "檢測到總連接組件: " << nccomps << endl;vector<cv::Vec3b> colors(nccomps+1);colors[0] = Vec3b(0,0,0); // 背景像素保持黑色。for( int i = 1; i < nccomps; i++ ) // 為每個標簽設置顏色{colors[i] = Vec3b(rand()%256, rand()%256, rand()%256);if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 ) // 面積小于200 的colors[i] = Vec3b(0,0,0); // 小區域也被涂成黑色}//img_color = Mat::zeros(src.size(), CV_8UC3);for( int y = 0; y < img_color.rows; y++ )for( int x = 0; x < img_color.cols; x++ ){int label = labels.at<int>(y, x); // 獲得每個 輪廓圖標簽CV_Assert(0 <= label && label <= nccomps);img_color.at<cv::Vec3b>(y, x) = colors[label];}cv::imshow("Labeled map", img_color);waitKey(0);return 0; }結果:
分析:
1、看輸出參數stats:Nx5矩陣(CV_32S),其中第1 2 6 個的面積小于200:
2、labels 標簽圖中:
4、通過findContours(),drawContours()函數計算連通量
在以前,常用的方法是”是先調用 cv::findContours() 函數(傳入cv::RETR_CCOMP 標志),隨后在得到的連通區域上循環調用 cv::drawContours() “
示例:
結果:
總結
以上是生活随笔為你收集整理的OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胶囊网络不同实现代码
- 下一篇: Fatal Error[Pe1696]: