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


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

    函数原型:

    void cvThreshold(

      const CvArr* src,

      CvArr* dst,

      double threshold,

      double max_value,

      int threshold_type

    );

    函数说明:

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

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

    第三个参数表示阈值

    第四个参数表示最大值。

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

    在OpenCV的imgproc ypes_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.   
    6. #pragma comment(linker, "/subsystem:"windows" /entry:"mainCRTStartup"")  
    7.   
    8. IplImage *g_pGrayImage = NULL;  
    9. IplImage *g_pBinaryImage = NULL;  
    10. const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)";  
    11.   
    12. void on_trackbar(int pos)  
    13. {  
    14.     // 转为二值图  
    15.     cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);  
    16.     // 显示二值图  
    17.     cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);  
    18. }  
    19.   
    20. int main( int argc, char** argv )  
    21. {     
    22.     const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";  
    23.     const char *pstrWindowsToolBarName = "二值图阈值";  
    24.   
    25.     // 从文件中加载原图  
    26.     IplImage *pSrcImage = cvLoadImage("002.jpg", CV_LOAD_IMAGE_UNCHANGED);  
    27.   
    28.     // 转为灰度图  
    29.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
    30.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
    31.   
    32.     // 创建二值图  
    33.     g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);  
    34.   
    35.     // 显示原图  
    36.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
    37.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
    38.     // 创建二值图窗口  
    39.     cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);  
    40.   
    41.     // 滑动条    
    42.     int nThreshold = 0;  
    43.     cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);  
    44.   
    45.     on_trackbar(1);  
    46.   
    47.     cvWaitKey(0);  
    48.   
    49.     cvDestroyWindow(pstrWindowsSrcTitle);  
    50.     cvDestroyWindow(pstrWindowsBinaryTitle);  
    51.     cvReleaseImage(&pSrcImage);  
    52.     cvReleaseImage(&g_pGrayImage);  
    53.     cvReleaseImage(&g_pBinaryImage);  
    54.     return 0;  
    55. }  

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

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

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

  • 相关阅读:
    Java连接操作redis
    redis 6.0.x简介和安装
    设计模式之代理模式(proxy)
    设计模式之组合模式(composize)
    Linux Shell脚本调试方法
    linuxcfg.sh
    反向代理和正向代理区别
    WAF与IPS的区别总结
    【LemonCK】jQuery的基本使用
    【LemonCK】CSS盒子塌陷问题
  • 原文地址:https://www.cnblogs.com/Peit/p/6029046.html
Copyright © 2020-2023  润新知