0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV图像降噪算法的中值滤波与高斯滤波详解

OpenCV学堂 来源:OpenCV学堂 2024-04-03 14:58 次阅读

1. 图像噪声

图像降噪(Image Denoising)是指从图像中去除噪声的过程,目的是提高图像质量,增强图像的视觉效果。

图像噪声是指图像中不希望出现的随机亮度或颜色变化,通常会降低图像的清晰度和可辨识度,以及会降低图像的质量并使图像分析和理解更加困难。

图像噪声主要有以下几个原因来产生的:

光线不足:光线不足会导致光子噪声增加,从而降低图像的信噪比。

电子元器件的热噪声电子元器件在工作时会产生热噪声,这种噪声会影响图像的质量。

电路噪声:电路中的电磁干扰也会导致图像噪声的产生。

图像传输过程中的错误:图像在传输过程中可能会受到各种干扰,从而导致图像噪声的产生。

根据噪声的统计特性来分类,可以将图像噪声分为以下几类:

椒盐噪声:图像中随机出现黑白像素的噪声。

高斯噪声:最常见的噪声类型,其概率密度函数服从高斯分布。

泊松噪声:光子噪声的一种类型,其概率密度函数服从泊松分布。

斑点噪声:由图像传感器坏点或污点引起的噪声。

下面的例子,分别展示了在图像中添加椒盐噪声、高斯噪声、泊松噪声和斑点噪声。

#include
#include
#include
#include

usingnamespacestd;
usingnamespacecv;

voidaddSaltNoise(Mat&src,intnum,Mat&dst)
{
dst=src.clone();

//随机数产生器
std::random_devicerd;//种子
std::mt19937gen(rd());//随机数引擎

autorows=src.rows;//行数
autocols=src.cols*src.channels();

for(inti=0;i< num; i++)
    {
        auto row = static_cast(gen()%rows);
autocol=static_cast(gen()%cols);

autop=dst.ptr(row);
p[col++]=255;
p[col++]=255;
p[col]=255;
}
}

voidaddGaussianNoise(Mat&src,intmu,intsigma,Mat&dst)
{
dst=src.clone();

//产生高斯分布的随机数发生器
std::random_devicerd;
std::mt19937gen(rd());

std::normal_distribution<>d(mu,sigma);

autorows=src.rows;//行数
autocols=src.cols*src.channels();//列数

for(inti=0;i< rows; i++)
    {
        auto p = dst.ptr(i);//取得行首指针
for(intj=0;j< cols; j++)
        {
            auto tmp = p[j] + d(gen);
            tmp = tmp >255?255:tmp;
tmp=tmp< 0 ? 0 : tmp;
            p[j] = tmp;
        }
    }
}

typedef cv::Point3_Pixel;

voidaddPoissonNoise(constMat&src,doublelambda,Mat&dst){
dst=src.clone();

//产生泊松分布的随机数生成器
std::random_devicerd;
std::mt19937gen(rd());
std::poisson_distributiondistribution(lambda);

dst.forEach([&](Pixel&p,constint*position)->void{
introw=position[0];
intcol=position[1];

intcount=distribution(gen);
dst.at(row,col)=dst.at(row,col)+Vec3b(count,count,count);
});
}

voidaddSpeckleNoise(Mat&image,doublescale,Mat&dst){
dst=image.clone();
RNGrng;

dst.forEach([&](Pixel&p,constint*position)->void{
introw=position[0];
intcol=position[1];

doublerandom_value=rng.uniform(0.0,1.0);
doublenoise_intensity=random_value*scale;
dst.at(row,col)=dst.at(row,col)+Vec3b(noise_intensity*255,noise_intensity*255,noise_intensity*255);
});
}

intmain(){
Matsrc=imread(".../girl.jpg");

imshow("src",src);

Matdst1;
addSaltNoise(src,100000,dst1);
imshow("addSaltNoise",dst1);

Matdst2;
addGaussianNoise(src,0,50,dst2);
imshow("addGaussianNoise",dst2);

Matdst3;
addPoissonNoise(src,60,dst3);
imshow("addPoissonNoise",dst3);

Matdst4;
addSpeckleNoise(src,0.5,dst4);
imshow("addSpeckleNoise",dst4);

waitKey(0);
return0;
}

2. 图像降噪方法

传统的图像处理是基于滤波器的方式进行降噪,比如使用空域滤波、频域滤波、非局部均值滤波等等,还有使用形态学降噪,当然也可以深度学习的方式进行降噪。

