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 );
原文地址:https://www.cnblogs.com/mcy0808/p/5768541.html