函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvThreshold(

const CvArr* src,

CvArr* dst,

double threshold,

double max_value,

int threshold_type

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。

/* Threshold types */

enum

{

CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

CV_THRESH_MASK        =7,

CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

};

注释已经写的很清楚了,因此不再用中文来表达了。

二. 示例程序代码

下面给出对图像进行二值化的完整的源代码:

  1. //图像的二值化
  2. //By MoreWindows (http://blog.csdn.net/MoreWindows)
  3. #include <opencv2/opencv.hpp>
  4. using namespace std;
  5. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  6. IplImage *g_pGrayImage = NULL;
  7. IplImage *g_pBinaryImage = NULL;
  8. const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)";
  9. void on_trackbar(int pos)
  10. {
  11. // 转为二值图
  12. cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
  13. // 显示二值图
  14. cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);
  15. }
  16. int main( int argc, char** argv )
  17. {
  18. const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";
  19. const char *pstrWindowsToolBarName = "二值图阈值";
  20. // 从文件中加载原图
  21. IplImage *pSrcImage = cvLoadImage("002.jpg", CV_LOAD_IMAGE_UNCHANGED);
  22. // 转为灰度图
  23. g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
  24. cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);
  25. // 创建二值图
  26. g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
  27. // 显示原图
  28. cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
  29. cvShowImage(pstrWindowsSrcTitle, pSrcImage);
  30. // 创建二值图窗口
  31. cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);
  32. // 滑动条
  33. int nThreshold = 0;
  34. cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);
  35. on_trackbar(1);
  36. cvWaitKey(0);
  37. cvDestroyWindow(pstrWindowsSrcTitle);
  38. cvDestroyWindow(pstrWindowsBinaryTitle);
  39. cvReleaseImage(&pSrcImage);
  40. cvReleaseImage(&g_pGrayImage);
  41. cvReleaseImage(&g_pBinaryImage);
  42. return 0;
  43. }

运行结果如下所示,读者可以到下载源文件和程序(Release版本,不用安装OpenCV也能使用),自己动手调试下阈值大小,看看生成的二值图有什么变化。

OpenCV还有个cvAdaptiveThreshold()函数,这个函数会使用Otsu算法(大律法或最大类间方差法)(注1)来计算出一个全局阈值,然后根据这个阈值进行二值化。

转载自http://www.oschina.net/question/565065_82704

OpenCV中对图像进行二值化的关键函数——cvThreshold()。的更多相关文章

  1. opencv中对图片的二值化操作并提取特定颜色区域

    一.最近因为所在的实习公司要求用opencv视觉库来写一个对图片识别并提取指定区域的程序.看了很多资料,只学会了皮毛,下面附上简单的代码.运行程序之前需要安装opencv库,官网地址为:https:/ ...

  2. opencv 对RGB图像直接二值化

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  3. OpenCV图像的二值化

    图像的二值化: 与边缘检测相比,轮廓检测有时能更好的反映图像的内容.而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出 ...

  4. python实现超大图像的二值化方法

    一,分块处理超大图像的二值化问题   (1) 全局阈值处理  (2) 局部阈值 二,空白区域过滤 三,先缩放进行二值化,然后还原大小 np.mean() 返回数组元素的平均值 np.std() 返回数 ...

  5. 实现图像的二值化(java+opencv)

    书里的解释: 其他的没找到什么资料,直接参考百度百科 https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E4%BA%8C%E5%80%BC%E5%8C%9 ...

  6. opencv图像二值化的函数cvThreshold()。 cvAdaptiveThreshol

    OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* sr ...

  7. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  8. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

  9. Opencv实现图像的灰度处理,二值化,阀值选择

    前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...

随机推荐

  1. JavaWeb学习笔记——开发动态WEB资源(一)Java程序向浏览器输出数据

    开发一个动态web资源,即开发一个Java程序向浏览器输出数据,需要完成以下2个步骤: 1.编写一个Java类,实现Servlet接口 开发一个动态web资源必须实现javax.servlet.Ser ...

  2. new和alloc init的区别

    背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写 法,保留new一是向后兼容,二是很多时候是一种更简单的写法.其实是一样的,new在内部调用 的all ...

  3. Multiple sequence alignment Benchmark Data set

    Multiple sequence alignment Benchmark Data set 1. 汇总: 序列比对标准数据集: http://www.drive5.com/bench/ This i ...

  4. PetaPoco 使用总结(一)

    PetaPoco 使用总结(一) 前段时间,公司的一个项目希望用一个ORM 的框架,通过对比 Dapper 和 PetaPoco ,虽然Dapper 功能很强大,速度更快. 但是最终还是选择了比较简单 ...

  5. 【转】七年IT经验的七个总结

    http://www.unitymanual.com/thread-30000-1-1.html?_dsign=ebe6a043 1.分享第一条经验:“学历代表过去.能力代表现在.学习力代表未来.” ...

  6. ProFTPD <=1.3.5 mod_copy 未授权文件复制漏洞

    poc如下: #!/usr/bin/env python# coding=utf-8 """Site: http://www.beebeeto.com/Framework ...

  7. Effective Objective-C 2.0 — 第13条:用“方法调配 技术” 调试 “黑盒方法”

    自己理解是调配了方法 在运行期,可以向类中新增或替换选择子所对应的方法实现. 使用另一份实现来替换原有的方法实现,这道工序叫做“方法调配”,开发者常用此技术向原有实现中添加新功能. 一般来说,只有调试 ...

  8. python实用笔记,加快编程速度,lamdba,三元运算,open.

    lamdba   表达式.    #   f1=lamdba x:x+1 三元运算                 #    b=True if 1 < 2 else False with op ...

  9. JSTL I18N 格式标签库

    <%@ page language="java" pageEncoding="gbk"%> <%@ taglib prefix="c ...

  10. java中InvocationHandler 用于实现代理。

    以下的内容部分参考了网络上的内容,在此对原作者表示感谢! Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的 ...