ZBLOG

cv::connectedComponents保留面积最大的两个

要使用 cv::connectedComponents 函数并保留面积最大的两个连通域,你可以按以下步骤实现:

  1. 加载和二值化图像
  2. 使用 cv::connectedComponents 来检测连通域。
  3. 计算每个连通域的面积,并找到最大的两个。
  4. 创建输出图像,只绘制这两个最大连通域。

以下是示例代码:

#include <opencv2/opencv.hpp>
#include <vector>
#include <algorithm>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
        std::cerr << "Could not read the image." << std::endl;
        return -1;
    }

    // 二值化处理
    cv::Mat binaryImage;
    cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);

    // 使用 connectedComponents 检测连通域
    cv::Mat labels;
    int numLabels = cv::connectedComponents(binaryImage, labels);

    // 创建一个向量来存储每个标签对应的面积
    std::vector<int> areas(numLabels, 0);

    // 计算每个连通区域的面积
    for (int i = 0; i < labels.rows; ++i) {
        for (int j = 0; j < labels.cols; ++j) {
            int label = labels.at<int>(i, j);
            if (label > 0) { // 忽略背景(标签为0)
                areas[label]++;
            }
        }
    }

    // 找到最大的两个连通区域的索引
    std::vector<std::pair<int, int>> areaIndexPairs;
    
    for (int i = 1; i < areas.size(); ++i) {
        areaIndexPairs.emplace_back(areas[i], i);
    }

   // 按照面积降序排序,并获取前两个最大值
   std::sort(areaIndexPairs.begin(), areaIndexPairs.end(), std::greater<>());

   int largestLabel = areaIndexPairs[0].second;
   int secondLargestLabel = areaIndexPairs.size() > 1 ? areaIndexPairs[1].second : -1;

   // 创建输出图像,只绘制最大两个连通域
   cv::Mat outputImage = cv::Mat::zeros(binaryImage.size(), CV_8UC1);

   if (largestLabel != -1) {
       outputImage.setTo(cv::Scalar(255), labels == largestLabel); 
   }

   if (secondLargestLabel != -1) {
       outputImage.setTo(cv::Scalar(128), labels == secondLargestLabel); 
   }

   // 显示结果
   cv::imshow("Original Image", image);
   cv::imshow("Binary Image", binaryImage);
   cv::imshow("Largest Two Connected Components", outputImage);

   cv::waitKey(0);
   
   return 0;
}

注意事项:

  • 确保将 "path_to_your_image.jpg" 替换为您的实际图像路径。
  • 您可能需要根据具体情况调整阈值(在 cv::threshold 中)。
  • 此代码仅显示两种颜色来区分最大的两个连通域,您可以根据需要自定义颜色或其他效果。

运行此代码后,将会展示原始图像、二值化后的图像以及仅包含最大两个连通域的输出图像。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19507

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?