《图像滤波算法综述》

一、引言

在数字图像处理的世界里,滤波是一项关键技术。通过对图像应用滤波算法,可以有效去除噪声、增强图像的细节并显著提升图像质量。本篇内容将为您深入介绍几种常见的图像滤波算法及其原理和应用场景。

二、图像滤波算法的分类

图像滤波算法可以分为线性滤波和非线性滤波两大类。

(一)线性滤波
线性滤波是指对图像中的每个像素点进行加权求和,得到滤波后的像素值。常见的线性滤波算法有均值滤波、高斯滤波等。

(二)非线性滤波
非线性滤波是指对图像中的每个像素点进行非线性运算,得到滤波后的像素值。常见的非线性滤波算法有中值滤波、双边滤波等。

三、线性滤波算法

(一)均值滤波

  1. 原理
    均值滤波是一种典型的线性滤波算法,它的基本思想是用像素邻域内的像素值的平均值来代替该像素点的像素值。具体来说,对于一幅大小为 M×N 的图像,均值滤波的过程如下:
    (1)对于图像中的每个像素点(x,y),确定其邻域大小为 m×n(通常为 3×3 或 5×5)。
    (2)计算邻域内所有像素点的像素值之和。
    (3)将像素值之和除以邻域内像素点的个数,得到均值。
    (4)用均值代替像素点(x,y)的像素值。

  2. 应用场景
    均值滤波算法简单直观,计算速度快,适用于去除图像中的随机噪声。但是,均值滤波会使图像变得模糊,特别是在处理边缘和细节丰富的图像时,效果不佳。因此,均值滤波通常用于对图像质量要求不高的场合,如去除图像中的椒盐噪声等。

fac82910f2a94d48a4f4144bc30cd683.pngdc901c65c995491386310da58d6dba52.png

(二)高斯滤波

  1. 原理
    高斯滤波是一种基于高斯函数的线性滤波算法。高斯函数是一种钟形曲线,它的形状由标准差决定。在高斯滤波中,每个像素点的像素值是由其邻域内的像素值加权求和得到的,权重由高斯函数确定。具体来说,对于一幅大小为 M×N 的图像,高斯滤波的过程如下:
    (1)确定高斯函数的标准差和邻域大小。
    (2)对于图像中的每个像素点(x,y),计算其邻域内每个像素点到(x,y)的距离。
    (3)根据距离和标准差计算每个像素点的权重。
    (4)将邻域内所有像素点的像素值乘以相应的权重,然后求和。
    (5)将求和结果除以权重之和,得到滤波后的像素值。

  2. 应用场景
    高斯滤波能够有效地去除图像中的高斯噪声,同时对图像的边缘和细节影响较小。因此,高斯滤波广泛应用于图像处理的各个领域,如图像去噪、图像模糊、图像增强等。特别是在对图像进行边缘检测、特征提取等操作之前,通常会先对图像进行高斯滤波,以去除噪声的影响。

63cfac46f9be4e738b619b74f94369e2.png657404501ab64664a9e41f6344fdc69e.png

四、非线性滤波算法

(一)中值滤波

  1. 原理
    中值滤波是一种典型的非线性滤波算法,它的基本思想是用像素邻域内的中值来代替该像素点的像素值。具体来说,对于一幅大小为 M×N 的图像,中值滤波的过程如下:
    (1)对于图像中的每个像素点(x,y),确定其邻域大小为 m×n(通常为 3×3 或 5×5)。
    (2)将邻域内所有像素点的像素值从小到大进行排序。
    (3)取排序后的中间值作为像素点(x,y)的像素值。

  2. 应用场景
    中值滤波对去除图像中的椒盐噪声非常有效,同时能够较好地保留图像的边缘和细节。因此,中值滤波广泛应用于图像去噪、图像增强等领域。特别是在处理受到椒盐噪声污染的图像时,中值滤波通常是首选的滤波算法。

