C++ 中怎么利用OpenCV实现阈值操作

发布时间:2021-07-02 17:47:30 作者:Leah
来源:亿速云 阅读:345

C++ 中怎么利用OpenCV实现阈值操作

在图像处理中,阈值操作是一种非常基础且重要的技术。它可以将图像中的像素值根据设定的阈值进行分类,从而实现图像的二值化、分割等操作。OpenCV 提供了多种阈值操作的方法,本文将详细介绍如何在 C++ 中使用 OpenCV 实现这些操作。

1. 阈值操作的基本概念

阈值操作的核心思想是将图像中的像素值与一个或多个阈值进行比较,根据比较结果将像素值设置为不同的值。常见的阈值操作包括:

2. OpenCV 中的阈值操作函数

OpenCV 提供了 cv::threshold 函数来实现上述的阈值操作。该函数的原型如下:

double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

3. 代码示例

下面我们通过一个简单的代码示例来演示如何使用 OpenCV 实现不同的阈值操作。

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

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

    // 定义输出图像
    cv::Mat dst;

    // 设置阈值和最大值
    double thresh = 127;
    double maxval = 255;

    // 二值化
    cv::threshold(src, dst, thresh, maxval, cv::THRESH_BINARY);
    cv::imshow("Binary Thresholding", dst);

    // 反二值化
    cv::threshold(src, dst, thresh, maxval, cv::THRESH_BINARY_INV);
    cv::imshow("Inverse Binary Thresholding", dst);

    // 截断
    cv::threshold(src, dst, thresh, maxval, cv::THRESH_TRUNC);
    cv::imshow("Truncate Thresholding", dst);

    // 阈值化为0
    cv::threshold(src, dst, thresh, maxval, cv::THRESH_TOZERO);
    cv::imshow("Threshold to Zero", dst);

    // 反阈值化为0
    cv::threshold(src, dst, thresh, maxval, cv::THRESH_TOZERO_INV);
    cv::imshow("Inverse Threshold to Zero", dst);

    // 等待按键
    cv::waitKey(0);
    return 0;
}

代码解析

  1. 读取图像:我们使用 cv::imread 函数读取一张灰度图像。如果图像读取失败,程序会输出错误信息并退出。

  2. 定义输出图像:我们定义了一个 cv::Mat 类型的变量 dst,用于存储阈值操作后的结果。

  3. 设置阈值和最大值:我们设置了阈值为127,最大值为255。这些值可以根据实际需求进行调整。

  4. 执行阈值操作:我们分别使用 cv::threshold 函数执行了五种不同的阈值操作,并将结果显示在窗口中。

  5. 显示结果:使用 cv::imshow 函数显示每种阈值操作的结果,并使用 cv::waitKey 函数等待用户按键。

4. 自适应阈值操作

除了固定阈值操作外,OpenCV 还提供了自适应阈值操作(Adaptive Thresholding)。自适应阈值操作可以根据图像的局部区域动态调整阈值,适用于光照不均匀的图像。

OpenCV 提供了 cv::adaptiveThreshold 函数来实现自适应阈值操作。该函数的原型如下:

void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);

代码示例

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

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

    // 定义输出图像
    cv::Mat dst;

    // 设置最大值
    double maxval = 255;

    // 自适应阈值操作
    cv::adaptiveThreshold(src, dst, maxval, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 2);
    cv::imshow("Adaptive Thresholding (Mean)", dst);

    cv::adaptiveThreshold(src, dst, maxval, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 11, 2);
    cv::imshow("Adaptive Thresholding (Gaussian)", dst);

    // 等待按键
    cv::waitKey(0);
    return 0;
}

代码解析

  1. 读取图像:与之前的示例相同,我们读取了一张灰度图像。

  2. 定义输出图像:定义了一个 cv::Mat 类型的变量 dst,用于存储自适应阈值操作后的结果。

  3. 设置最大值:我们设置了最大值为255。

  4. 执行自适应阈值操作:我们分别使用 cv::adaptiveThreshold 函数执行了两种不同的自适应阈值操作,并将结果显示在窗口中。

  5. 显示结果:使用 cv::imshow 函数显示每种自适应阈值操作的结果,并使用 cv::waitKey 函数等待用户按键。

5. 总结

本文介绍了如何在 C++ 中使用 OpenCV 实现阈值操作。我们首先介绍了阈值操作的基本概念,然后详细讲解了 cv::thresholdcv::adaptiveThreshold 函数的使用方法,并通过代码示例演示了如何实现不同的阈值操作。阈值操作是图像处理中的基础技术,掌握这些操作对于后续的图像处理任务非常重要。希望本文能够帮助读者更好地理解和应用 OpenCV 中的阈值操作。

推荐阅读:
  1. opencv3/C++中基于颜色实现目标跟踪的方式
  2. C++中如何实现OpenCV图像分割与分水岭算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opencv

上一篇:Linux的常用命令有哪些

下一篇:临时表在SQL优化中的作用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》