• 图像处理第三章笔记


    函数

    1.二维离散傅里叶变换的实现:F=fft2(f)

    填充时:F=fft2(f,P,Q)

    傅里叶谱|F|:S=abs(F)

    例子1:

    >> f=imread('Fig0303(a).tif');

    >> F=fft2(f);

    >> S=abs(F);

    >> imshow(f) , title('原图');

    >>figure, imshow(S,[]), title('频谱图');

    >> S2=log(1+abs(Fc));

    >> imshow(S2,[]),title('对数变换后的频谱图')

    MATLAB中,频率中心坐标 : (floor(M/2)+1,floor(N/2)+1)

     

    2.把原点移动到频率矩阵的中心:Fc=fftshift(F)

    例子2:接着例子1

    >> Fc=fftshift(F);

    >> imshow(abs(Fc),[])

    3.ifftshift函数将居中结果反转

    >> F=ifftshift(Fc)

     

    4.实现傅里叶反变换:f=ifft2(F)

    注 fft2(f)直接把图f无缩放变换成double型.再ifft2变回f时是数值与原f一样类型是double的结果,这样有可能由于截断造成问题,故先把f用tofloat转成single型,再fft2,ifft2,再转换成原f的类型.避开类型造成的截断问题.

    理论上ifft2后应该是实数,但是由于计算误差,会带有虚部,故提取反变换的实数部分即可.f=real(ifft2(F));

     

    5.Paddedsize函数:填充函数

    例子3:有和没有填充的滤波效果

    无填充

    f=imread('Fig0305(a).tif');

    [M,N]=size(f);

    [f,revertclass]=tofloat(f);

    F=fft2(f);

    sig=10;

    H=lpfilter('gaussian',M,N,sig);

    G=H.*F;

    g=ifft2(G);

    g=revertclass(g);

    figure,imshow(f);figure,imshow(g);

    有填充:

    f=imread('Fig0305(a).tif');

    [f,revertclass]=tofloat(f);

    PQ=paddedsize(size(f)); %计算填充的大小

    Fp=fft2(f,PQ(1),PQ(2));

    sig=10;

    Hp=lpfilter('gaussian',PQ(1),PQ(2),2*sig);

    Gp=Hp.*Fp;

    gp=ifft2(Gp);

    gpc=gp(1:size(f,1),1:size(f,2));

    gpc=revertclass(gpc);

    imshow(gp)figure,imshow(gpc)

    6.DFT滤波的基本步骤

    1.转换图像为浮点图像 tofloat

    2.用paddedsize获得填充参数

    3.得到有填充参数的傅里叶变换

    4.用频率域中一大小为的滤波传递函数(非居中格式,若为居中,则先移动ifftshift)

    5.用滤波传递函数️第3步的傅里叶变换

    6.逆傅里叶变换

    7.取6结果左上部(大小与原图像未填充前一致)

    8. 若有需要,将7的到结果转换成原输入图像的类型

     

    7.dftfilt函数:将DFT滤波的基本步骤封装在这个函数里

    function g = dftfilt(f, H, classout)
    [f, revertClass] = tofloat(f);

    F = fft2(f, size(H, 1), size(H, 2));

    g = ifft2(H.*F);

    g = g(1:size(f, 1), 1:size(f, 2));

    if nargin == 2 || strcmp(classout, 'original')

    g = revertClass(g);

    elseif strcmp(classout, 'fltpoint') % g is floating point already.

    return

    else

    error('Undefined class for the output image.')

    end

     

    8.dftuv(M,N)函数:创建用于实现频率域滤波器的网格数组

    function [U,V]=dftuv(M,N)

    u=single(0:(M-1));

    v=single(0:(N-1));

    idx=find(u>M/2);

    u(idx)=u(idx)-M;

    idy=find(v>N/2);

    v(idy)=v(idy)-N;

    [V,U]=meshgrid(v,u);

     

    9.理想低通滤波器

    例子:

    结果显示:

     

    10、巴特沃斯低通滤波器

    例子:

    结果显示:

     

    11、高斯低通滤波器

    例子:

    结果显示:

     

    12、lpfilter函数:生成低通滤波器的传递函数,即封装三种滤波器的代码

    pe类型---'ideal' 、'btw' 、'gaussian'

    大小----M*N

    D0-----截止频率

    n------巴特沃斯滤波器所带参数

     

    13、高通(锐化)频率域滤波器

    若给定低通滤波器的传递函数为 则相应高通滤波器的传递函数为

    function H = hpfilter(type, M, N, D0, n)

    %生成高通滤波传递函数H

    %type—'ideal', 'btw', 'gaussian'

    if nargin == 4

    n = 1; % n的默认值.

    end

    Hlp = lpfilter(type, M, N, D0, n);%低通滤波器

    H = 1 - Hlp;

    例子:

    结果显示:

     

    14、高频强调滤波

    例子:

    结果显示:

  • 相关阅读:
    IOS 使用CoreText实现表情文本URL等混合显示控件
    IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
    IOS 多级列表展开控件
    IOS 五星评分控件
    ios实现类似魔兽小地图功能 在
    Cocoa Foundation框架学习笔记 - NSCalendar
    lua通过bunlde读注意事项
    unity手游之聊天SDK集成与使用二
    unity手游之聊天SDK集成与使用一
    unity3d引擎程序员养成
  • 原文地址:https://www.cnblogs.com/panqiaoyan/p/13095196.html
Copyright © 2020-2023  润新知