本文介绍两种空域滤波的方式进行降噪。

2.1 中值滤波

中值滤波是一种非线性滤波器,它通过对图像中的像素值进行排序并取中间值来进行滤波处理。

70432518-f105-11ee-a297-92fbcf53809c.jpg

中值滤波.png

中值滤波的特性:

对于图像中的每个像素,选取其周围一定区域内的所有像素值,并对其进行排序。

将排序后的像素值的中位数赋予该像素。

中值滤波的优点:

能够有效去除椒盐噪声和脉冲噪声,对图像中的孤立噪声点具有较强的抑制能力。

能够较好地保留图像的边缘和细节信息,不会造成图像模糊。

中值滤波的缺点:

对高斯噪声的去除效果不佳。

计算量相对较大,特别是对于大尺寸图像而言。

2.2 高斯滤波

高斯滤波是一种线性平滑滤波器,它利用高斯函数对图像进行加权平均,可以有效地去除高斯噪声,同时平滑图像。

高斯滤波的优点:

高斯滤波具有良好的平滑效果,能够有效地抑制图像中的噪声。

高斯滤波是一种线性滤波器,具有可分离性,可以提高计算效率。

高斯滤波在频域上具有低通滤波器的特性,能够去除图像中的高频噪声。

高斯滤波的缺点:

高斯滤波会造成图像细节丢失,降低图像锐度。

高斯滤波对椒盐噪声等非平滑噪声的去除效果不佳。

高斯滤波以使用两种方法实现:一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。最常见的就是滑窗卷积实现。

先来回顾一下一维高斯函数:

705908c4-f105-11ee-a297-92fbcf53809c.jpg

一维高斯函数.png

其中,是 x 的均值,是 x 的方差。x 是卷积核内任意一点的坐标,是卷积核中心的坐标。当 = 0 时,

由于图像是二维的,二维的高斯函数则是对 x、y 两个方向的一维高斯函数的乘积:

当时,就是我们比较熟悉的二维高斯函数公式:

7073b8d6-f105-11ee-a297-92fbcf53809c.jpg

二维高斯函数.png

常用的高斯模板有如下几种形式,它们是基于高斯函数计算出来的。

7084bce4-f105-11ee-a297-92fbcf53809c.jpg

高斯模版.png

高斯滤波具有以下性质:

线性: 高斯滤波器是线性的,这意味着它可以与其他滤波器组合使用。例如,可以先使用高斯滤波器去除噪声,然后再使用边缘检测滤波器检测边缘。

可分离性: 高斯滤波器可以分离为两个一维滤波器,即水平方向和垂直方向的滤波器。这使得高斯滤波器的计算效率更高。

傅里叶变换: 高斯滤波器的傅里叶变换是一个低通滤波器,这意味着它可以抑制图像中的高频成分,而保留低频成分。

旋转不变性: 高斯滤波器在各个方向上具有相同的平滑效果,这意味着它不会改变图像的旋转方向。

尺度不变性: 高斯滤波器的尺度可以通过调整高斯函数的标准差来控制。标准差越大,滤波器的平滑效果越强。

下面的例子,分别使用中值滤波和高斯滤波消除椒盐噪声和高斯噪声。

intmain(){
Matsrc=imread(".../girl.jpg");

imshow("src",src);

Matresult;

Matdst1;
addSaltNoise(src,100000,dst1);
imshow("addSaltNoise",dst1);

inta=7;
medianBlur(dst1,result,a);
imshow("removeSaltNoise",result);

Matdst2;
addGaussianNoise(src,0,50,dst2);
imshow("addGaussianNoise",dst2);

GaussianBlur(dst2,result,Size(15,15),0,0);
imshow("removeGaussianNoise",result);

waitKey(0);
return0;
}

3. 总结

图像降噪可以提高图像质量、提高图像分析和处理的准确性、提高图像压缩效率以及扩展图像应用范围。

本文介绍了两种简单的降噪算法。中值滤波适用于去除椒盐噪声和脉冲噪声,常用于图像修复和增强。高斯滤波适用于去除高斯噪声、平滑图像,常用于图像预处理和模糊处理。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 滤波器
    +关注

    关注

    158

    文章

    7334

    浏览量

    174830
  • 高斯滤波
    +关注

    关注

    0

    文章

    12

    浏览量

    8040
  • 电磁干扰
    +关注

    关注

    36

    文章

    2049

    浏览量

    104749
  • 图像降噪
    +关注

    关注

    0

    文章

    7

    浏览量

    6635
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40793

