BM3D 图像降噪快速算法的 MATLAB 实现


1. 快速 BM3D 算法流程(概述)

步骤操作加速技巧
① 分组块匹配 + 堆叠FFT 互相关
② 协同滤波3D 变换 + 硬阈值FFT 沿第三维
③ 聚合加权平均稀疏矩阵累加

2. 核心函数(单文件版)

保存为 bm3d_fast.m 即可调用:

function [img_denoised] = bm3d_fast(img_noisy, sigma)
% 快速 BM3D 图像降噪(纯 MATLAB,FFT 加速)
% 输入:img_noisy 灰度图 0~255
%       sigma     噪声标准差
% 输出:img_denoised 同尺寸img_noisy = double(img_noisy);
[H,W] = size(img_noisy);%% 参数(与作者论文一致)
block_size = 8;            % 块尺寸
step       = 3;            % 滑动步长
max_similar = 16;          % 最大相似块数
tau_hard   = 2.7*sigma;    % 硬阈值系数
tau_wien   = 2.5*sigma;    % Wiener 阈值%% Step1:基础估计(硬阈值)
basic = bm3d_step1(img_noisy, sigma, block_size, step, max_similar, tau_hard);%% Step2:最终估计(Wiener 协同滤波)
img_denoised = bm3d_step2(img_noisy, basic, sigma, block_size, step, max_similar, tau_wien);img_denoised = uint8(img_denoised);
end

3. Step1:基础估计(硬阈值)

function basic = bm3d_step1(img, sigma, bs, step, max_sim, tau)
[H,W] = size(img);
basic = zeros(H,W);  weight = zeros(H,W);% 预计算 FFT 加速互相关
img_fft = fft2(img);for i = bs/2+1 : step : H-bs/2for j = bs/2+1 : step : W-bs/2% 当前块block = img(i-bs/2:i+bs/2-1, j-bs/2:j+bs/2-1);block_fft = fft2(block);% 快速块匹配(FFT 互相关)corr = real(ifft2(block_fft .* conj(img_fft)));[vals, idx] = sort(corr(:),'descend');idx = idx(1:max_sim);  % 最相似块[di,dj] = ind2sub([H,W], idx);% 堆叠 3D 组group = zeros(bs,bs,max_sim);for k = 1:max_simii = di(k)-bs/2; jj = dj(k)-bs/2;group(:,:,k) = img(ii+1:ii+bs, jj+1:jj+bs);end% 3D 变换(FFT 沿第三维)+ 硬阈值group_fft = fft(group,[],3);group_fft(abs(group_fft) < tau*sigma) = 0;group_est = real(ifft(group_fft,[],3));% 加权聚合w = 1/(sigma^2 * max_sim + 1e-6);for k = 1:max_simii = di(k)-bs/2; jj = dj(k)-bs/2;basic(ii+1:ii+bs, jj+1:jj+bs) = basic(ii+1:ii+bs, jj+1:jj+bs) + w * group_est(:,:,k);weight(ii+1:ii+bs, jj+1:jj+bs) = weight(ii+1:ii+bs, jj+1:jj+bs) + w;endend
endbasic = basic ./ (weight + 1e-6);
end

4. Step2:最终估计(Wiener 协同滤波)

function final = bm3d_step2(img, basic, sigma, bs, step, max_sim, tau)
[H,W] = size(img);
final = zeros(H,W);  weight = zeros(H,W);basic_fft = fft2(basic);for i = bs/2+1 : step : H-bs/2for j = bs/2+1 : step : W-bs/2% 基础图块匹配block_b = basic(i-bs/2:i+bs/2-1, j-bs/2:j+bs/2-1);block_b_fft = fft2(block_b);corr = real(ifft2(block_b_fft .* conj(basic_fft)));[vals, idx] = sort(corr(:),'descend');idx = idx(1:max_sim);[di,dj] = ind2sub([H,W], idx);% 两组:原图 + 基础图group_noisy = zeros(bs,bs,max_sim);group_basic = zeros(bs,bs,max_sim);for k = 1:max_simii = di(k)-bs/2; jj = dj(k)-bs/2;group_noisy(:,:,k) = img(ii+1:ii+bs, jj+1:jj+bs);group_basic(:,:,k) = basic(ii+1:ii+bs, jj+1:jj+bs);end% 3D FFT + Wiener 系数fft_noisy = fft(group_noisy,[],3);fft_basic = fft(group_basic,[],3);power = abs(fft_basic).^2;wiener_coef = power ./ (power + sigma^2 + 1e-6);fft_est = fft_noisy .* wiener_coef;group_est = real(ifft(fft_est,[],3));% 加权聚合w = 1/(sigma^2 + 1e-6);for k = 1:max_simii = di(k)-bs/2; jj = dj(k)-bs/2;final(ii+1:ii+bs, jj+1:jj+bs) = final(ii+1:ii+bs, jj+1:jj+bs) + w * group_est(:,:,k);weight(ii+1:ii+bs, jj+1:jj+bs) = weight(ii+1:ii+bs, jj+1:jj+bs) + w;endend
endfinal = final ./ (weight + 1e-6);
end

