news 2026/5/1 1:05:40

基于Matlab的双边滤波去噪:图像的美颜魔法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Matlab的双边滤波去噪:图像的美颜魔法

基于Matlab的双边滤波去噪

在图像处理领域,噪声就像是不速之客,破坏了图像原本的清晰与美感。双边滤波作为一种强大的去噪技术,如同图像的“美颜滤镜”,能在有效去除噪声的同时,最大程度保留图像的边缘细节。今天咱就来唠唠基于Matlab实现双边滤波去噪。

双边滤波原理速览

双边滤波综合考虑了空间距离和像素值差异的权重。简单说,对于目标像素,不仅会考虑它周围像素在空间位置上离它有多近(空间邻近度),还会看这些像素的灰度值和它有多相似(灰度相似性)。这就好比选朋友,既要住得近,性格脾气还得合得来。

数学公式表达如下:

基于Matlab的双边滤波去噪

\[ g(i,j) = \frac{1}{W{ij}} \sum{m,n} f(m,n) \cdot e^{-\frac{(i - m)^2+(j - n)^2}{2\sigmad^2}} \cdot e^{-\frac{(f(i,j)-f(m,n))^2}{2\sigmar^2}} \]

其中 \( g(i,j) \) 是滤波后输出像素值,\( f(m,n) \) 是输入图像像素值,\( W{ij} \) 是归一化系数,\( \sigmad \) 是空间域标准差,\( \sigma_r \) 是值域标准差 。

Matlab实现双边滤波

Matlab提供了便捷的函数imgaussfilt2来实现双边滤波,不过咱自己动手实现一下,能更好理解其中门道。

function filtered_img = bilateral_filter_manual(input_img, d, sigma_d, sigma_r) % 获取图像尺寸 [height, width] = size(input_img); % 初始化滤波后的图像 filtered_img = zeros(height, width); % 计算高斯核半径 r = floor(d / 2); for i = 1:height for j = 1:width % 初始化权重和加权像素值总和 weight_sum = 0; intensity_sum = 0; for m = max(1, i - r):min(height, i + r) for n = max(1, j - r):min(width, j + r) % 空间距离权重 spatial_weight = exp(-((i - m)^2 + (j - n)^2) / (2 * sigma_d^2)); % 灰度值差异权重 range_weight = exp(-(input_img(i, j) - input_img(m, n))^2 / (2 * sigma_r^2)); % 总权重 weight = spatial_weight * range_weight; % 累加加权像素值和权重 intensity_sum = intensity_sum + input_img(m, n) * weight; weight_sum = weight_sum + weight; end end % 计算滤波后的像素值 filtered_img(i, j) = intensity_sum / weight_sum; end end end

代码分析

  1. 尺寸获取与初始化
[height, width] = size(input_img); filtered_img = zeros(height, width);

这部分获取输入图像的高度和宽度,并初始化一个与输入图像大小相同的全零矩阵filtered_img,用于存储滤波后的图像。

  1. 高斯核半径计算
r = floor(d / 2);

d代表邻域直径,通过floor(d / 2)计算出高斯核的半径r,用于确定参与滤波的邻域范围。

  1. 双重循环遍历像素
for i = 1:height for j = 1:width

这两层循环遍历输入图像的每一个像素,对每个像素进行双边滤波操作。

  1. 权重计算与累加
for m = max(1, i - r):min(height, i + r) for n = max(1, j - r):min(width, j + r) spatial_weight = exp(-((i - m)^2 + (j - n)^2) / (2 * sigma_d^2)); range_weight = exp(-(input_img(i, j) - input_img(m, n))^2 / (2 * sigma_r^2)); weight = spatial_weight * range_weight; intensity_sum = intensity_sum + input_img(m, n) * weight; weight_sum = weight_sum + weight; end end

这里面又嵌套了两层循环,遍历以当前像素(i,j)为中心的邻域像素(m,n)。分别计算空间距离权重spatialweight和灰度值差异权重rangeweight,两者相乘得到总权重weight。然后将邻域像素值乘以权重累加到intensitysum,权重累加到weightsum

  1. 滤波后像素值计算
filtered_img(i, j) = intensity_sum / weight_sum;