(二)双边滤波

  1. 原理
    双边滤波是一种结合了空间域和灰度域信息的非线性滤波算法。它的基本思想是在滤波过程中同时考虑像素点的空间距离和灰度差异,从而在去除噪声的同时尽可能地保留图像的边缘和细节。具体来说,对于一幅大小为 M×N 的图像,双边滤波的过程如下:
    (1)对于图像中的每个像素点(x,y),确定其邻域大小为 m×n。
    (2)计算邻域内每个像素点到(x,y)的空间距离和灰度差异。
    (3)根据空间距离和灰度差异计算每个像素点的权重。
    (4)将邻域内所有像素点的像素值乘以相应的权重,然后求和。
    (5)将求和结果除以权重之和,得到滤波后的像素值。

  2. 应用场景
    双边滤波能够在去除噪声的同时较好地保留图像的边缘和细节,因此在图像去噪、图像增强、图像平滑等领域得到了广泛的应用。特别是在对图像进行边缘保持平滑处理时,双边滤波通常能够取得较好的效果。

  3. c16d392a9062461eafcea3f74efa3340.pngafa6c8842b0b4f9e9926ab714a1335a4.png

五、其他图像滤波算法

(一)导向滤波

  1. 原理
    导向滤波是一种基于局部线性模型的滤波算法。它的基本思想是通过一个引导图像来确定滤波的方向和强度,从而在去除噪声的同时尽可能地保留图像的边缘和细节。具体来说,对于一幅大小为 M×N 的图像,导向滤波的过程如下:
    (1)确定引导图像和滤波窗口大小。
    (2)对于图像中的每个像素点(x,y),在其邻域内建立局部线性模型。
    (3)根据引导图像和局部线性模型计算每个像素点的滤波输出。

  2. 应用场景
    导向滤波在图像去噪、图像增强、图像融合等领域都有广泛的应用。特别是在对图像进行细节增强和边缘保持处理时,导向滤波通常能够取得较好的效果。

#include <opencv2/core/core.hpp>                    
#include <opencv2/highgui/highgui.hpp>        
#include <opencv2/imgproc/imgproc.hpp>    
#include <iostream>       
using namespace std;
using namespace cv;

Mat guidedFilter(Mat& srcMat, Mat& guidedMat, int radius, double eps);//引导滤波器  

int main()
{
    //------------【0】定义相关变量-------------  
    Mat resultMat;  //最后结果图像  
    vector<Mat> vSrcImage, vResultImage;
    //------------【1】读取源图像并检查图像是否读取成功------------       
    Mat srcImage = imread("D:\\微腔测试1108\\0010.bmp",1);
    if (!srcImage.data)
    {
        cout << "读取图片错误,请重新输入正确路径!\n";
        system("pause");
        return -1;
    }
    imshow("【源图像】", srcImage);
    //-------【2】对源图像进行通道分离,并对每个分通道进行导向滤波操------  
    split(srcImage, vSrcImage);
    for (int i = 0; i < 3; i++)
    {
        Mat tempImage;
        vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0);//将分通道转换成浮点型数据  
        Mat cloneImage = tempImage.clone(); //将tempImage复制一份到cloneImage  
        Mat resultImage = guidedFilter(tempImage, cloneImage, 9, 0.01);//对分通道分别进行导向滤波,半径为1、3、5...等奇数  
        vResultImage.push_back(resultImage);//将分通道导向滤波后的结果存放到vResultImage中  
    }
    //----------【3】将分通道导向滤波后结果合并-----------------------  
    merge(vResultImage, resultMat);
    imshow("【引导滤波/导向滤波】", resultMat);

    Mat resbil;
    bilateralFilter(srcImage, resbil, 25,120, 25 / 2);
    waitKey(0);
    return 0;
}