参考代码 BM3D图像降噪快速算法 www.youwenfan.com/contentcsg/53384.html

5. 运行

img = imread('lena_gray.png');
img_noisy = imnoise(img,'gaussian',0,0.01);   % σ=10
img_denoised = bm3d_fast(img_noisy, 10);figure; montage({img, img_noisy, img_denoised});
title({'原图','噪声图','BM3D 快速版'});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/98032.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/98032.shtml
英文地址,请注明出处:http://en.pswp.cn/web/98032.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go的schedt调度(runtime/proc.go)

1. 创建go的入口函数// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服务器配置转发网络访问

配置文档&#xff1a;Ubuntu 服务器转发网络访问 一、网络拓扑以以下网络拓扑为示例Ubuntu 服务器&#xff08;两个网卡&#xff09; eth1 10.66.71.222 &#xff08;接入内网&#xff09;eno1 192.168.2.100 &#xff08;直连相机&#xff09; 相机ip 192.168.2.1 Windows 客…

为什么企业需要高防IP

1. 抵御日益猖獗的DDoS攻击 现代DDoS攻击规模已突破Tbps级别 传统防火墙无法应对大规模流量攻击 高防IP采用分布式清洗中心&#xff0c;可轻松抵御300Gbps以上的攻击流量 2. 保障业务连续性 网络中断1小时可能造成数百万损失 高防IP确保服务99.99%可用性 智能切换机制实…

CSS基础 - 选择器备忘录 --笔记5

目录基础选择器组合器伪类选择器属性选择器选择器可以选中页面上的特定元素并为其指定样式。 CSS有多种选择器。 基础选择器 标签选择器 – tagname&#xff1a;匹配目标元素的标签名。优先级是0,0,1。如&#xff1a;p、h1、div类选择器 – .class&#xff1a;匹配class属性中…

自动驾驶中的传感器技术46——Radar(7)

卫星雷达&#xff08;又称为分布式雷达&#xff09;主要讲当前雷达的雷达信号处理计算以及雷达目标相关的一些感知算法都迁移到中央域控进行&#xff0c;雷达端基本只负责数据采集&#xff0c;这样做的影响如下&#xff1a; 雷达端成本与功耗降低&#xff1b; 雷达端采样得到的…

【论文阅读】Diff-Privacy: Diffusion-based Face Privacy Protection

基于扩散模型的人脸隐私保护方法——DiffPrivacy&#xff0c;解决了两类人脸隐私任务&#xff1a;匿名化&#xff08;anonymization&#xff09;和视觉身份信息隐藏&#xff08;visual identity information hiding&#xff09;。1. 研究背景随着人工智能和大数据技术的普及&am…

React 原理篇 - 深入理解虚拟 DOM

一、什么是虚拟 DOM&#xff1f; 在前端开发中&#xff0c;“虚拟 DOM” 是一个高频出现的术语&#xff0c;尤其在 React 生态中被广泛讨论。但很多开发者对它的理解往往停留在 “JS 对象” 这个表层认知上。 实际上&#xff0c;虚拟 DOM 是一种编程概念—— 在这个概念里&…

对汇编的初理解

此处是一个简单的函数&#xff0c;里面将调用了一个函数add&#xff08;&#xff09;函数这里是函数的原型这里是调用lcd函数产生的汇编语言&#xff0c;翻译过来就是r11&#xff0c;r0cnt(r4cnt,前文有提及)&#xff0c;然后调用add函数&#xff0c;此处BL是指会回到指令的下一…

《Python 自动化实战:从零构建一个文件同步工具》

《Python 自动化实战:从零构建一个文件同步工具》 一、开篇引入:为什么我们需要文件同步? 你是否有过这样的困扰: 公司电脑和家里电脑上都有工作项目,每次更新都要手动复制? U 盘频繁传输文件,不仅麻烦还容易出错? 项目文件夹动辄几 G,每次同步都耗时长、效率低? 在…

工业相机与镜头的靶面尺寸详解:选型避坑指南

