【20160924】GOCVHelper 图像增强部分(1)

简介: 图像增强是图像处理的第一步。这里集成了一些实际使用过程中有用的函数。   //读取灰度或彩色图片到灰度     Mat imread2gray(string path){         Mat src = imread(path);         Mat srcClone = src.

   图像增强是图像处理的第一步。这里集成了一些实际使用过程中有用的函数。

  //读取灰度或彩色图片到灰度
    Mat imread2gray(string path){
        Mat src = imread(path);
        Mat srcClone = src.clone();
        if (CV_8UC3 == srcClone.type() )
            cvtColor(srcClone,srcClone,CV_BGR2GRAY);
        return srcClone;
    }
   算法核心在于判断读入图片的通道数,如果是灰度图片则保持;如果是彩色图片则转换为灰度图片。通过这样一个函数,就能够直接获得灰度图片。
 
    //带有上下限的threshold
    Mat threshold2(Mat src,int minvalue,int maxvalue){
        Mat thresh1;
        Mat thresh2;
        Mat dst;
        threshold(src,thresh1,minvalue,255, THRESH_BINARY);
        threshold(src,thresh2,maxvalue,255,THRESH_BINARY_INV);
        dst = thresh1 & thresh2;
        return dst;
    }
    Opencv提供的threshold算法很强大,但是只能够取单门限。这里修改成可以取双门限的形式。
 
     //自适应门限的canny算法 
    //canny2
    Mat canny2(Mat src){
        Mat imagetmp = src.clone();
        double low_thresh = 0.0;  
        double high_thresh = 0.0;  
        AdaptiveFindThreshold(imagetmp,&low_thresh,&high_thresh);
        Canny(imagetmp,imagetmp,low_thresh,high_thresh);   
        return imagetmp;}
    void AdaptiveFindThresholdMat src,double *low,double *high,int aperture_size){
        const int cn = src.channels();
        Mat dx(src.rows,src.cols,CV_16SC(cn));
        Mat dy(src.rows,src.cols,CV_16SC(cn));
        Sobel(src,dx,CV_16S,1,0,aperture_size,1,0,BORDER_REPLICATE);
        Sobel(src,dy,CV_16S,0,1,aperture_size,1,0,BORDER_REPLICATE);
        CvMat _dx = dx;
        CvMat _dy = dy;
        _AdaptiveFindThreshold(&_dx, &_dylowhigh); }  
    void _AdaptiveFindThreshold(CvMat *dxCvMat *dydouble *lowdouble *high){                                                                                
        CvSize size;                                                             
        IplImage *imge=0;                                                        
        int i,j;                                                                 
        CvHistogram *hist;                                                       
        int hist_size = 255;                                                     
        float range_0[]={0,256};                                                 
        floatranges[] = { range_0 };                                           
        double PercentOfPixelsNotEdges = 0.7;                                    
        size = cvGetSize(dx);                                                    
        imge = cvCreateImage(sizeIPL_DEPTH_32F, 1);                            
        // 计算边缘的强度, 并存于图像中                                          
        float maxv = 0;                                                          
        for(i = 0; i < size.heighti++ ){                                                                        
            const short_dx = (short*)(dx->data.ptr + dx->step*i);          
            const short_dy = (short*)(dy->data.ptr + dy->step*i);          
            float_image = (float *)(imge->imageData + imge->widthStep*i);  
            for(j = 0; j < size.widthj++){                                                                
                _image[j] = (float)(abs(_dx[j]) + abs(_dy[j]));          
                maxv = maxv < _image[j] ? _image[j]: maxv;}}                                                                        
        if(maxv == 0){                                                           
            *high = 0;                                                       
            *low = 0;                                                        
            cvReleaseImage( &imge );                                         
            return;}                                                                        
        // 计算直方图                                                            
        range_0[1] = maxv;                                                       
        hist_size = (int)(hist_size > maxv ? maxv:hist_size);                    
        hist = cvCreateHist(1, &hist_sizeCV_HIST_ARRAYranges, 1);            
        cvCalcHist( &imgehist, 0, NULL );                                      
        int total = (int)(size.height * size.width * PercentOfPixelsNotEdges);   
        float sum=0;                                                             
        int icount = hist->mat.dim[0].size;                                     
        float *h = (float*)cvPtr1Dhist->bins, 0 );                             
        for(i = 0; i < icounti++){                                                                        
            sum += h[i];                                                     
            ifsum > total )                                                
                break; }                                                                        
        // 计算高低门限                                                          
        *high = (i+1) * maxv / hist_size ;                                       
        *low = *high * 0.4;                                                      
        cvReleaseImage( &imge );                                                 
        cvReleaseHist(&hist); }     

// end of canny2
         我们在使用Opencv的canny算法的时候,一般是按照经验填写上下门限值。为了解决这个问题,通过自适应算法(算法来源我想不起来了),自动计算出上下门限。能够取得不错效果。

 
 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
6月前
halcon的灰度变换(图像增强)
halcon的灰度变换(图像增强)
386 1
|
6月前
|
算法 计算机视觉
[Halcon&图像] 图像滤波算法原理
[Halcon&图像] 图像滤波算法原理
229 1
|
6月前
|
算法
[Halcon&图像] 边缘提取算法汇总
[Halcon&图像] 边缘提取算法汇总
378 0
|
6月前
|
算法
[Halcon&图像] 图像阈值分割算法汇总
[Halcon&图像] 图像阈值分割算法汇总
187 0
|
机器学习/深度学习 传感器 算法
【图像融合】基于小波变换DWT的高分辨率全色图图像融合(含评价指标)附Matlab代码
【图像融合】基于小波变换DWT的高分辨率全色图图像融合(含评价指标)附Matlab代码
|
数据可视化 算法 计算机视觉
【计算机视觉】图像增强----图像的傅立叶变换
【计算机视觉】图像增强----图像的傅立叶变换
644 0
【计算机视觉】图像增强----图像的傅立叶变换
|
机器学习/深度学习 人工智能 算法
【图像配准】基于SURF特征实现印刷体汉字配准附matlab代码
【图像配准】基于SURF特征实现印刷体汉字配准附matlab代码
|
计算机视觉
OpenCV小项目:图像融合(泊松融合—Possion Blending)
OpenCV小项目:图像融合(泊松融合—Possion Blending)
829 0
OpenCV小项目:图像融合(泊松融合—Possion Blending)
Halcon图像增强算子(直方图均衡化等)
Halcon图像增强算子(直方图均衡化等)
1509 0
|
计算机视觉 算法
基于opencv模板匹配的目标识别方法
因为pcl的点云模板匹配遇到了各种困难,暂时先用opencv的模板匹配函数做一个简单的焊缝识别,看看效果。此方法的缺陷就在于物体和相机位置必须固定,只允许微小位移,否则数据将失效。
4478 0