当前位置:   article > 正文

使用OpenCV C++进行图像二值化操作_opencv c++ 二值化

opencv c++ 二值化

threshold()

  1. double cv::threshold(
  2. InputArray src,
  3. OutputArray dst,
  4. double thresh,
  5. double maxval,
  6. int type
  7. )

threshold()将固定阈值应用于多通道图像阵列,通常用于从灰度图像中获得二值图像或用于去除噪声,即滤除值过小或过大的像素。该函数支持几种类型的阈值设置,它们由类型参数决定。

参数

src:输入数组(多通道,8位或32位浮点数)

dst:输出数组(与src的尺寸、类型、通道数相同)

thresh:阈值

maxval:最大值

type:阈值类型

返回值

如果使用Otsu或Triangle方法,将返回计算出的阈值。

ThresholdTypes

阈值操作的类型

  1. THRESH_BINARY(二值化阈值处理):

    • THRESH_BINARY方法将图像中的像素值与给定的阈值进行比较,大于等于阈值的像素被设置为一个最大值(通常为255),小于阈值的像素被设置为0。
    • 最佳用途:适用于分离目标物体和背景,或者在需要检测物体边缘时,可以用于边缘检测。
  2. THRESH_BINARY_INV(反二值化阈值处理):

    • THRESH_BINARY_INV与THRESH_BINARY相反,大于等于阈值的像素被设置为0,小于阈值的像素被设置为最大值。
    • 最佳用途:适用于与THRESH_BINARY相反的情况,或者在需要突出物体的特定区域时,可以用于增强物体的特征。
  3. THRESH_TRUNC(截断阈值处理):

    • THRESH_TRUNC方法保留小于等于阈值的像素值,而大于阈值的像素值被设置为阈值。
    • 最佳用途:适用于保留图像中的某个范围内的像素值,可以用于增强图像的对比度。
  4. THRESH_TOZERO(截断为零阈值处理):

    • THRESH_TOZERO方法保留大于等于阈值的像素值,小于阈值的像素值被设置为零。
    • 最佳用途:适用于突出图像中的亮部分,可以用于增强图像的亮部细节。
  5. THRESH_TOZERO_INV(反截断为零阈值处理):

    • THRESH_TOZERO_INV与THRESH_TOZERO相反,大于等于阈值的像素值被设置为零,小于阈值的像素值保持不变。
    • 最佳用途:适用于突出图像中的暗部分,可以用于增强图像的暗部细节。

 (上述回答来自ChatGPT)

特殊值THRESH_OTSU或THRESH_TRIANGLE可以与上述值中的一个组合。在这些情况下,函数使用Otsu's或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。

THRESH_OTSU与THRESH_TRIANGLE分别使用Otsu和Triangle算法选择最佳阈值。

测试代码:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. int main(int argc, char* argv[])
  6. {
  7. Mat img = imread("path");
  8. Mat gray;
  9. cvtColor(img, gray, COLOR_BGR2GRAY);
  10. Mat imgB, imgBInv, imgTrunc, imgTZ, imgTZInv;
  11. // 也可进行彩色图像的阈值化
  12. threshold(gray, imgTrunc, 125, 255, THRESH_TRUNC);
  13. threshold(gray, imgB, 125, 255, THRESH_BINARY);
  14. threshold(gray, imgBInv, 125, 255, THRESH_BINARY_INV);
  15. threshold(gray, imgTrunc, 125, 255, THRESH_TRUNC);
  16. threshold(gray, imgTZ, 125, 255, THRESH_TOZERO);
  17. threshold(gray, imgTZInv, 125, 255, THRESH_TOZERO_INV);
  18. // 使用Otsu算法
  19. // threshold(gray, imgB, 125, 255, THRESH_BINARY | THRESH_OTSU);
  20. imshow("gray", gray);
  21. imshow("imgTrunc", imgTrunc);
  22. imshow("imgB", imgB);
  23. imshow("imgBInv", imgBInv);
  24. imshow("imgTZ", imgTZ);
  25. imshow("imgTZInv", imgTZInv);
  26. waitKey(0);
  27. }

运行结果:

 adaptiveThreshold()

  1. void cv::adaptiveThreshold (
  2. InputArray src,
  3. OutputArray dst,
  4. double maxValue,
  5. int adaptiveMethod,
  6. int thresholdType,
  7. int blockSize,
  8. double C
  9. )

对图像阵列应用自适应阈值,该函数根据公式将灰度图像变换为二值图像:

 其中T(x,y)是针对每个像素单独计算的阈值。

参数

src:八位单通道图像

dst:与src尺寸和类型相同的目标图像

maxValue:赋给满足条件的像素的非零值

adaptiveMethod:使用的自适应阈值算法

thresholdType:阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV

blockSize:用于计算像素阈值的像素邻域大小:3,5,7......

C:从平均值或加权平均值中减去的常数。通常,它是正的。

AdaptiveThresholdTypes

测试代码:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. int main(int argc, char* argv[])
  6. {
  7. Mat img = imread("path");
  8. Mat gray;
  9. cvtColor(img, gray, COLOR_BGR2GRAY);
  10. Mat imgB, imgMean, imgGaussian;
  11. threshold(gray, imgB, 125, 255, THRESH_BINARY);
  12. // adaptiveThreshold() 只能接受灰度图像
  13. adaptiveThreshold(gray, imgMean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 7, 0);
  14. adaptiveThreshold(gray, imgGaussian, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 0);
  15. imshow("gray", gray);
  16. imshow("imgB", imgB);
  17. imshow("imgMean", imgMean);
  18. imshow("imgGaussian", imgGaussian);
  19. waitKey(0);
  20. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/954931
推荐阅读
相关标签
  

闽ICP备14008679号