zoukankan      html  css  js  c++  java
  • OpenCV-bwLabel-实现图像连通组件标记与分析

     OpenCV实现图像连通组件标记与分析- matlab bwLabel;

    code:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    RNG rng(12345);
    void connected_component_demo(Mat &image);
    void connected_component_stats_demo(Mat &image);
    int main(int argc, char** argv)
    {
        Mat src = imread("./src/rice.png");
        if (src.empty()) printf("could not load image...
    ");
        imshow("input", src);
        connected_component_stats_demo(src);
        connected_component_demo(src);
        waitKey(0);
        return 0;
    }
    
    void connected_component_demo(Mat &image)
    {
        //binarization.
        Mat gray, binary;
        cvtColor(image, gray, COLOR_BGR2GRAY);
        threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
        //morphology.
        Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
        morphologyEx(binary, binary, MORPH_OPEN, k);
        morphologyEx(binary, binary, MORPH_CLOSE, k);
        imshow("binary", binary);
        imwrite("./ccla_binary.png", binary);
        Mat labels = Mat::zeros(image.size(), CV_32S);
        int num_labels = connectedComponents(binary, labels, 8, CV_32S);
        printf("total labels: %d
    ", (num_labels-1));
        vector<Vec3b> colors(num_labels);
        //background color.
        colors[0] = Vec3b(0, 0, 0);
        //object color.
        for (int i = 1; i < num_labels; i++)
        {
            colors[i] = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
        }
        //render result.
        Mat dst = Mat::zeros(image.size(), image.type());
        int w = image.cols;
        int h = image.rows;
        for (int row = 0; row < h; row++)
        {
            for (int col = 0; col < w; col++)
            {
                int label = labels.at<int>(row, col);
                if (label == 0) continue;
                dst.at<Vec3b>(row, col) = colors[label];
            }
        }
        imshow("ccla_demo", dst);
        imwrite("./ccla_dst.png", dst);
    
    }
    
    void connected_component_stats_demo(Mat &image)
    {
        //binarization.
        Mat gray, binary;
        cvtColor(image, gray, COLOR_BGR2GRAY);
        threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
        //morphology.
        Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
        morphologyEx(binary, binary, MORPH_OPEN, k);
        morphologyEx(binary, binary, MORPH_CLOSE, k);
        imshow("binary", binary);
        Mat labels = Mat::zeros(image.size(), CV_32S);
        Mat stats, centroids;
        int num_labels = connectedComponentsWithStats(binary, labels, stats, centroids, 8, 4);
        printf("total labels: %d
    ", (num_labels-1));
        vector<Vec3b> colors(num_labels);
        //background color.
        colors[0] = Vec3b(0, 0, 0);
        //object color.
        int b = rng.uniform(0, 256);
        int g = rng.uniform(0, 256);
        int r = rng.uniform(0, 256);
        for (int i = 1; i < num_labels; i++)
        {
            colors[i] = Vec3b(0, 255, 0);
        }
        //render result.
        Mat dst = Mat::zeros(image.size(), image.type());
        int w = image.cols;
        int h = image.rows;
        for (int row = 0; row < h; row++)
        {
            for (int col = 0; col < w; col++)
            {
                int label = labels.at<int>(row, col);
                if (label == 0) continue;
                dst.at<Vec3b>(row, col) = colors[label];
            }
        }
        
        for (int i = 1; i < num_labels; i++)
        {
            Vec2b pt = centroids.at<Vec2d>(i, 0);
            int x = stats.at<int>(i, CC_STAT_LEFT);
            int y = stats.at<int>(i, CC_STAT_TOP);
            int width = stats.at<int>(i, CC_STAT_WIDTH);
            int height = stats.at<int>(i, CC_STAT_HEIGHT);
            int area = stats.at<int>(i, CC_STAT_AREA);
            printf("area: %d, center point(%.2f, %.2f)
    ", area, pt[0], pt[1]);
            circle(dst, Point(pt[0], pt[1]), 2, Scalar(0, 0, 255), -1, 8, 0 );
            rectangle(dst, Rect(x, y, width, height), Scalar(255, 0, 255), 1, 8, 0);
        }
        imshow("ccla-demo", dst);
        imwrite("ccla_stats_dst.png", dst);
    
    }
    View Code

    参考

    1.OpenCV实现图像连通组件标记与分析

    End

  • 相关阅读:
    android自己定义控件系列教程----视图
    Android怎样监听蓝牙耳机的按键事件
    Putty SSH简单使用
    Linux配置无线网卡驱动实现无线上网
    Oracle在中文环境下出现乱码解决办法
    百度云盘破解限速|个人值得拥有
    Ubuntu安装出现左上角光标一直闪解决方式
    ubuntu-16.4TLS安装QQ
    2015毕业找工作纪实|一年的蜕变毕业生
    安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/9172772.html
Copyright © 2011-2022 走看看