温馨提示×

温馨提示×

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

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

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

发布时间:2021-07-02 17:47:30 来源:亿速云 阅读:370 作者:Leah 栏目:大数据

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

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

1. 阈值操作的基本概念

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

  • 二值化(Binary Thresholding):将像素值大于阈值的部分设置为一个最大值(通常为255),小于阈值的部分设置为0。
  • 反二值化(Inverse Binary Thresholding):与二值化相反,将像素值大于阈值的部分设置为0,小于阈值的部分设置为最大值。
  • 截断(Truncate Thresholding):将像素值大于阈值的部分设置为阈值,小于阈值的部分保持不变。
  • 阈值化为0(Threshold to Zero):将像素值小于阈值的部分设置为0,大于阈值的部分保持不变。
  • 反阈值化为0(Inverse Threshold to Zero):将像素值大于阈值的部分设置为0,小于阈值的部分保持不变。

2. OpenCV 中的阈值操作函数

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

double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type); 
  • src:输入图像,通常为单通道灰度图像。
  • dst:输出图像,与输入图像具有相同的尺寸和类型。
  • thresh:阈值。
  • maxval:当像素值大于阈值时,设置的最大值(仅适用于二值化和反二值化操作)。
  • type:阈值操作的类型,可以是以下值之一:
    • cv::THRESH_BINARY:二值化。
    • cv::THRESH_BINARY_INV:反二值化。
    • cv::THRESH_TRUNC:截断。
    • cv::THRESH_TOZERO:阈值化为0。
    • cv::THRESH_TOZERO_INV:反阈值化为0。

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); 
  • src:输入图像,通常为单通道灰度图像。
  • dst:输出图像,与输入图像具有相同的尺寸和类型。
  • maxValue:当像素值大于阈值时,设置的最大值。
  • adaptiveMethod:自适应阈值算法,可以是以下值之一:
    • cv::ADAPTIVE_THRESH_MEAN_C:使用局部区域的均值作为阈值。
    • cv::ADAPTIVE_THRESH_GAUSSIAN_C:使用局部区域的高斯加权均值作为阈值。
  • thresholdType:阈值操作的类型,只能是 cv::THRESH_BINARYcv::THRESH_BINARY_INV
  • blockSize:局部区域的大小,必须为奇数。
  • 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 中的阈值操作。

向AI问一下细节

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

AI