
BM3D 是一种降噪方法提高了图像在变换域的稀疏表示。BM3D 降噪方法的优点是更好的保留图像中的一些细节,BM3D采用了不同的去噪策略。通过搜索相似块并在变换域进行滤波,得到块评估值,最后对图像中每个点进行加权得到最终去噪效果。
原理:首先将一幅图像分割成尺寸较小的小像素片,选定参考片后,寻找与参考片相似的小片组成 3D 块。此过程过后将得到 3D 块。然后将所有相似块进行 3D 变换。将变换后的 3D 块进行阈值收缩,这也是除去噪声的过程。然后进行 3D 逆变换。最后将所有的 3D 块通过加权平均后还原到图像中。
BM3D算法的大致流程:
第1步 初始估计
(1)逐块估计。对含噪图像中的每一块
(i)分组。找到它的相似块然后把它们聚集到一个三维数组。
(ii)联合硬阈值。对形成的三维数组进行三维变换,通过对变换域的系数进行硬阈值处理减弱噪声,然后逆变换得到组中所有图像块的估计值,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的块估计,通过对他们进行加权平均得到真实图像的基础估计。
第2步 最终估计
(1)逐块估计。对基础估计图像中的每一块
(i) 分组。通过块匹配找到与它相似的相似块在基础估计图像中的位置,通过这些位置得到两个三维数组,一个是从含噪图像中得到的,一个是从基础估计图像中得到的。
(ii)联合维纳滤波。对形成的两个三维数组均进行三维变换,以基础估计图像中的能量谱作为能量谱对含噪三维数组进行维纳滤波,然后逆变换得到组中所有图像块的估计,然后把这些估计值返回到他们的原始位置。
(2)聚集。对得到的有重叠的局部块估计,通过对他们进行加权平均得到真实图像的最终估计。
其实都可以对彩色图像处理的,只是matlab里面的实现不一致。均值滤波和中值滤波matlab函数只考虑了单通道当然就必须转换成灰度图像;小波降噪的matlab函数不知道你是用的那个,肯定也需要把三通道的彩色图像先转换成单通道,分别去噪以后再整合成彩色图像。总的来说一般图像去噪都是对单通道来处理的,因为大部分的filter都是对二维矩阵来 *** 作的,要是对三通道处理也需要分别对不同的通道处理再整合。
%利用小波变换对8位灰度图像进行去噪去噪处理,最后显示信噪比和均方误差
clear all;clc;
A=imread('d:/photo/fabric/cd4 - 复制bmp');
subplot(121),imshow(A);title('original imge');
[m,n]=size(A);
A=double(A);
%选取分解小波
display('选择分解的小波:');
display('enter 1 for haar wavelet');
display('enter 2 for db2 wavelet');
display('enter 3 for db4 wavelet');
display('enter 4 for sym wavelet');
display('enter 5 for sym wavelet');
display('enter 6 for bior wavelet');
display('enter 7 for bior wavelet');
display('enter 8 for mexh wavelet');
display('enter 9 for coif wavelet');
display('enter 10 for meyr wavelet');
display('enter 11 for morl wavelet');
display('enter 12 for rbio wavelet');
display('press any key to quit');
ww=input('enter your choice: ');
switch ww
case 1
wv='haar';
case 2
wv='db2';
case 3
wv='db4' ;
case 4
wv='sym2'
case 5
wv='sym4';
case 6
wv='bior11';
case 7
wv='bior68';
case 8
wv='mexh';
case 9
wv='coif5';
case 10
wv='dmey';
case 11
wv='mor1';
case 12
wv='jpeg97';
otherwise
quit;
end
%选取分解的层数
display('选择分解层数:');
levels=input('enter 1 or 2 : ');
filtertype=wv;
[C,S]=wavedec2(A,levels,filtertype); %小波分解
var=length(C)-S(size(S,1)-1,1)^2+1;
%{
%第一中去噪方法:用此种方法时,效果与选取分解的层数没有关系,只与选取的小波有关系
C(var:length(C))=0; %将对角线的高频系数置零
B=waverec2(C,S,filtertype); %重构图像
%}
%{
%第二种去噪方法:贝叶斯阈值去噪,对各个高频系数进行贝叶斯阈值去噪
display('选择软阈值或者硬阈值:');
display('enter 1 for soft thresholding');
display('enter 2 for hard thresholding');
sorh=input('sorh: ');
sigmahat=median(abs(C(var:length(C))))/06745; %Calculating sigmahat
st=(S(1,1)^2)+1; %低频系数的个数
bayesC=[C(1:st-1),zeros(1,length(st:1:length(C)))]; %只是保留低频信息
for jj=2:size(S,1)-1 %行数
%对于水平高频系数
coeh=C(st:st+S(jj,1)^2-1);
thr=bayes(coeh,sigmahat);
if sorh==1
bayesC(st:st+S(jj,1)^2-1)=sthresh(coeh,thr);
end
if sorh==2
bayesC(st:st+S(jj,1)^2-1)=hthresh(coeh,thr);
end
st=st+S(jj,1)^2;
%对于垂直高频系数
coev=C(st:st+S(jj,1)^2-1);
thr=bayes(coev,sigmahat);
if sorh==1
bayesC(st:st+S(jj,1)^2-1)=sthresh(coev,thr);
end
if sorh==2
bayesC(st:st+S(jj,1)^2-1)=hthresh(coev,thr);
end
st=st+S(jj,1)^2;
%对于对角高频系数
coed=C(st:st+S(jj,1)^2-1);
thr=bayes(coed,sigmahat);
if sorh==1
bayesC(st:st+S(jj,1)^2-1)=sthresh(coed,thr);
end
if sorh==2
bayesC(st:st+S(jj,1)^2-1)=hthresh(coed,thr);
end
st=st+S(jj,1)^2;
end
B=waverec2(bayesC,S,filtertype); %重构图像
%}
%{
%第三种方法:采用Donoho和Johnstone提出的固定阈值的方法进行去噪处理
display('选择软阈值或者硬阈值:');
display('enter 1 for soft thresholding');
display('enter 2 for hard thresholding');
sorh=input('sorh: ');
st=(S(1,1)^2)+1; %低频系数的个数
djC=[C(1:st-1),zeros(1,length(st:1:length(C)))]; %只是保留低频信息
for jj=2:size(S,1)-1 %行数
%对于水平高频系数
coeh=C(st:st+S(jj,1)^2-1);
sigmah=median(abs(coeh))/06745;
thr=sigmahsqrt(2log10(length(coeh)));
if sorh==1
djC(st:st+S(jj,1)^2-1)=sthresh(coeh,thr);
end
if sorh==2
djC(st:st+S(jj,1)^2-1)=hthresh(coeh,thr);
end
st=st+S(jj,1)^2;
%对于垂直高频系数
coev=C(st:st+S(jj,1)^2-1);
sigmav=median(abs(coev))/06745;
thr=sigmavsqrt(2log10(length(coev)));
if sorh==1
djC(st:st+S(jj,1)^2-1)=sthresh(coev,thr);
end
if sorh==2
djC(st:st+S(jj,1)^2-1)=hthresh(coev,thr);
end
st=st+S(jj,1)^2;
%对于对角高频系数
coed=C(st:st+S(jj,1)^2-1);
sigmad=median(abs(coed))/06745;
thr=sigmavsqrt(2log10(length(coed)));
if sorh==1
djC(st:st+S(jj,1)^2-1)=sthresh(coed,thr);
end
if sorh==2
djC(st:st+S(jj,1)^2-1)=hthresh(coed,thr);
end
st=st+S(jj,1)^2;
end
B=waverec2(djC,S,filtertype); %重构图像
%}
subplot(122),imshow(uint8(B));title('de-noised image');
%imwrite(B,'fab5bmp'); %保存图像在m文件的路径中
%计算信噪比
t=0;
for i=1:m
for j=1:n
t=t+(abs(B(i,j)-A(i,j)))^2;
end
end
mse=t/(mn); %图像均方误差
psnr=10log10((255^2)/mse); %峰值信噪比
display('mse:');
mse
display('psnr:');
psnr
%----------小波去噪------------
sound=wavread(file);
Speech=sound';
[c,l]=wavedec(Speech,3,'db6'); %用小波函数db6对信号进行3层分解
sigma=wnoisest(c,l,1); %估计1-D噪声的标准偏差
alpha=2;
thr=wbmpen(c,l,sigma,alpha); %获取去噪过程的阈值
SpeechDenoising=wdencmp('gbl',c,l,'db6',3,thr,'s',1);%去噪
%------------------------------
I = imread('apng');%读图像
J = imnoise(I,'salt & pepper',002);%加椒盐噪声
K = medfilt2(J);%用中值滤波去噪声。
imshow(K);
如果效果不好,加上问我。
Im=Icc;
In=Im;
for a=1:4
for i=2:m-1
for j=2:n-1
if Im(i,j)==1
if Im(i-1,j) + Im(i-1,j+1) +Im(i,j+1) + Im(i+1,j+1) + Im(i+1,j) + Im(i+1,j-1) + Im(i,j-1) + Im(i-1,j-1) <=3
In(i,j)=0;
end
end
if Im(i,j)==0
if Im(i-1,j) + Im(i-1,j+1) +Im(i,j+1) + Im(i+1,j+1) + Im(i+1,j) + Im(i+1,j-1) + Im(i,j-1) + Im(i-1,j-1) >=7
In(i,j)=1;
end
end
end
end
Im=In;
end
以上就是关于matlab如何对图像进行椭圆滤波器降噪全部的内容,包括:matlab如何对图像进行椭圆滤波器降噪、matlab 怎么用EMD进行图像二维去噪、急~!求助 matlab小波图像去噪的源程序...处理.bmp格式的图像....真的很急!!!邮箱:36545215@qq.com ...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)