本次要记录的内容是:连通组件标记算法(connected component labeling algorithm)及其信息统计。
图像的连通组件(或者称为连通域更顺口一点)是针对于二值图像而言的,我们都知道二值图像只有0和255这两种像素值分布,当我们扫描二值图像中的每个像素点,并将像素值相同的而且相互连通的像素点分为相同的连通域, 最终得到图像中所有的像素连通组件。最后得到的结果中,每一个连通域表示着这个区域中的像素点有很大的关联性,可能是属于同一个物体的像素点,也可能是属于同一种颜色的像素点。这样我们就可以通过对二值图像的求取连通域,来获取到图像中某些我们感兴趣的区域,从而来进行进一步的操作。
下面来看怎样对图像进行连通域的划分,给出代码实现:
Mat connected_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\contours.png");
imshow("connected_image", connected_image);
Mat connected_image_gray;
cvtColor(connected_image, connected_image_gray, COLOR_BGR2GRAY);
Mat connected_image_gaus;
GaussianBlur(connected_image_gray, connected_image_gaus, Size(), 1, 1);
Mat connected_image_binary;
threshold(connected_image_gaus, connected_image_binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
imshow("connected_image_binary", connected_image_binary);
//对二值图像求连通
Mat label_indexs; //用于存放求得的连通区域标记
int num_labels = connectedComponents(connected_image_binary, label_indexs, 8, CV_32S);
cout << "连通区域数量:" << num_labels - 1 << endl; //需要减去背景
vector<Vec3b> colors; //用于区分不同连通域的颜色向量
colors.push_back(Vec3b(0, 0, 0)); //将背景设为黑色
RNG rng; //生成一个随机数对象
for (int i = 1; i < num_labels; i++) //为前景中每一个连通区域,随机生成一种表示颜色
{