opencv自适应阈值

来源:互联网 发布:什么叫网络编程 编辑:程序博客网 时间:2024/06/06 07:43
在图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域背景区域,仅仅通过设定固定阈值很难达到理想的分割效果。在实践应用中,目标及背景区域通常相互依存在图像块中,我们可以通过图像像素领域快的分布特征来自适应确定阈值的二值化阈值。对于图像块中亮度变化明显的区域,自适应阈值通常会设置的比较大或者比较小,进而保证图像中各个像素的阈值会随着周围领域的变化而变化。
opencv中提供了自适应阈值化函数adaptiveThreshold,该函数有两种自适应阈值化类型参数可供选择,用来对当前像素点与领域像素块进行阈值计算。
void adaptiveThreshold(InoutArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C
实现图像的自适应阈值化操作。参数src表示源图像数组(单通道8位图像)。参数dst表示输出图像组(与输入图像同样的尺寸和类型)。参数maxVal表示预示满足条件的最大值。参数adaptiveMethod表示自适应阈值算法选择ADAPTIVE_THRESHOLD_MEAN_C或者ADAPTIVE_THRESHOLD_GAUSSIAN_C。参数thresholdType表示阈值类型THRESHOLD_BINARY和THRESHOLD_BINARY_INV。参数blockSize表示领域块的大小,用来计算区域阈值,一般选择3、5、7............。参数C表示常数,它是一个从均值或者加权均值提取的常数,可以是负数。

代码如下:

  1. #include"opencv2/highgui/highgui.hpp"
  2. #include"opencv2/imgproc/imgproc.hpp"
  3. #include"opencv2/opencv.hpp"
  4. #include"opencv2/core/core.hpp"
  5. #include<stdio.h>
  6. #include<string>
  7. usingnamespace std;
  8. usingnamespace cv;
  9. int main()
  10. {
  11. cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");
  12. if(srcImage.empty())
  13. {
  14. return-1;
  15. }
  16. cv::imshow("原图像", srcImage);
  17. //灰度转换
  18. cv::Mat srcGray;
  19. cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  20. cv::imshow("srcGray", srcGray);
  21. cv::Mat dstImage;
  22. //初始化自适应阈值参数
  23. int blockSize =5;
  24. int constValue =20;
  25. int maxValue =255;
  26. //自适应阈值算法0:ADAPTIVE_THRESHOLD_MEAN_C,1:ADAPTIVE_GAUSSIAN_MEAN_C
  27. //阈值类型,0:THRESHOLD_BINARY,1:THRESHOLD_BINARY_INV
  28. int adaptiveMthod =0;
  29. int thresholdType =1;
  30. //图像自适应阈值操作
  31. cv::adaptiveThreshold(srcGray, dstImage, maxValue, adaptiveMthod, thresholdType, blockSize, constValue);
  32. cv::imshow("dstImage", dstImage);
  33. cv::waitKey(0);
  34. //预设最大值
  35. constint maxVal=255;
  36. return0;
  37. }

原创粉丝点击