天天看点

opencv-图像增强

图像线性变换

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

方框滤波器所用内核为:

K=a⎡⎣⎢111111111⎤⎦⎥

a={1ksize.width∗ksize.heightnormalize=true1normalize=false

均值滤波

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

均值滤波内核:

K=1ksize.width∗ksize.height⎡⎣⎢111111111⎤⎦⎥

缺陷:不能很好的保护图像细节,去除噪声的同时也破坏了图像的细节部分。

高斯滤波

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

opencv中还有很多滤波函数,没有一一去尝试,以后有时间再一个个看一下。

内容参考opencv源码和官方文档

http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html

《opencv3编程入门》—浅墨