ZBLOG

C++ opencv 二值化图像 连通域检测 保留面积最大的两个

要在C++中使用OpenCV进行二值化图像的连通域检测,并保留面积最大的两个连通域,可以遵循以下步骤:

  1. 加载图像并进行预处理。
  2. 二值化图像以获取黑白图。
  3. 使用cv::findContours检测连通区域。
  4. 计算每个连通区域的面积,找到最大的两个。
  5. 创建一个新的图像,只绘制这两个最大连通区域。

以下是示例代码:

#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);

    // 找到轮廓
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(binaryImage, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // 根据面积排序
    std::vector<std::pair<double, int>> areas; // (area, index)
    
    for (size_t i = 0; i < contours.size(); i++) {
        double area = cv::contourArea(contours[i]);
        areas.push_back(std::make_pair(area, i));
    }

    // 按照面积降序排序
    std::sort(areas.begin(), areas.end(), std::greater<>());

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

    for (int i = 0; i < 2 && i < areas.size(); ++i) {
        int index = areas[i].second;
        cv::drawContours(outputImage, contours, index, cv::Scalar(255), CV_FILLED);
    }

    // 显示结果
    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 替换为您要处理的图像路径。
  • 您可能需要根据实际情况调整阈值(这里是128)以获得更好的二值化效果。
  • 确保您已安装OpenCV库,并正确配置了编译环境。

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?