1.改变图像的亮度和对比度:
算法介绍:对每一点像素值的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: 腐蚀操作的内核。 如果不指定,默认为一个简单的 矩阵。
膨胀:
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 );
时间: 2024-10-12 23:54:26