zoukankan      html  css  js  c++  java
  • 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 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/Peit/p/6029046.html
Copyright © 2011-2022 走看看