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

时间:2022-07-29 08:23:44

函数功能:采用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中对图像进行二值化的关键函数——cvThreshold()。

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

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