声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1140|回复: 0

[图像处理] 计算巴特沃斯去噪为何一直有错

[复制链接]
发表于 2012-5-15 11:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x

i=imread('kids.tif');

%--------------------------------------------------------------------------
%为源图像加上高斯噪声
ii=imnoise(i,'gaussian',0,0.01);
imwrite(ii,'kids,tif','tiff');

i1=im2double(i);
ii1=im2double(ii);
%--------------------------------------------------------------------------
%计算去噪前的PSNR值
[m,n]=size(i);
err=0;
sum=0;
for i=1:m,
    for j=1:n,
        err=err+(i1(i,j)-ii1(i,j))*(i1(i,j)-ii1(i,j));
        sum=sum+i1(i,j)*i1(i,j);
    end
end
psnr=err/sum;
psnr_before_noisedelete=-10*log10(psnr)
PSNR1=num2str(psnr_before_noisedelete);


I=double(i)/255;                        % 数值转换
fftI=fft2(I);                            % 二维离散傅立叶变换
sfftI=fftshift(fftI);                       % 直流分量移到频谱中心
i_real=real(sfftI);                       % 取傅立叶变换的实部
i_imag=imag(sfftI);                     % 取傅立叶变换的虚部
A=sqrt(i_real.^2+i_imag.^2);              % 计算频谱幅值
AA=uint8(A);                          % 数值转换
            
                       
II=double(ii)/255;                       % 将位型图转换为浮点型
fftII=fft2(II);                           % 二维离散傅立叶变换
sfftII=fftshift(fftII);                      % 直流分量移到频谱中心
ii_real=real(sfftII);                      % 取傅立叶变换的实部
ii_imag=(sfftII);                        % 取傅立叶变换的虚部
B=sqrt(ii_real.^2+ii_imag.^2);             % 计算频谱幅值
BB=uint8(B);                           % 转换为位型,以供显示

[p,q]=size(sfftII);                        % 巴特沃斯低通滤波器的设计
D0=10;                                % 截断频率D0的选取
n=2;                                  % 巴特沃斯低通滤波器的阶数(1阶)
for j=1:p
    for k=1:q
        D(j,k)=sqrt((j-128).^2+(k-128).^2);
    end
end
H=1./(1+(D/D0).^(2*n));                   % 转移函数H的计算
H=complex(H,0);  
III=sfftII.*H;
BBB=ifftshift(III);                        % 直流分量从频谱中心移到原始位置
BBBB=ifft2(BBB);                       % 二维离散傅立叶反变换
BBBBB=uint8(BBBB*255);                % 数值复原                  
imwrite(BBBBB,'kids.tif','tiff');

[m,n]=size(i1);
err=0;
sum=0;
for i=1:m,
    for j=1:n,
        err=err+(i1(i,j)-BBBBB(i,j))*(i1(i,j)-BBBBB(i,j));
        sum=sum+i1(i,j)*i1(i,j);
    end
end
psnr=err/sum;
psnr_before_noisedelete=-10*log10(psnr)
PSNR2=num2str(psnr_before_noisedelete);


clf;
subplot(2,2,1),imshow(i);title('原始图像');
subplot(2,2,2),imshow(ii);title('加入高斯噪声后图像');xlabel(['PSNR=',PSNR1]);
subplot(2,2,3),imshow(BBBBB);title('巴特沃斯');xlabel(['PSNR=',PSNR2]);

错误提示:Complex integer arithmetic is not supported.
Error in ==> butterworth at 64
        err=err+(i1(i,j)-BBBBB(i,j))*(i1(i,j)-BBBBB(i,j));
它说不支持复杂的整数运算,求大侠们帮忙看看。。感谢万分!
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 09:57 , Processed in 0.053117 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表