• opencv算法学习


    1.改变图像的亮度和对比度:

      g(i,j) = alpha cdot f(i,j) + eta

      算法介绍:对每一点像素值的r,g,b,值进行乘法和加法的运算。

      代码使用:

    for( int y = 0; y < image.rows; y++ )
        {
            for( int x = 0; x < image.cols; x++ )
            {
                for( int c = 0; c < 3; c++ )
                {
                    new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
                }
            }
        }

    2.opencv中的傅里叶变换:

      主要用途:识别图片中物体的方向。

      例如:矫正图片的中文字的排列方向。

      计算公式:

      

      算法介绍:f为空间值,F为频域值

      代码使用:

    dft(complexI, complexI);

      由于dft变换后是有实数和复数部分,所有要进一步进行处理。

    3.图片的平滑处理:即模糊处理

      算法介绍:通过滤波器滤掉图像中的噪点,opencv主要提供高斯,中值,双边滤波

      代码使用:

      /// 使用高斯滤波
        if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }
       for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
            { GaussianBlur( src, dst, Size( i, i ), 0, 0 );
              if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } 
         /// 使用中值滤波
         if( display_caption( "Median Blur" ) != 0 ) { return 0; }
         for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
             { medianBlur ( src, dst, i );
               if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
         /// 使用双边滤波
         if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }
         for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
             { bilateralFilter ( src, dst, i, i*2, i/2 );
               if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

    4.图像的腐蚀与膨胀

      腐蚀:处理部分被消减了。

      膨胀:处理部分被扩大了。

      算法介绍:与操作的内核或者说矩(图像)进行卷积操作。

      核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央。

      卷积高度概括地说,卷积是在每一个图像块与某个算子(核)之间进行的运算。

      腐蚀:

    erode( src, erosion_dst, element );

    element: 腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。

      膨胀:
    dilate( src, dilation_dst, element );

    可以使用函数 getStructuringElement();指定内核的形状

    5.图像的放大与缩小

      算法介绍:对图像与高斯内核卷积。缩小即是对图像的4个点像素,处理为一个点的像素。一个点的像素分解为四个点的像素。

    pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 );//放大
    pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 );//缩小

    但是opencv中最常用的图像缩放函数是relize();

    6.图像的阈值操作:

      算法介绍:通过对图像进行灰度值变换后,进行的色度分离操作,可应用与颜色识别。

     threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );

    7.图像的边缘检测:sobel算法

      算法介绍:因为在边缘处,像素值明显改变了,我们可以通过求导的办法,将像素值的改变体现为斜率的变化。

    /// 求 X方向梯度
      //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_x, abs_grad_x );
    
      /// 求Y方向梯度
      //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_y, abs_grad_y );
    
      /// 合并梯度(近似)
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

    8。laplace算法优化了sobel算法,加入了二阶求导

    Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

    9.canny最优的边缘检测算法

    Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
  • 相关阅读:
    java基础(一)-----java的三大特性之封装
    并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析
    深入并发包 ConcurrentHashMap 源码解析
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
  • 原文地址:https://www.cnblogs.com/mcy0808/p/5768541.html
Copyright © 2020-2023  润新知