最后用累加的加权像素值总和intensitysum除以权重总和weightsum,得到滤波后当前像素(i,j)的值,存入filtered_img中。

使用示例

% 读取图像 original_img = imread('lena.png'); % 将图像转换为灰度图 gray_img = rgb2gray(original_img); % 添加高斯噪声 noisy_img = imnoise(gray_img, 'gaussian', 0, 0.01); % 设置双边滤波参数 d = 5; % 邻域直径 sigma_d = 1.5; % 空间域标准差 sigma_r = 0.1; % 值域标准差 % 调用手动实现的双边滤波 filtered_img_manual = bilateral_filter_manual(noisy_img, d, sigma_d, sigma_r); % 显示图像 subplot(1,3,1); imshow(noisy_img); title('含噪声图像'); subplot(1,3,2); imshow(filtered_img_manual); title('手动双边滤波后图像'); subplot(1,3,3); imshow(original_img); title('原始图像');

这段代码读取一张图像,将其转为灰度图后添加高斯噪声,然后调用手动实现的双边滤波函数对噪声图像进行处理,最后展示含噪声图像、滤波后图像以及原始图像。

双边滤波在图像去噪方面表现出色,无论是处理自然图像还是医学影像等专业领域图像,都能发挥重要作用。希望通过自己动手实现双边滤波,大家能对这个强大的图像处理技术有更深入的理解和掌握。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 13:35:26

基于S7-300 PLC和组态王的恒压供水系统搭建与实现

基于S7-300 PLC和组态王组态控制的恒压供水系统在工业自动化领域,恒压供水系统是保障稳定供水的关键环节。今天咱们就唠唠基于S7-300 PLC和组态王组态控制的恒压供水系统。 1. 系统整体架构 恒压供水系统主要目的是保证供水压力稳定,不管用水情况如何变化…

作者头像 李华
网站建设 2026/4/28 4:34:43

基于Tent映射的混合灰狼优化改进算法:Matlab代码复现与解析

一种基于Tent映射的混合灰狼优化的改进算法(Matlab,代码复现,效果与原文一致,数值为运行30次数据) 1.tent映射 2.非线性控制参数策略(有代码,可以出图) 3.pso思想 在优化算法的领域里,不断的创新与改进是推动问题高效…

作者头像 李华
网站建设 2026/4/28 12:27:35

Flutter for OpenHarmony 实战:碰撞检测算法与游戏结束处理

Flutter for OpenHarmony 实战:碰撞检测算法与游戏结束处理 文章目录Flutter for OpenHarmony 实战:碰撞检测算法与游戏结束处理一、前言二、碰撞检测概述2.1 墙壁碰撞2.2 自身碰撞2.3 检测时机三、墙壁碰撞检测3.1 边界判断算法3.2 坐标越界示例3.3 代码…

作者头像 李华
网站建设 2026/5/1 5:46:04

水塔自动控制系统这玩意儿,说复杂也不复杂,核心就是让水位乖乖听话。咱今天拆开揉碎了看看怎么用单片机玩转水位控制,顺便撸几段关键代码

基于单片机的水塔水位控制 设计功能: 1、模拟水塔水位监测及控制系统设计; 2、系统可实现通过一个四相步进电机来实现低水位自动加水和高水位自动停止 ; 3、可实现通过超声波传感器SRF04测量水位变化,低水位报警。 4、可实现通过串…

作者头像 李华
网站建设 2026/3/24 11:41:46

MMC玩转指南:从零搭建20kV直流输电系统

MMC-HVDC两端直流输电,直流电压20kV/每桥臂10个子模块,系统容量10WM。 包括系统级控制,换流站级控制,阀级控制等。 matlab/simulink学习MMC必备,整流逆变,环流抑制/子模块电容排序均压/最近电平逼近/优化调…

作者头像 李华
网站建设 2026/4/27 21:27:39

基于SpringBoot的企业级进销存ERP系统Java源码

基于springBoot企业级进销存ERP系统源码 java源码 Spring Boot的企业级进销存系统开发中,最让人头疼的不是功能实现,而是如何在高并发场景下保证库存数据的准确性。去年我们团队重构老系统时,曾在促销活动中出现过库存超卖500件的重大事故—…

作者头像 李华