//导向滤波器  
Mat guidedFilter(Mat& srcMat, Mat& guidedMat, int radius, double eps)
{
    //------------【0】转换源图像信息,将输入扩展为64位浮点型,以便以后做乘法------------  
    srcMat.convertTo(srcMat, CV_64FC1);
    guidedMat.convertTo(guidedMat, CV_64FC1);
    //--------------【1】各种均值计算----------------------------------  
    Mat mean_p, mean_I, mean_Ip, mean_II;
    boxFilter(srcMat, mean_p, CV_64FC1, Size(radius, radius));//生成待滤波图像均值mean_p   
    boxFilter(guidedMat, mean_I, CV_64FC1, Size(radius, radius));//生成引导图像均值mean_I     
    boxFilter(srcMat.mul(guidedMat), mean_Ip, CV_64FC1, Size(radius, radius));//生成互相关均值mean_Ip  
    boxFilter(guidedMat.mul(guidedMat), mean_II, CV_64FC1, Size(radius, radius));//生成引导图像自相关均值mean_II  
    //--------------【2】计算相关系数,计算Ip的协方差cov和I的方差var------------------  
    Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
    Mat var_I = mean_II - mean_I.mul(mean_I);
    //---------------【3】计算参数系数a、b-------------------  
    Mat a = cov_Ip / (var_I + eps);
    Mat b = mean_p - a.mul(mean_I);
    //--------------【4】计算系数a、b的均值-----------------  
    Mat mean_a, mean_b;
    boxFilter(a, mean_a, CV_64FC1, Size(radius, radius));
    boxFilter(b, mean_b, CV_64FC1, Size(radius, radius));
    //---------------【5】生成输出矩阵------------------  
    Mat dstImage = mean_a.mul(srcMat) + mean_b;
    return dstImage;
}

(二)非局部均值滤波

  1. 原理
    非局部均值滤波是一种基于图像块相似性的滤波算法。它的基本思想是通过计算图像中所有像素点之间的相似性,然后对相似的像素点进行加权平均,从而得到滤波后的像素值。具体来说,对于一幅大小为 M×N 的图像,非局部均值滤波的过程如下:
    (1)将图像分成若干个大小相同的图像块。
    (2)对于每个图像块,计算其与其他图像块之间的相似性。
    (3)根据相似性计算每个图像块的权重。
    (4)将所有图像块的像素值乘以相应的权重,然后求和。
    (5)将求和结果除以权重之和,得到滤波后的像素值。

  2. 应用场景
    非局部均值滤波能够有效地去除图像中的噪声,同时对图像的边缘和细节影响较小。因此,非局部均值滤波广泛应用于图像去噪、图像增强等领域。特别是在处理受到复杂噪声污染的图像时,非局部均值滤波通常能够取得较好的效果。

  3.  fastNlMeansDenoising() :用于 1 通道、2 通道或 3 通道 8 位图像。(单个灰度图像)
    
     fastNlMeansDenoisingColored() :用于 1 通道、2 通道、3 通道或 4 通道的 8 位或 16 位图像(16位下仅NORM_L1)。(彩色图像)
    
     fastNlMeansDenoisingMulti()  :用于 8 位 3 通道图像。(灰度图像序列)
    
    fastNlMeansDenoisingColoredMulti():用于 8 位 3 通道图像序列。(彩色图像序列)
    
    与常用的双线性滤波、中值滤波等利用图像局部信息来滤波不同的是,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。与我们以前学习的平滑技术相比这种算法要消耗更多的时间,但是结果很好。对于彩色图像,要先转换到 CIELAB 颜色空间,然后对 L 和 AB 成分分别去噪。
    
    #include <opencv2/opencv.hpp>
    #include <iostream>
     
    using namespace cv;
    using namespace std;
     
    int main(int argc, char** argv) {
    	Mat src = imread("../images/test.jpg");
    	if (src.empty()) {
    		printf("不能打开图像!\n");
    		return -1;
    	}
     
    	namedWindow("1--原图", WINDOW_AUTOSIZE);
    	imshow("1--原图", src);
     
    	Mat result1;
     
    	// 图像去噪
    	fastNlMeansDenoisingColored(src, result1, 5, 5, 7, 21);
    	imshow("2--fastNlMeansDenoisingColored", result1);
     
    	waitKey(0);
    	return 0;
    }
     

     

六、图像滤波算法的选择

在选择图像滤波算法时,需要考虑以下几个因素:

(一)噪声类型
不同的噪声类型需要不同的滤波算法。例如,对于椒盐噪声,中值滤波通常是最有效的算法;对于高斯噪声,高斯滤波通常是最有效的算法。

(二)图像特点
不同的图像特点需要不同的滤波算法。例如,对于边缘和细节丰富的图像,双边滤波通常是最有效的算法;对于平滑的图像,均值滤波通常是最有效的算法。

(三)计算效率
不同的滤波算法计算效率不同。在实际应用中,需要根据计算资源和时间要求选择合适的滤波算法。