在机器视觉系统中&#xff0c;相机与镜头的靶面尺寸匹配是一个非常关键却又经常被忽略的细节。选错了&#xff0c;不但影响图像质量&#xff0c;还可能导致画面“黑角”、视野不符、镜头浪费等问题。 今天我们就用通俗易懂的方式&#xff0c;聊一聊相机与镜头靶面尺寸的那些事儿…

使用 Go 和 go-commons 实现内存指标采集并对接 Prometheus

文章目录一、准备工作二、编写内存采集代码三、运行 Exporter四、接入 Prometheus五、可扩展思路总结在运维和监控领域&#xff0c;资源指标采集 是必不可少的一环。CPU、内存、磁盘、网络这些系统资源&#xff0c;需要实时采集并上报到监控系统中。 本文以 内存指标采集 为例&…

webrtc弱网-IntervalBudget类源码分析与算法原理

一、核心功能 IntervalBudget 类用于基于时间窗口的带宽预算管理。它根据设定的目标比特率&#xff08;kbps&#xff09;和一个固定时间窗口&#xff08;500ms&#xff09;&#xff0c;计算在该时间窗口内可用的字节数&#xff08;即“预算”&#xff09;&#xff0c;并支持预…

深度学习基本模块:RNN 循环神经网络

循环神经网络&#xff08;RNN&#xff09;是一种专门用于处理序列数据的神经网络架构。与处理空间数据的卷积神经网络&#xff08;Conv2D&#xff09;不同&#xff0c;RNN通过引入循环连接使网络具有"记忆"能力&#xff0c;能够利用之前的信息来影响当前的输出&#…

React18学习笔记(二) React的状态管理工具--Redux,案例--移动端外卖平台

文章目录一.Redux的基础用法1.示例:普通网页中的Redux计步器2.Redux管理数据的流程3.配套工具和环境准备3.1.配套工具3.2.环境准备4.示例:React项目中的Redux计步器思路步骤step1:创建子模块step2:导入子模块step3:注入store实例step4:React组件内使用store中的数据step5:在组件…

34.Socket编程(UDP)(上)

点分十进制字符串IP 转 32位网络序列IP 分析&#xff1a;1&#xff09;IP转成4字节 2&#xff09;4字节转成网络序列 思路&#xff1a; "192.168.1.1" 进行字符串划分&#xff0c;以 "." 为分割符&#xff0c;分割出"192"&#xff0c;&qu…

Redis的持久化工具包—RDB AOF

文章目录 前言 一、RDB 持久化&#xff08;快照持久化&#xff09; 1. 定义 2. RDB 触发机制 &#xff08;1&#xff09;手动触发 &#xff08;2&#xff09;自动触发 3. RDB 持久化流程 4. RDB 核心配置 5. RDB 优缺点 二、AOF 持久化&#xff08;日志持久化&#xff09; 1. 定…

【Web安全】XXL-JOB框架SRC高频漏洞分析总结

文章目录前言一、核心漏洞分类与技术细节二、漏洞关联利用与攻击路径三、版本演进与修复策略四、安全运维建议五、典型漏洞复现环境搭建六、总结前言 XXL-JOB是国内主流的开源分布式任务调度框架&#xff0c;由徐雪里开发维护&#xff0c;以轻量易用、高可用、适配分布式场景等…

Capacitor 打包后接口访问不到的排查经历

我最近在用 Quasar Capacitor 6 做一个 Android App&#xff0c;前端用的是 Vue3 Quasar&#xff0c;打包交给 Capacitor 去跑在手机的 WebView 里&#xff0c;后端是 FastAPI 提供接口。开发模式下一切顺利&#xff0c;浏览器里访问接口没有任何问题&#xff0c;我甚至觉得打…

【正点原子】Linux应用编程入门~概念及环境介绍

应用编程概念 应用编程&#xff08;也可称为系统编程&#xff09;与驱动编程、裸机编程有何不同&#xff1f;系统调用&#xff1b;何为库函数&#xff1b;应用程序的 main()函数&#xff1b;应用程序开发环境的介绍&#xff1b;系统调用 定义系统调用&#xff08;system call&a…

一、HTML 完全指南:从零开始构建网页

文章目录前言一、 HTML 结构认识 HTML 标签HTML 文件基本结构标签层次结构快速生成代码框架二、 HTML 常见标签详解2.1 注释标签2.2 标题标签 (h1 - h6)2.3 段落标签 (p)2.4 换行标签 (br)2.5 格式化标签2.6 图片标签 (img)2.7 超链接标签 (a)2.8 表格标签基本使用合并单元格2.…