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...\n");
    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\n", (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\n", (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)\n", 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

posted on   鹅要长大  阅读(1431)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2016-06-12 使用matlab和ISE 创建并仿真ROM IP核

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示