opencv-图像增强

来源:互联网 发布:ubuntu共享文件夹 编辑:程序博客网 时间:2024/05/22 04:42

图像线性变换

Mat src,dst;src.convertTo(dst,0,alpha,beta);

函数原型:
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 )
rtype:变换类型,不知道有几个待选参数
变换公式:dst=src*alpha+beta
alpha改变对比度,beta改变亮度

图像滤波

平滑滤波处理,也叫模糊处理
opencv提供5个常用图像平滑处理操作方法

  • 方框滤波——BoxBlur函数
  • 均值滤波(邻域平均滤波)——Blur函数
  • 高斯滤波——GaussianBlur函数
  • 中值滤波——medianBlur函数
  • 双边滤波——bilateralFilter函数

方框滤波

CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,                             Size ksize, Point anchor = Point(-1,-1),                             bool normalize = true,                             int borderType = BORDER_DEFAULT );第一个参数:原图像第二个参数:输出图像第三个参数:输出图像深度,-1代表原图深度第四个参数:内核大小,用Size(w,h)表示,w为像素宽度,h为像高度第五个参数:Point类型的anchor,表示锚点(即被平滑的那个点)。默认值是核的中心为锚点第六个参数:默认值true,表示内核是否被其区域归一化了第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT

方框滤波器所用内核为:
K=a111111111
a={1ksize.widthksize.heightnormalize=true1normalize=false

均值滤波

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,                        Size ksize, Point anchor = Point(-1,-1),                        int borderType = BORDER_DEFAULT );第一个参数:输入图像第二个参数:输出图像第三个参数:内核大小第四个参数:锚点,平滑点第五个参数:边界类型,同上

均值滤波内核:
K=1ksize.widthksize.height111111111
缺陷:不能很好的保护图像细节,去除噪声的同时也破坏了图像的细节部分。

高斯滤波

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,                                double sigmaX, double sigmaY = 0,                                int borderType = BORDER_DEFAULT );第一个参数:输入图像第二个参数:输出图像第三个参数:内核大小第四个参数:高斯核函数X方向的标准偏差第五个参数:高斯核函数Y方向的标准偏差第六个参数:边界类型,通常取默认值

从数学角度看,高斯模糊过程就是图像与正态分布做卷积。

中值滤波


中值滤波是非线性滤波器,其 基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的边缘细节。

CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );相对简单,不解释

双边滤波

它是结合图像的空间林精度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单,非迭代,局部的特点。

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,                                   double sigmaColor, double sigmaSpace,                                   int borderType = BORDER_DEFAULT );第一个参数:输入图像第二个参数:输出图像第三个参数:表示在过滤过程中每个像素领域的直径。如果这个参数设为非正数,那么他会用第五个参数sigmaSpace来计算出它第四个参数:颜色空间滤波器的sigma值。这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大半径颜色相等区域第五个参数:坐标空间中滤波器的sigma值,坐标空间的标注方差,它的数值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。第六个参数:常用默认值

锐化空间滤波

锐化的作用是加强图像的边缘和轮廓,通常也成为高通滤波器
模板一般为中心为正,外围为负值。
使用filter2D函数来对图像滤波,使用不同的kernel,会得到不同的效果。

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,                            InputArray kernel, Point anchor = Point(-1,-1),                            double delta = 0, int borderType = BORDER_DEFAULT );第一个参数:输入图像第二个参数:输出图像第三个参数:输出图像深度第四个参数:使用的内核,类型为Mat第五个参数:锚点,默认是核的中心点第六个参数:边界类型,默认值。使用注意事项:(1)卷积核不能大于11*112)卷积核的类型需是有符号的,卷积核的类型通常设为CV_32F,输出图像深度也设为CV_32F,之后再把图像转回CV_8UC。卷积核构造Mat kernel(3,3,CV_32F,Scalar(-1));kernel.at<float>(1,1)=8;这样就构造了一个拉普拉斯算子

opencv中还有很多滤波函数,没有一一去尝试,以后有时间再一个个看一下。
内容参考opencv源码和官方文档
http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html
《opencv3编程入门》—浅墨

0 0
原创粉丝点击