在MATLAB中设计一个简单的GUI界面 要调用的程序我写好了
[I,map]=imread('lena.bmp');I2=im2double(I);s=size(I2);r=imnoise(I2,'gaussian',0.13);%...
[I,map]=imread('lena.bmp');
I2=im2double(I);
s=size(I2);
r=imnoise(I2,'gaussian',0.13);%填加高斯白噪声
fnoisy=r;
%对图像进行三层小波分解
[c,s]=wavedec2(fnoisy,3,'db8');
%提取二维信号小波分解的细节分量
[cH3,cV3,cD3]=detcoef2('all',c,s,3);c3=[cH3,cV3,cD3];
[cH2,cV2,cD2]=detcoef2('all',c,s,2);c2=[cH2,cV2,cD2];
[cH1,cV1,cD1]=detcoef2('all',c,s,1);c1=[cH1,cV1,cD1];
%固定阈值(VisuShrink阈值):thr=delta*sqrt(2*log(n));
delta=median(abs(cD1(:)))/0.6745;
thr1c=delta*thselect(c,'minimaxi');
%c代表小波分解的次数,s是c中不同层系数的大小 经过阈值处理后,dnc0就代替了c
n=[1 2 3];p=[thr1c thr1c thr1c];
dnc0=wthcoef2('h',c,s,n,p,'s');
dnc0=wthcoef2('v',dnc0,s,n,p,'s');
dnc0=wthcoef2('d',dnc0,s,n,p,'s');
dnf0=waverec2(dnc0,s,'db8');
figure,subplot(121),imshow(I2,[]),title('原始图像')
subplot(122),imshow(fnoisy,[]),title('加噪图像')
dnc2=wthresfunc(c,s,'soft',thr1c);
dnf2=waverec2(dnc2,s,'db8');
figure,imshow(dnf2,[]),title('软阈值函数')
VSf2=cacupsnr(dnf2,I2)
dnc1=wthresfunc(c,s,'upsoft',thr1c);
dnf1=waverec2(dnc1,s,'db8');
figure,imshow(dnf1,[]),title('改进软阈值函数')
VSf3=cacupsnr(dnf1,I2)
function y=wthresfunc(c,s,sorh,t)
%对图像分解小波高频系数进行阈值处理
cA3=appcoef2(c,s,'db8',3);
s1=size(cA3,1);s2=size(cA3,2);
s=s1*s2;
dnc=thrfunc(c,sorh,t);
dnc(1:s)=cA3(:);
y=dnc;
function y=thrfunc(x,sorh,t)
%阈值函数:选择不同的阈值函数对信号进行处理
switch sorh
case 'soft'%软阈值函数
tmp=(abs(x)-t);
tmp=(tmp+abs(tmp))/2;
y=sign(x).*tmp;
case 'upsoft'%软阈值函数改进
k=1;
tmp1=abs(x)-t+t/(2*k+1);
tmp2=x.^(2*k+1)/((2*k+1)*t^(2*k));
y=sign(x).*tmp1.*(abs(x)>=t)+tmp2.*(abs(x)<t);
otherwise
error('Invalid argument value.')
end
这个样子就好了 展开
I2=im2double(I);
s=size(I2);
r=imnoise(I2,'gaussian',0.13);%填加高斯白噪声
fnoisy=r;
%对图像进行三层小波分解
[c,s]=wavedec2(fnoisy,3,'db8');
%提取二维信号小波分解的细节分量
[cH3,cV3,cD3]=detcoef2('all',c,s,3);c3=[cH3,cV3,cD3];
[cH2,cV2,cD2]=detcoef2('all',c,s,2);c2=[cH2,cV2,cD2];
[cH1,cV1,cD1]=detcoef2('all',c,s,1);c1=[cH1,cV1,cD1];
%固定阈值(VisuShrink阈值):thr=delta*sqrt(2*log(n));
delta=median(abs(cD1(:)))/0.6745;
thr1c=delta*thselect(c,'minimaxi');
%c代表小波分解的次数,s是c中不同层系数的大小 经过阈值处理后,dnc0就代替了c
n=[1 2 3];p=[thr1c thr1c thr1c];
dnc0=wthcoef2('h',c,s,n,p,'s');
dnc0=wthcoef2('v',dnc0,s,n,p,'s');
dnc0=wthcoef2('d',dnc0,s,n,p,'s');
dnf0=waverec2(dnc0,s,'db8');
figure,subplot(121),imshow(I2,[]),title('原始图像')
subplot(122),imshow(fnoisy,[]),title('加噪图像')
dnc2=wthresfunc(c,s,'soft',thr1c);
dnf2=waverec2(dnc2,s,'db8');
figure,imshow(dnf2,[]),title('软阈值函数')
VSf2=cacupsnr(dnf2,I2)
dnc1=wthresfunc(c,s,'upsoft',thr1c);
dnf1=waverec2(dnc1,s,'db8');
figure,imshow(dnf1,[]),title('改进软阈值函数')
VSf3=cacupsnr(dnf1,I2)
function y=wthresfunc(c,s,sorh,t)
%对图像分解小波高频系数进行阈值处理
cA3=appcoef2(c,s,'db8',3);
s1=size(cA3,1);s2=size(cA3,2);
s=s1*s2;
dnc=thrfunc(c,sorh,t);
dnc(1:s)=cA3(:);
y=dnc;
function y=thrfunc(x,sorh,t)
%阈值函数:选择不同的阈值函数对信号进行处理
switch sorh
case 'soft'%软阈值函数
tmp=(abs(x)-t);
tmp=(tmp+abs(tmp))/2;
y=sign(x).*tmp;
case 'upsoft'%软阈值函数改进
k=1;
tmp1=abs(x)-t+t/(2*k+1);
tmp2=x.^(2*k+1)/((2*k+1)*t^(2*k));
y=sign(x).*tmp1.*(abs(x)>=t)+tmp2.*(abs(x)<t);
otherwise
error('Invalid argument value.')
end
这个样子就好了 展开
2016-05-12
展开全部
1、设计GUI,应该说明一下要求,比如界面上有哪些要素、可进行哪些操作;
2、函数cacupsnr好像并不是MATLAB自带的。
2、函数cacupsnr好像并不是MATLAB自带的。
追问
function y=cacupsnr(f,g)
m=size(f,1);n=size(f,2);
d=f-g;
d=d.^2;r=g.^2;
mse=sum(d(:))/m/n;
snr=10*log10(sum(r(:))/m/n/mse);
y.SNR=snr;
这个函数我开始想着无关紧要就没贴出来
追答
1、那个函数的确与GUI没什么关系,但既然代码里出现了,应该给出代码才完整。
2、按照你的要求,帮你做了一个GUI,请见附件。简单说明几点:
(1)从你给GUI示意看,其实就是要把程序的运行过程分成几个步骤,分别由各按钮的回调函数来调用。这样会带来一个问题:各步骤之间的某些变量是存在依赖关系的,如果分成多个回调函数,这些变量的值怎样传递?比较直接的做法是用全局变量,或者使用GUI的某些对象作为数据容器,我这里采用了另外一种做法。
(2)我的做法是,把你原来的代码仍集中在一个函数中,但分成几个部分,执行哪一部分由输入参数flag决定。各步骤之间需要公用的数据定义为静态变量(persistent),可以保证多次调用该函数时这几个变量的值可以保持。
(3)把代码分成多个部分后,会导致有些操作存在顺序问题,例如,加载图像之前,是无法进行后续操作的,所以,根据各步骤的逻辑关系,在进行部分操作后,改变某些按钮的状态(Enable属性)。
(4)GUI上各控件和坐标系的tag懒得修改了,就用默认的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询