zoukankan      html  css  js  c++  java
  • 连通域标识connectedComponents(),OpenCV中二值图(0、255)的说明(OpenCV案例源码connected_components.cpp解读)

    有所更改,参数不求完备,但求实用。源码参考D:sourceopencv-3.4.9samplescppconnected_components.cpp

    【二值图认知纠正】

    OpenCV中threshold()得到的二值图其实是0、255(设定值)这两个值的图,而不是0、1的图。

    0、1图是真正意义上的二值图。在矩阵运算时(比如点乘),推荐用0、1的二值图。OpenCV应该是隐蔽地把0、255归一化到了0、1。

    0、1图有Halcon中Region的感觉(Halcon针对Region的处理,功能十分强大)。

    【知识点】

    二值图中不同连通域显示不同的颜色,主要是connectedComponents()函数的使用。

    int connectedComponents(InputArray image, OutputArray labels,int connectivity = 8, int ltype = CV_32S);

    image是threshold得到的二值图,得到的labels是32位 short int(短整型)元素的矩阵(图)。

    假如image中有2个连通域,那么labels是只有0、1、2这三种数的矩阵(0标识背景,1、2标识2个连通域),返回值是3(三种数据)。

     

    #include <opencv2/opencv.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    Mat img;
    int threshval = 150;
    
    static void on_trackbar(int, void*) //滑动条回调函数
    {
        Mat bw;
        threshold(img, bw, threshval, 255, THRESH_BINARY); //二值化,0、255
        imshow("bw", bw);//bw是0、255的“二值图”
        Mat labelImage;
        int nLabels = connectedComponents(bw, labelImage);//0、255的bw图变成0、1、2……不同区域标识的labelImage(32位短整型)
        std::vector<Vec3b> colors(nLabels); //colors有nLabels个元素,每个元素有3维,即nLabels个彩色像素
        colors[0] = Vec3b(0, 0, 0);//背景色,黑色
        for (int label = 1; label < nLabels; ++label)//label从1开始,因为0所在区域是背景
        {
            colors[label] = Vec3b((rand() & 255), (rand() & 255), (rand() & 255));//用于不同区域的随机彩色
        }
        Mat dst(img.size(), CV_8UC3); //与img等大的3通道的画板dst
        for (int r = 0; r < dst.rows; ++r)
        {
            for (int c = 0; c < dst.cols; ++c)
            {
                int label = (int)labelImage.at<int>(r, c);//at<int>中int对应labelImage中元素类型(短整型)
                dst.at<Vec3b>(r, c) = colors[label]; //dst画板上涂色,依据检索的连通域标识图labelImage中的值(0、1、2……)涂不同颜色
            }
        }
        imshow("Connected Components", dst);
    }
    
    int main(int argc, const char** argv)
    {
        img = imread("lena.jpg", IMREAD_GRAYSCALE);//灰度读取
        imshow("Image", img);
        namedWindow("Connected Components", WINDOW_AUTOSIZE);//先窗体,后滑动条
        createTrackbar("Threshold", "Connected Components", &threshval, 255, on_trackbar);
        on_trackbar(threshval, 0);//先执行一次,出图。0无意义,装饰品
    
        waitKey(0);
        return 0;
    }

    【参考】

    OpenCV中的新函数connectedComponentsWithStats使用

    OpenCV之bitwise_and、bitwise_not等图像基本运算及掩膜

  • 相关阅读:
    区分jquery中的offset和position
    如何让搜索框的键盘显示搜索按键?
    如何设置table的border-radius?
    如何让输入框自动使用英文输入法?
    如何隐藏数字输入框的上下箭头?
    autocapticalize和autocorrect
    防止注入
    sychronized和lock和区别
    各大公司Java面试题超详细总结
    n的阶乘
  • 原文地址:https://www.cnblogs.com/xixixing/p/12367175.html
Copyright © 2011-2022 走看看