大家好,又见面了,我是你们的朋友全栈君。
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