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


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

    。。,反正我看了半天,是云里雾里的。所以就想先就笼统的过一遍,以后遇到了再详细分析,比較这方面的基础没那么扎实。

    先来记录下眼下学习到的一些知识。

    首先是图像的灰度处理:

    CV_LOAD_IMAGE_GRAYSCALE,这是最简单之间的办法,在加载图像时直接处理

    IplImage* Igray=cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);

    得到的图像就是单通道的,也能够用这个函数:CVAPI(void)  cvCvtColor( const CvArr* src, CvArr* dst, int code );

    code=CV_BGR2GRAY;

    opencv还提供了非常多方式,我这边就不一一举例了。



    图像的二值化是将图像上的像素点的灰度值设置为0或255。也就是将整个图像呈现出明显的黑白效果。

    灰度处理后就能够二值化了,这是方便图像处理的重要步骤,但貌似不适合对颜色有要求的图像处理,对轮廓有要求的比較有效。

    函数是这个:CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,
                                double  threshold, double  max_value,
                                int threshold_type );

    threshold是阀值。max_value取值255最大值

    threshold_type:就是显示的轮廓会有不同

    /* Types of thresholding */
    #define CV_THRESH_BINARY      0  /* value = value > threshold ?

    max_value : 0       */
    #define CV_THRESH_BINARY_INV  1  /* value = value > threshold ? 0 : max_value       */
    #define CV_THRESH_TRUNC       2  /* value = value > threshold ?

    threshold : value   */
    #define CV_THRESH_TOZERO      3  /* value = value > threshold ? value : 0           */
    #define CV_THRESH_TOZERO_INV  4  /* value = value > threshold ? 0 : value           */
    #define CV_THRESH_MASK        7

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


    阀值选取:

    一般来说会取100,127等固定值。这类取值比較任意。的到的图像也还能够,可是这边比較推荐的一个方式是自适应阀值


        IplImage* Igray=0,*It=0,*Iat; 

        int threshold_type = CV_THRESH_BINARY;
        int adaptive_method = CV_ADAPTIVE_THRESH_GAUSSIAN_C;
        int blocksize = 31;
        double offset =15;
        int threshold=100;
        if(0==(Igray=cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE))){
            return -1;
        }
        It = cvCreateImage(cvSize(Igray->width,Igray->height),
                           IPL_DEPTH_8U,
                           1);
        Iat = cvCreateImage(cvSize(Igray->width,Igray->height),
                            IPL_DEPTH_8U,
                            1);

        //Threshold
        cvThreshold(Igray,It,threshold,255,threshold_type);//阀值100
        cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,//自适应阀值,blocksize为奇数

                            threshold_type,blocksize,offset);



  • 相关阅读:
    安装Linux Mint 17后要做的20件事
    通过HttpURLConnection 上传和下载文件(二)
    Apache Solr入门教程(初学者之旅)
    厉害了,利用深度学习开发人脸识别老板探测器(附源码)
    Solr教程--官方自带数据的三个练习及讨论翻译版本
    solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法
    Qt项目里的源代码默认都是Unicode,原因大概是因为qmake.conf里的定义
    How to Capture the Integer-Divide-By-Zero Error in C++(提前定义信号)
    Model-View-Controller Explained in C++
    How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5132966.html
Copyright © 2020-2023  润新知