ZBLOG

C++ opencv 二值化图像 连通域检测去掉小于1个像素的

在C++中使用OpenCV进行二值化图像的连通域检测并去掉小于1个像素的区域,可以按照以下步骤实现:

  1. 读取图像:加载待处理的图像。
  2. 转换为灰度图:如果是彩色图像,需要先将其转换为灰度图。
  3. 二值化:使用阈值操作将灰度图转换为二值图。
  4. 连通域标记:使用cv::connectedComponents函数检测连通域。
  5. 过滤小连通域:根据需要过滤掉小于特定面积的连通域。

下面是一个简单的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 1. 读取图像
    cv::Mat image = cv::imread("image.png");
    if (image.empty()) {
        std::cerr << "Error: Unable to load image!" << std::endl;
        return -1;
    }

    // 2. 转换为灰度图
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

    // 3. 二值化
    cv::Mat binary;
    cv::threshold(gray, binary, 128, 255, cv::THRESH_BINARY);

    // 4. 连通域检测
    cv::Mat labels;
    int numLabels = cv::connectedComponents(binary, labels);

    // 创建一个新的输出图像用于显示结果
    cv::Mat output = cv::Mat::zeros(labels.size(), CV_8UC3);

    for (int label = 1; label < numLabels; ++label) { // 从1开始,0是背景
        // 创建一个掩码,提取当前标签区域
        cv::Mat mask = (labels == label);
        
        // 计算区域面积
        double area = static_cast<double>(cv::countNonZero(mask));

        // 如果面积大于等于1个像素,保留该区域
        if (area >= 1) {
            output.setTo(cv::Scalar(0, 255, 0), mask); // 用绿色表示被保留的区域
        }
    }

    // 显示结果
    cv::imshow("Original Image", image);
    cv::imshow("Binary Image", binary);
    cv::imshow("Filtered Connected Components", output);
    
    cv::waitKey(0);
    
    return 0;
}

注意事项:

  • 替换 "image.png" 为你的输入文件名。
  • 在实际应用中,根据需求调整阈值、颜色和其他参数。
  • 对于大于或等于特定大小(例如 size >= x)进行过滤,你可以修改 if (area >= x) 的条件。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?