BM3D的学习与Matlab实现「建议收藏」

2022-08-15 19:09:09 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

BM3D的学习与Matlab的实现

BM3D是2007年TIP的文章,题目是《Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering》。最近想尝试一下图像去噪,看看能否应用到项目中,顺便测试了一下效果,结果不是太理想,主要问题是时间,去噪效果还是可以的。担心以后找起来(实现)麻烦,就当做个笔记了。

1、论文篇

(1) http://www.cs.tut.fi/~foi/GCF-BM3D/

(2) 《Comments on “Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering”》

(3) 《An Analysis and Implementation of the BM3D Image Denoising Method》

2、代码下载

(1) Github搜索BM3D:https://github.com/search?q=BM3D&type=Repositories,选择Matlab版本

(2) 官网:http://www.cs.tut.fi/~foi/GCF-BM3D/(含源码与测试图)

(3) 官网demo:http://demo.ipol.im/demo/l_bm3d/

3、原理(感谢下面几位博主的奉献)

(1) BM3D(Block-Matching and 3D filtering)读后感

(2) 图像去噪算法原理-待完善

(3) 图像去噪重要文献整理(二)BM3D / LSSC

4、工程实现(以Matlab为例)

(1) 先看官网的demo,具体步骤如下:

(2) 运行官网提供的代码BM3D.m文件:

先上结果,这是论文中的结果,效果确实好:

(3) 自己测试一张图像时:

测试代码:

代码语言:javascript复制
%% demo
clear all;clc;close all;

img = imread('noise.png');  % 测试图像,可更改
if length(size(img)) > 2
    img = rgb2gray(img);
end

figure(1),imshow(img);
y = im2double(img);
% randn('seed',0);
sigma=25/255;
z=y sigma*randn(size(y));

y_est = BM3DSAPCA2009(z,sigma);
figure(2),imshow(y_est);

disp('end!');
%% performance evaluation
PSNR = 10*log10(1/mean((y(:)-y_est(:)).^2));
disp(['PSNR = ',num2str(PSNR)])
if exist('ssim_index')
    [mssim ssim_map] = ssim_index(y*255, y_est*255);
    disp(['SSIM = ',num2str(mssim)]);
end

这张图的运行时间64s!!!没办法,效果确实是好,但是时间真心不短,(又想马儿想得快,又想马儿不吃草,哈哈)。BM3D的复杂之处在于,首先找相似块,其次是采用了两次block-wise estimate,复杂度相比NLM翻了1倍,且含有域变换操作,具体原理见上面的博客链接。类似其中一位博友所说,尽管计算机性能已经成百上千倍地提高,还是远不能满足很多算法的实时计算的需求,这很大程度上限制了这些算法的使用范围:用户无法处理一张照片需要等待长达几分钟的时间,因此,距离真正意义上的实用还是有一段距离。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133866.html原文链接:https://javaforall.cn

0 人点赞