opencv均值滤波_19、OpenCV图像平滑处理

这部分原来发过类似的,现在重新整理一下,以方便和现有的成为一个整体。

平滑有时也称为模糊,是一种简单且经常使用的图像处理操作。平滑有很多原因,但通常是为了减少噪点。但是这样通常会降低图像的分辨率。

OpenCV提供了五种不同的平滑操作,每种平滑操作都可以完成不同的平滑操作。所有这些函数中的src和dst参数都是通常的源图像和目标图像。每个平滑操作都具有特定于相关操作的参数。其中,唯一的通用参数是最后一个borderType。该参数告诉平滑操作如何处理图像边缘的像素。

1、均值平滑和盒子滤波

void cv::blur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize,

cv::Point anchor =cv::Point(-1,-1),

int borderType = cv::BORDER_DEFAULT

);

均值平滑由blur()函数提供,有时也称为均值滤波。输出的每个像素都是围绕输入中对应像素的窗口(即内核)中所有像素的平均值。该窗口的大小由参数ksize指定。参数anchor可用于指定内核如何与正在计算的像素对齐。默认情况下,anchor的值是cv :: Point(-1,-1),这表示内核应该相对于滤波器居中。在多通道图像的情况下,每个通道将分开计算。

均值模糊是盒子滤波的特定形式。盒子滤波如果采用归一化操作,其实就是均值滤波,而非归一化的盒子滤波用于计算每个像素邻域内的积分特性。

void cv::boxFilter(

cv::InputArray src,

cv::OutputArray dst,

int ddepth,

cv::Size ksize,

cv::Point anchor =cv::Point(-1,-1),

bool normalize = true,

int borderType = cv::BORDER_DEFAULT

);

函数boxFilter()用于实现盒子滤波。

2、中值滤波

中值滤波用围绕中心像素的矩形的中值替换原来像值素。中值滤波对于具有较大孤立异常值的图像(例如数码照片中的散粒噪声)很有效。这种噪声一般称为椒盐噪声。中值滤波可以通过选择中点来忽略这些异常值。

void cv::medianBlur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize

);

medianBlur的参数与其他平滑滤波参数基本相同:源图像src,目标图像dst和内核大小ksize。对于medianBlur(),锚点总是被认为是内核的中心。

3、 高斯滤波

高斯滤波可能是最有用的。高斯滤波将图像中的每个点与高斯内核进行卷积,然后求和以产生输出:

void cv::GaussianBlur(

cv::InputArray src,

cv::OutputArray dst,

cv::Size ksize,

double sigmaX,

double sigmaY = 0.0,

int borderType = cv::BORDER_DEFAULT

);

对于高斯模糊,参数ksize给出了滤波窗口的宽度和高度。sigmaX参数表示内核在x维上的σ值(半高宽)。sigmaY参数类似地表示y维中的σ值。如果只指定x值,并将y值设置为0(其默认值),则y和x值将被视为相等。如果将它们都设置为0,那么高斯参数将通过以下公式从窗口大小自动确定:

6570e2a09cc2600ba865eb478e3f29b2.png

高斯平滑的OpenCV实现也为几个常见的内核提供了更高的性能优化。具有sigmaX = 0.0的3×3,5×5和7×7核心比其他内核具有更好的性能。高斯模糊支持8位或32位浮点格式的单通道或三通道图像。

4、 双边滤波

void cv::bilateralFilter(

cv::InputArray src,

cv::OutputArray dst,

int d,

double sigmaColor,

double sigmaSpace,

int borderType = cv::BORDER_DEFAULT

);

OpenCV支持的第五种平滑方式为双边滤波。双边滤波能够在保留边缘的同时实现平滑。高斯平滑是考虑图像中的像素应该在空间上缓慢变化并且与其邻域相关,而随机噪声可能变化很大。因此,高斯平滑降低了噪声,同时保留了信号。但是,这种方法让边界也模糊了。双边滤波处理时间大大增加,因此提供了一种平滑图像而不平滑其边缘的方法。

与高斯平滑一样,双边滤波构造每个像素及其相邻分量的加权平均值。加权有两个组成部分,其中第一部分与高斯平滑使用的权重相同。第二个分量也是一个高斯加权,但不是基于与中心像素的空间距离,而是基于中心像素的强度差异。可以将双边滤波视为高斯平滑,将相似像素的权重比低的保持高对比度边缘。这个滤波器的效果通常是将图像转换成看起来像是同一场景的水彩画。这也可以用作分割图像的辅助手段。

双边滤波需要三个参数。第一个是在滤波期间考虑的像素邻域的直径d。第二种是在称为sigma Color的色域中使用的高斯内核的宽度,其类似于高斯滤波器中的σ参数。第三个是空间域中称为sigmaSpace的高斯内核的宽度。第二个参数越大,将包括在平滑中的强度范围就越宽。

筛选器大小d对算法的速度有很强的影响。视频处理的典型值小于或等于5,但非实时应用的典型值可能高达9。可以将d设置为-1,在这种情况下,它将自动从σ空间计算。

例1 opencv各种平滑滤波示意

#include#includeusingnamespace std;usingnamespace cv;int main(intargc, char** argv){    Mat srcImg = imread("E:/wall.ppm", 1);    namedWindow("原始图像", 0);    imshow("原始图像", srcImg);    Mat srcImg1 = imread("E:/wall_gauss.bmp", 1);    namedWindow("高斯噪声", 0);    imshow("高斯噪声", srcImg1);    Mat srcImg2 = imread("E:/wall_salt.bmp", 1);    namedWindow("椒盐噪声", 0);    imshow("椒盐噪声", srcImg2);    Mat boxFilterImg;    boxFilter(srcImg1,boxFilterImg, -1, Size(5, 5), Point(-1, -1), true);    namedWindow("盒子滤波", 0);    imshow("盒子滤波", boxFilterImg);    Mat meanFilterImg;    blur(srcImg1,meanFilterImg, Size(3, 3));    namedWindow("均值滤波", 0);    imshow("均值滤波", meanFilterImg);    Mat gaussFilterImg;    GaussianBlur(srcImg1,gaussFilterImg, Size(3, 3), 0);    namedWindow("高斯滤波", 0);    imshow("高斯滤波", gaussFilterImg);    Mat MedianFilterImage;    medianBlur(srcImg2,MedianFilterImage, 3);    namedWindow("中值滤波", 0);    imshow("中值滤波", MedianFilterImage);    Mat bilaterFilterImg;    bilateralFilter(srcImg1,bilaterFilterImg, 9, 40, 10);    namedWindow("双边滤波", 0);    imshow("双边滤波", bilaterFilterImg);    waitKey(0);    return 0;}

99e93b5ba0d60ca31442acd7f8d39c85.png

图1 各种平滑滤波操作结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值