ZBLOG

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

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

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

以下是示例代码:

  1. #include <opencv2/opencv.hpp>
  2. #include <vector>
  3. #include <algorithm>
  4. int main() {
  5. // 读取图像
  6. cv::Mat image = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);
  7. if (image.empty()) {
  8. std::cerr << "Could not read the image." << std::endl;
  9. return -1;
  10. }
  11. // 二值化处理
  12. cv::Mat binaryImage;
  13. cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);
  14. // 使用 connectedComponents 检测连通域
  15. cv::Mat labels;
  16. int numLabels = cv::connectedComponents(binaryImage, labels);
  17. // 创建一个向量来存储每个标签对应的面积
  18. std::vector<int> areas(numLabels, 0);
  19. // 计算每个连通区域的面积
  20. for (int i = 0; i < labels.rows; ++i) {
  21. for (int j = 0; j < labels.cols; ++j) {
  22. int label = labels.at<int>(i, j);
  23. if (label > 0) { // 忽略背景(标签为0)
  24. areas[label]++;
  25. }
  26. }
  27. }
  28. // 找到最大的两个连通区域的索引
  29. std::vector<std::pair<int, int>> areaIndexPairs;
  30. for (int i = 1; i < areas.size(); ++i) {
  31. areaIndexPairs.emplace_back(areas[i], i);
  32. }
  33. // 按照面积降序排序,并获取前两个最大值
  34. std::sort(areaIndexPairs.begin(), areaIndexPairs.end(), std::greater<>());
  35. int largestLabel = areaIndexPairs[0].second;
  36. int secondLargestLabel = areaIndexPairs.size() > 1 ? areaIndexPairs[1].second : -1;
  37. // 创建输出图像,只绘制最大两个连通域
  38. cv::Mat outputImage = cv::Mat::zeros(binaryImage.size(), CV_8UC1);
  39. if (largestLabel != -1) {
  40. outputImage.setTo(cv::Scalar(255), labels == largestLabel);
  41. }
  42. if (secondLargestLabel != -1) {
  43. outputImage.setTo(cv::Scalar(128), labels == secondLargestLabel);
  44. }
  45. // 显示结果
  46. cv::imshow("Original Image", image);
  47. cv::imshow("Binary Image", binaryImage);
  48. cv::imshow("Largest Two Connected Components", outputImage);
  49. cv::waitKey(0);
  50. return 0;
  51. }

注意事项:

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?