函数功能:采用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. PHP无限分类分类导航LINK的代码

    <?php function getCatePath($cid,&$result=array()){ include("conn.php"); $sql=" ...

  2. Tortoise SVN 安装界面

    Tortoise SVN 安装界面 TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费 第一步: 点击TortoiseSVN-1.6.6.17493-w ...

  3. Beyond Compare for mac 无限试用方法

    1.在官网(http://www.scootersoftware.com/download.php)下载最新的 beyond compare. 2.解压后, 把 beyond compare 复制到应 ...

  4. Django基础,Day10 - template 模板引擎与路径设置

    作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支 ...

  5. HTML \ XHTML \XML 的区别

    虽然是很简单的知识,但如果总是在需要的时候去查找,不需要的时候就丢掉,未免心里总是觉的不踏实.因为你就像是垃圾收购站,有垃圾(知识)就往里面拖,拖不下了就丢掉一些(忘了).不去整理,也因此也不知道丢的 ...

  6. bash: ifconfig: command not found解决方法

    1.问题: #ifconfig bash: ifconfig: command not found 2.原因:非root用户的path中没有/sbin/ifconfig ,其它的命令也可以出现这种情况 ...

  7. 为什么要做url encode

    因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符.

  8. OC-self关键字

    self关键字 1. 成员变量和局部变量同名 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量 用self访问成员变量,区分同名的局部变量 2.使用细节 1)     出现的地方:所有的OC ...

  9. HBase命令(一) -- 库操作

    打开数据库 bin/start-hbase.sh //打开HBase bin/hbase shell //以命令行的方式打开Hbase控制台 Rest接口开启 bin/hbase rest //普通的 ...

  10. hdu5009 Paint Pearls (DP+模拟链表)

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...