好像你的方差求的有点问题。
function n=psnr(I,K1)
A1=double(I);
B1=double(K1);
[m,n]=size(A1);
err=0;
sum=0;
for i=1:1:m,
for j=1:1:n,
err=err+(A1(i,j)-B1(i,j))(A1(i,j)-B1(i,j));
sum=sum+A1(i,j)A1(i,j);
end
end
psnr=err/sum;
psnr_before_noisedelete=-10log10(psnr)
PSNR=num2str(psnr_before_noisedelete);
disp(psnr'); %显示
这是我用的程序,求出的结果你自己看看吧。
我是自己先定义的一个函数,之后再求的snr。我用上面的函数求的结果一般小于30。
%利用小波变换对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
clear all;
close all;
x=0:02:10;
data1=sin(x);
plot(x,data1);
hold on;
data2=awgn(data1,10log10(005));
plot(x,data2,'r-');
hold off;
扩展资料
matlab添加白噪声叠加到信号:
function [Y,NOISE] = noisegen(X,SNR)
% noisegen add white Gaussian noise to a signal
% [Y, NOISE] = NOISEGEN(X,SNR) adds white Gaussian NOISE to X The SNR is in dB
NOISE=randn(size(X));
NOISE=NOISE-mean(NOISE);
signal_power = 1/length(X)sum(XX);
noise_variance = signal_power / ( 10^(SNR/10) );
NOISE=sqrt(noise_variance)/std(NOISE)NOISE;
Y=X+NOISE;
其中X是纯信号,SNR是要求的信噪比,Y是带噪信号,NOISE是叠加在信号上的噪声。
'uint8' 是8bit正整数。出错是说psnr不识别整数的输入。
你试试psnr(double(I),double(I1))
如果还不好使。
你的函数必须存在另外一个叫psnrm的文件里
函数可以写在函数里,写在脚本里的函数不好使。
图象的信噪比等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方差之比。
计算方法:
1、计算图象所有象素的局部方差;
2、将局部方差的最大值认为是信号方差,最小值是噪声方差;
3、求出它们的比值;
4、再转成dB数;
5、最后用经验公式修正。
图像去噪是将一个存在噪声的图像进行处理,提高图像质量,其中信噪比是常用的评价指标之一。在评价图像去噪效果时,可以通过查看信噪比来了解去噪效果的好坏程度,信噪比越高,代表图像中信号与噪声的比例越高,即去噪效果越好。
通常,在图像去噪过程中,可以通过相关软件或代码实现对信噪比的计算,并查看其数值大小。一些常见的图像处理软件,如Matlab、OpenCV等都可以计算信噪比。此外,也可以通过自己编写相关代码来实现信噪比的计算。
具体计算信噪比的方式与算法都有多种,例如峰值信噪比(PSNR)、结构相似性指数(SSIM)等。在使用时,需要根据具体的应用和研究目的,选择或设计合适的信噪比计算算法。
总之,信噪比是评价图像去噪效果的重要指标之一,在评价其优劣时可以通过相关软件或代码实现计算,并查看其数值大小。
信噪比SNR就是signal-to-noise ratio,使用电压平方比来定义的,是信号电压与噪声电压之比的平方的对数的十倍,在图像中被用来表示解压缩的客观保真度准则。如果把f(x,y)看做原始图g(x,y)和噪声信号e(x,y)的和,输出图的均方信噪比就是合成图像时采用SNR=(目标背景的灰度对比度/噪声均方差)的平放来进行估计。正如刚才所说,具体的计算方式是根据不同的具体应用而变化的,有的时候只有噪声电压使用均方根做单位,等等。
以上就是关于求高手帮忙看一下 下面这个求两幅图像均方误差MSE和峰值信噪比PSNR的小程序有无问题全部的内容,包括:求高手帮忙看一下 下面这个求两幅图像均方误差MSE和峰值信噪比PSNR的小程序有无问题、急~!求助 matlab小波图像去噪的源程序...处理.bmp格式的图像....真的很急!!!邮箱:36545215@qq.com ...、matlab如何添加自定义信噪比的噪声信号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)