c++ opencv将彩色图像按连通域区分

要将彩色图像按连通域区分,您可以使用 OpenCV 中的 cv::connectedComponents 函数。

下面是一个简单的示例代码,说明如何使用 cv::connectedComponents 函数来检测并标记图像中的连通域:

复制代码
#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取彩色图像
    cv::Mat image = cv::imread("image.jpg");

    // 将图像转换为灰度
    cv::Mat grayImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

    // 使用二值化将图像转换为二进制图像
    cv::Mat binaryImage;
    cv::threshold(grayImage, binaryImage, 0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);

    // 定义连通域标记图像
    cv::Mat labels;

    // 应用连通域检测算法
    int numLabels = cv::connectedComponents(binaryImage, labels);

    // 创建随机颜色向量,用于绘制每个连通域
    std::vector<cv::Vec3b> colors(numLabels);
    colors[0] = cv::Vec3b(0, 0, 0); // 背景设置为黑色

    for (int i = 1; i < numLabels; i++)
    {
        colors[i] = cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);
    }

    // 将每个连通域根据其标签值着色
    cv::Mat connectedComponentsImage(image.size(), CV_8UC3);
    for (int y = 0; y < image.rows; y++)
    {
        for (int x = 0; x < image.cols; x++)
        {
            int label = labels.at<int>(y, x);
            cv::Vec3b &color = connectedComponentsImage.at<cv::Vec3b>(y, x);

            color = colors[label];
        }
    }

    // 显示原始图像和标记的连通域图像
    cv::imshow("Original Image", image);
    cv::imshow("Connected Components", connectedComponentsImage);
    cv::waitKey(0);

    return 0;
}

这段代码首先读取彩色图像,然后将其转换为灰度图像。接下来,使用 cv::threshold 函数将灰度图像二值化,生成二进制图像。然后,使用 cv::connectedComponents 函数应用连通域检测算法。最后,根据每个连通域的标签值,使用随机颜色向量对每个连通域进行着色。最后,将原始图像和标记的连通域图像显示出来。

您可以根据您的需求修改此示例代码。

8/29/2023, 2:06:42 PM

相关推荐
liulilittle16 分钟前
过冲:拥塞控制的呼吸与盲行
linux·网络·c++·tcp/ip·计算机网络·tcp·通信
小欣加油44 分钟前
leetcode2574 左右元素和的差值
数据结构·c++·算法·leetcode·职场和发展
weixin_461769401 小时前
通过数组和队列构造二叉树方法(用于算法测试),C++ vector不能直接使用null
数据结构·c++·算法·vector·nullptr·null
YOLO数据集集合1 小时前
智慧林业无人机巡检 松材线虫病害树木实例分割数据集 | 森林枯木识别 深度学习视觉
人工智能·深度学习·目标检测·计算机视觉·无人机
千寻girling1 小时前
一周没跑步了 ,今日跑步 5KM , 哑铃+健身 20min , 俯卧撑 30 个 ;
数据结构·c++·python·算法·leetcode·职场和发展·线性回归
坚果派·白晓明1 小时前
鸿蒙PC三方库使用:使用 AtomCode + Skills 自动完成鸿蒙化三方库spdlog集成
c++·华为·ai编程·harmonyos·skills·atomcode·c/c++三方库
玖玥拾1 小时前
C/C++ 基础笔记(九)联合、枚举及文件操作
c语言·c++·文件操作·枚举·联合
liulilittle1 小时前
拥塞控制:公平性的不可能三角
网络·c++·网络协议·tcp/ip·计算机网络·tcp·通信
姚愚谦3 小时前
C++中的push_back与emplace_back的区别?
c++
青春:一叶知秋5 小时前
【C++】protobuf序列化与反序列化
开发语言·c++