(四)应用需求
不同的应用需求需要不同的滤波算法。例如,在图像去噪的同时需要保留图像的边缘和细节,那么双边滤波或导向滤波可能是更好的选择;如果只需要去除噪声,对图像的边缘和细节要求不高,那么均值滤波或高斯滤波可能是更好的选择。

七、结论

在数字图像处理中,选择合适的滤波算法对于提高图像质量至关重要。通过对高斯滤波、中值滤波、双边滤波和锐化滤波等常见算法的了解和应用,我们可以根据不同的噪声类型、图像特点和应用需求选择合适的滤波算法。合理应用这些算法可以有效去除噪声、增强细节、保护边缘信息等,为后续的图像处理和分析提供更好的基础。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    Mat image = imread("your_image.jpg");
    if (image.empty()) {
        cout << "无法读取图像" << endl;
        return -1;
    }

    // 均值滤波
    Mat meanBlurredImage;
    blur(image, meanBlurredImage, Size(5, 5));

    // 高斯滤波
    Mat gaussianBlurredImage;
    GaussianBlur(image, gaussianBlurredImage, Size(5, 5), 1.5);

    // 中值滤波
    Mat medianBlurredImage;
    medianBlur(image, medianBlurredImage, 5);

    // 双边滤波
    Mat bilateralFilteredImage;
    bilateralFilter(image, bilateralFilteredImage, 9, 75, 75);

    imshow("原始图像", image);
    imshow("均值滤波后的图像", meanBlurredImage);
    imshow("高斯滤波后的图像", gaussianBlurredImage);
    imshow("中值滤波后的图像", medianBlurredImage);
    imshow("双边滤波后的图像", bilateralFilteredImage);

    waitKey(0);

    return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568开发板静态IP地址配置

1. 连接SSH MYD-LR3568 开发板设置了静态 eth0:1 192.168.0.10 和 eth1:1 192.168.1.10&#xff0c;在没有串口时调试开发板&#xff0c;可以用工具 SSH 登陆到开发板。 首先需要用一根网线直连电脑和开发板&#xff0c;或者通过路由器连接到开发板&#xff0c;将电脑 IP 手动设…

(蓝桥杯C/C++)——基础算法(上)

目录 一、二分法 1.二分法简介 二分法简介-解题步骤 2.整数二分-简介 整数二分-模板 3.浮点二分-简介 浮点二分-模板 4.二分答案-简介 二分答案-模板​​​​​​​ 二、位运算 1.位运算简介 2.常见的位运算 按位与AND(&) 按位或OR( | ) 按位异或…

【RAG系列】KG-RAG 用最简单的方式将知识图谱引入RAG

目录 前言 一、引入知识图谱的作用 二、引入知识图谱的挑战 三、KG-RAG的理论 query多跳有限性 知识局部密集性 四、KG-RAG的方法 向量入库 向量相似搜索 扩展子图 LLM Rerank LLM response 五、效果比对 六、源码 总结 前言 本文介绍一种比较新颖的RAG范式&am…

6.《双指针篇》---⑥和为S的两个数字(中等但简单)(牛客)

题目传送门 方法一&#xff1a;暴力解法。双循环 方法二&#xff1a;双指针&#xff08;推荐&#xff09; 1.定义一个顺序表&#xff0c;定义左右双指针 2.while循环。判断array[left] array[right] 的值。 3.若等于则将这两个值加入数组。并break 4.若大于则right-- 5.若小于…

【学术论文投稿】Python网络爬虫全攻略:从零到一,打造你的数据收集利器

【IEEE出版 | 中国石油大学&#xff08;华东&#xff09;主办】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 什么是网络爬虫&#xff1f; Python网络爬虫的…

LWIP通信协议UDP发送、接收源码解析

1.UDP发送函数比较简短&#xff0c;带操作系统和裸机一样。以下是udp_sendto源码解析&#xff1b; 2.LWIP源码UDP接收数据 2.1.UDP带操作系统接收数据&#xff0c;以下是源码解析&#xff1b; 2.2.UDP裸机接收数据&#xff0c;以下是源码解析

3^100的位数判断