原文标题:OpenCV图像降噪算法之中值滤波与高斯滤波

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA的中值滤波算法实现

    一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑白斑点并没有消除,中值滤波本来是可以很好的滤掉椒盐噪
    发表于 09-01 07:04

    对ADC数据进行滤波可以用中值滤波算法吗?

    对ADC数据进行滤波可以用中值滤波算法
    发表于 10-09 06:29

    基于开关3-D中值滤波的视频序列去噪算法

    为提高含噪视频序列的质量和效果,提出一种基于开关噪声检测与三维中值滤波相结合的开关3-D中值滤波算法。该
    发表于 04-23 09:32 17次下载

    基于医学图像的有效中值滤波算法研究

    本文对于由Visible Human 所提供的人体CT 图像序列所形成的体数据场,提出了一种有效的快速中值滤波方法。中值滤波是一种非常有用的
    发表于 08-13 14:39 10次下载

    一种改进的各向异性高斯滤波算法

    一种改进的各向异性高斯滤波算法摘 要:为了抑制更好的抑制噪声保留边缘信息, 提出了一种各向异性高斯滤波的改进方法, 该方法先用
    发表于 04-23 14:59 19次下载

    ×字形滤波窗口在Matlab自适应中值滤波算法中的应用

    本文对Matlab工具箱中的中值滤波算法进行改进,提出一种基于×字形滤波窗口的自适应中值滤波
    发表于 07-08 08:55 2548次阅读
    ×字形<b class='flag-5'>滤波</b>窗口在Matlab自适应<b class='flag-5'>中值</b><b class='flag-5'>滤波</b><b class='flag-5'>算法</b>中的应用

    测井图像的多级中值滤波算法及其FPGA实现

    微电阻率成像测井仪传输上来的地层信息数据需要滤波处理后才能真实地反映出地层中油层的信息,而中值滤波图像预处理中常用的技术。本文介绍了标准中值
    发表于 12-31 09:20 8次下载

    基于FPGA的实时图像中值滤波算法及实现_蒋涛

    基于FPGA的实时图像中值滤波算法及实现_蒋涛
    发表于 03-19 11:38 13次下载

    基于FPGA灰度图像高斯滤波算法的实现

    FPGA仿真篇-使用脚本命令来加速仿真二 基于FPGA的HDMI高清显示借口驱动 基于FPGA灰度图像高斯滤波算法的实现 FPGA为什么比CPU和GPU快 基于Xilinx FPGA的
    发表于 02-20 20:49 7317次阅读
    基于FPGA灰度<b class='flag-5'>图像</b><b class='flag-5'>高斯</b><b class='flag-5'>滤波</b><b class='flag-5'>算法</b>的实现

    图像处理基础自适应中值滤波器(基于OpenCV实现)

    本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常
    的头像 发表于 03-05 17:02 1.1w次阅读
    <b class='flag-5'>图像</b>处理基础自适应<b class='flag-5'>中值</b><b class='flag-5'>滤波</b>器(基于<b class='flag-5'>OpenCV</b>实现)

    图像加窗中值滤波算法的研究分析

    提出了一种实用的图像滤波算法,即图像加窗中值滤波算法
    发表于 11-30 11:11 4次下载
    <b class='flag-5'>图像</b>加窗<b class='flag-5'>中值</b><b class='flag-5'>滤波</b><b class='flag-5'>算法</b>的研究分析

    四种常见的图像滤波算法介绍

    滤波算法,并附上源码,包括自适应中值滤波高斯滤波、双边滤波
    的头像 发表于 02-15 09:50 9403次阅读

    如何使用FPGA实现图像中值滤波算法

    图像滤波图像预处理过程中苇要的组成部分,而基于FPGA的滤波算法相对软件算法而言具有高度的并行
    发表于 04-01 11:21 42次下载
    如何使用FPGA实现<b class='flag-5'>图像</b>的<b class='flag-5'>中值</b><b class='flag-5'>滤波</b><b class='flag-5'>算法</b>

    labview图像中值滤波实例分享

    labview图像中值滤波实例分享
    发表于 12-15 14:55 28次下载

    详解从均值滤波到非局部均值滤波算法的原理及实现方式

    将再啰嗦一次,详解从均值滤波到非局部均值滤波算法的原理及实现方式。 细数主要的2D降噪算法,如下
    的头像 发表于 12-19 16:30 365次阅读