3^100的位数判断 问题来源 字节面试&#xff0c;面试官提问&#xff1a;口算估计3^100的位数&#xff0c;或是给出位数估计范围。 解决方案 方法一&#xff1a; 该方法纯口算&#xff0c;可得一个较为准确的一个范围 2 100 < 3 100 < 4 100 2^{100}<3^{100}<…

Vue2进阶之Vue3高级用法

Vue3高级用法 响应式Vue2&#xff1a;Object.definePropertyObject.definePropertythis.$set设置响应式 Vue3&#xff1a;Proxy composition APIVue2 option API和Vue3 compositionAPIreactive和shallowReactivereadonly效果toRefs效果 生命周期main.jsindex.htmlLifeCycle.vue…

大微DW421专为电子雾化器设计的大功率MEMS硅麦咪头芯片

在电子雾化器领域&#xff0c;一款高性能、高稳定性的咪头是实现优质用户体验的关键。大微DW421功率咪头&#xff0c;广泛应用在电子雾化类设备的21W大功率集成硅麦咪头芯片&#xff0c;集成了最新的MEMS硅基膜微机电系统技术&#xff0c;赋予了咪头更高的灵敏度和稳定性&#…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目&#xff0c;用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互&#xff0c;是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…

vue+websocket实现即时聊天平台

目录 1 什么是websocket 2 实现步骤 2.1 导入依赖 2.2 编写代码 1 什么是websocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它主要用于在客户端和服务器之间建立持久的连接&#xff0c;允许实时数据交换。WebSocket 的设计目的是为了提高 Web 应用程序的…

本地跟单软件,精准跟随、实时同步 轻松实现自动跟单 MT4免费EA

指标名称&#xff1a;本地跟单软件 版本&#xff1a;MT4 ver. 2.01&#xff08;EA&#xff09; 我们经常在一些论坛或网站上看到一些朋友提供的观摩账户吧&#xff0c;可以看到别人的账户情况&#xff0c;遇到有实力的交易者&#xff0c;很是羡慕啊。 如果我们自己的账户可以…

基于stm32的智能电子称(开源)

功能演示 基于stm32的智能电子称 简介 这是最近别人让我帮他做的一个毕业设计&#xff0c;总体来说非常简单&#xff0c;半天都不需要就可以实现&#xff0c;我做完之后&#xff0c;打算开源在这里让大家进行学习&#xff0c;我们先看一下他的任务书吧: 主要内容与基本要求&am…

写过的试卷怎么打印出新的?

当您有一份已经完成的试卷&#xff0c;但又需要重新打印一份全新的试卷时&#xff0c;这似乎是一个令人头疼的问题。不用担心&#xff0c;这里为您介绍一种简便的方法——利用“扫描”或“试卷还原”的软件&#xff0c;通过拍照的方式&#xff0c;将试卷上的答案清除&#xff0…

【51单片机】串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

动态规划 —— dp 问题-打家劫舍II

1.打家劫舍II 题目链接&#xff1a; 213. 打家劫舍 II - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber-ii/ 2. 题目解析 通过分类讨论&#xff0c;将环形问题转换为两个线性的“打家劫舍|” 当偷第一个位置的时候&#xff0c;rob1在&#…

开车去内蒙古旅游要做什么准备?

一、车辆选择与准备 车辆类型&#xff1a; 尽量选择越野车或SUV&#xff0c;这类车辆底盘高、通过性好&#xff0c;适合草原、沙漠等复杂地形。车辆检查&#xff1a; 出发前全面检查车辆&#xff0c;包括轮胎、刹车系统、发动机等&#xff0c;确保车辆状态良好。冬季出行需特别…

【题解】—— LeetCode一周小结44

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结43 28.冗余连接 II 题目链接&#xff1a;685. 冗余连接 II 在…

视频Qoe测量学习笔记(一)

目录 流媒体协议详解 RTSP&#xff1a;实时流式协议 RTCP&#xff1a;实时运输控制协议 RTP&#xff1a;实时运输协议 H.264 流媒体协议详解 RTSP&#xff1a;实时流式协议 由IETF MMusic小组开发&#xff0c;已成为互联网建议标准[RFC 2326]。RTSP本身并不传送数据&…