精华内容
下载资源
问答
  • DFT数字图像处理

    2018-07-28 10:34:36
    lena图片的DFT、DCT、IDCT处理,使用matlab工具,代码可靠运行
  • 数字图像处理-DFT&DCT&WHT&小波变换分解重构(Matlab)

    万次阅读 多人点赞 2020-10-19 14:42:02
    文章目录数字图像处理-DFT&DCT&WHT&小波变换分解重构(Matlab)基本的matlab图像处理函数的使用代码块运行效果傅里叶变换(DFT)对图像进行傅里叶正变换去除部分高频分量后对图像进行傅里叶逆变换离散余弦...

    数字图像处理-DFT&DCT&WHT&小波变换分解重构(Matlab)

    基本的matlab图像处理函数的使用

    函数 功能
    imread('图像名') 读取图像
    imshow(color_pic) 显示图像
    rgb2gray(color_pic) 将彩色图像转换成灰度图像
    imhist(gray_pic,n) 查看灰度图像的灰度直方图

    代码块

    %-----------------Matlab基本图像处理函数使用------------------
    clear ;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    figure('name','图像读取');   
    subplot(2,2,1);
    imshow(color_pic);   %显示图像
    title('原彩色图像');
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    subplot(2,2,2);
    imshow(gray_pic);
    title('灰度图像');
    subplot(2,2,3);
    imhist(gray_pic);   %查看灰度直方图,默认n=256,256个长度为1的灰度空间
    title('灰度直方图256等级');
    subplot(2,2,4);
    imhist(gray_pic,64);%n=6464个长度为4的灰度空间
    title('灰度直方图64等级');
    

    运行效果

    在这里插入图片描述

    傅里叶变换(DFT)

    对图像进行傅里叶正变换

    %------------------傅里叶变换------------------
    clear;  %清除变量
    close all; %关闭生成的画图窗口
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','傅里叶变换'); %傅里叶变换
    subplot(2,2,1);
    imshow(gray_pic);
    title('原灰度图像');
    Fourier=fft2(gray_pic);  %对灰度图像进行傅里叶正变换
    log_Fourier=log(abs(Fourier)+1); %取模并进行缩放,调高频谱图像的低灰度值而对高灰度值仅可能减小
    subplot(2,2,2);
    imshow(log_Fourier,[]);    %未进行频谱搬移时的频谱图
    title('傅里叶变换频谱图');
    Fourier_shift=fftshift(Fourier); %将频谱图中零频率成分移动至频谱图中心
    log_Fourier_shift=log(abs(Fourier_shift)+1); %取模并进行缩放,对于(01)之间的x值经过取对数后会变成负值,而log(x+1)则将所有的x值映射到正数范围内
    subplot(2,2,3);
    imshow(log_Fourier_shift,[]);
    title('频移后的频谱图');
    
    • 程序运行效果:

    在这里插入图片描述

    • 总结:
       在图像的傅里叶频谱中,原空间域图像上的灰度突变部位、图像结构复杂的区域、图像细节及干扰噪声等信息集中在高频区,原空间域图像上灰度变化平缓部位的信息(图像轮廓)集中在低频区。
       低频部分(图像轮廓)对应于未进行频移的傅里叶频谱的4个边角角部分,由于低频部分能量较集中,因而在频谱图上的视觉效果较亮。当进行频移后,低频部分移至频谱中央,中央处最亮。

    去除部分高频分量后对图像进行傅里叶逆变换

    %-----------------设置阈值滤除高频  傅里叶逆变换----------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    threshold=[100000,30000,5000,500];  %设置不同阈值 (高频部分能量低)
    figure('name','傅里叶逆变换图像');
    for i=1:4
        Fourier=fft2(gray_pic);  %对灰度图像进行傅里叶正变换
        Fourier_shift=fftshift(Fourier); %将频谱图中零频率成分移动至频谱图中心
        h_Fourier_shift=abs(Fourier_shift);% 取傅里叶变换后幅度模值,使灰度值为正数
        Fourier_shift(h_Fourier_shift<threshold(i))=0;  %取阈值消除部分高频
        IFourier=real(ifft2(ifftshift(Fourier_shift)));  %傅里叶逆变换,要记得先把频移的频谱频移回去
        ret=uint8(IFourier); %将灰度级映射到0-255上
        subplot(2,2,i);
        imshow(ret);
        str=num2str(threshold(i));
        title(['阈值:',str]);
    end
    
    • 程序运行效果:

    在这里插入图片描述

    • 总结:
       因为高频部分能量较低,即傅里叶变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

    离散余弦变换(DCT)

    对图像进行DCT正变换

    %----------------DCT变换------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','DCT变换'); 
    DCT=dct2(gray_pic);  %DCT变换
    h_DCT=abs(DCT);  %DCT变换后的幅度
    log_DCT=log(h_DCT);   %取模并进行缩放,调高频谱图像的低灰度值而对高灰度值仅可能减小
    imshow(log_DCT,[]);
    title('DCT变换');
    colormap(gray(4));  %重新设置灰度级为4,便于查看DCT变换后的频谱图特点
    colorbar;   %显示颜色栏
    
    • 程序运行效果:

    在这里插入图片描述

    • 总结:
        从DCT频谱图易看出,低频部分(图像轮廓)能量集中在左上角,因此可进行图像压缩。

    去除部分高频分量后对图像进行DCT逆变换

    %----------------取阈值去除高频分量 DCT逆变换------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    threshold=[200,100,10,1];  %设置不同阈值 (高频部分能量低)
    for i=1:4
        DCT=dct2(gray_pic); %DCT正变换
        h_DCT=abs(DCT);  %DCT变换后的幅度
        DCT(h_DCT<threshold(i))=0;  %DCT变换后取模得出的幅度值若小于20则至0
        IDCT=uint8(idct2(DCT));  %对图像进行DCT逆变换,并将灰度级映射到0-255上
        subplot(2,2,i);
        imshow(IDCT);
        str=num2str(threshold(i));
        title(['阈值:',str]);
    end
    
    • 程序运行效果:

    在这里插入图片描述

    • 总结:
       因为高频部分能量较低,即DCT变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

    沃尔什哈达玛变换(WHT)

    对图像进行WHT正变换

    %------------------沃尔什哈达玛变换------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','沃尔什哈达玛'); 
    subplot(2,2,1);
    imshow(gray_pic);
    title('原灰度图像');    %imread读入源图像为三维,所以不能进行D=A*X*A
    im2double_gray_pic=im2double(gray_pic);%必须对读取的图像做I=im2double(I),函数im2double 将其值归一化到01之间
    Hada=hadamard(512); %生成512x512哈达玛矩阵
    Hada_pic=Hada*(im2double_gray_pic)*Hada;
    Hada_pic2=Hada_pic/512;  %沃尔什哈达玛变换记得/(N*N=512*512),此处只除512是为了频谱图效果好看
    subplot(2,2,2);
    imshow(Hada_pic2);
    title('沃尔什哈达玛变换');
    
    • 程序运行效果:

    在这里插入图片描述

    去除部分高频分量后对图像进行WHT逆变换

    %----------------取阈值去除高频分量 沃尔什哈达玛逆变换------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    im2double_gray_pic=im2double(gray_pic);%必须对读取的图像做I=im2double(I),函数im2double 将其值归一化到01之间
    Hada=hadamard(512);%生成512x512哈达玛矩阵
    Hada_pic=Hada*(im2double_gray_pic)*Hada;
    threshold=[0.5,0.3,0.2,0.1];  %设置不同阈值 (高频部分能量低)
    for i=1:4
        Hada_pic2=Hada_pic/(512);  %沃尔什哈达玛变换记得/(N*N=512*512),此处只除512是为了频谱图效果好看
        h_Hada=abs(Hada_pic2);
        Hada_pic2(h_Hada<threshold(i))=0; %取阈值消除部分高频
        IHada_pic=Hada'*Hada_pic2*Hada';% Hada'是Hada的转置矩阵
        IHada_pic2=im2uint8(IHada_pic/512); %将灰度级转换为255级,否则灰度值大于255,图像太亮,呈现一片白
        subplot(2,2,i);
        imshow(IHada_pic2);
        str=num2str(threshold(i));
        title(['阈值:',str]);
    end;
    
    • 程序运行效果:

    在这里插入图片描述

    • 总结:
       因为高频部分能量较低,即WHT变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

    小波分解重构

    一级小波分解

    %-------------------小波变换一级分解,小波基函数选db4-----------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','小波变换一级分解');
    [c,s]=wavedec2(gray_pic,1,'db4'); %小波一级分解,小波基函数采用db4
    ca1=appcoef2(c,s,'db4',1);   %低频分量
    ch1=detcoef2('h',c,s,1);     %高频水平分量
    cv1=detcoef2('v',c,s,1);     %高频垂直分量
    cd1=detcoef2('d',c,s,1);     %高频对角分量
    subplot(2,2,1);imshow(ca1,[]);title('LL1');
    subplot(2,2,2);imshow(ch1,[]);title('HL1');
    subplot(2,2,3);imshow(cv1,[]);title('LH1');
    subplot(2,2,4);imshow(cd1,[]);title('HH1');
    
    • 程序运行效果:

    在这里插入图片描述

    一级小波重构

    %-------------------小波变换一级重构,小波基函数选db4-----------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','小波变换一级重构');
    [c,s]=wavedec2(gray_pic,1,'db4'); %小波一级分解,小波基函数采用db4
    re_ca1=wrcoef2('a',c,s,'db4',1); %重建第一层低频分量系数
    re_ch1=wrcoef2('h',c,s,'db4',1); %重建第一层高频水平分量系数
    re_cv1=wrcoef2('v',c,s,'db4',1); %重建第一层高频垂直分量系数
    re_cd1=wrcoef2('d',c,s,'db4',1); %重建第一层高频对角分量系数
    re_set1=[re_ca1,re_ch1;re_cv1,re_cd1];  %将各个分量图像拼接在一张图像
    subplot(1,2,1);imshow(re_set1,[]);title('第一层小波系数的重构');
    re_img1=re_ca1+re_ch1+re_cv1+re_cd1;%将各个分量合并复原
    subplot(1,2,2);imshow(re_img1,[]);title('一级重构图像');
    
    • 程序运行效果:

    在这里插入图片描述

    二级小波分解

    %-------------------小波变换二级分解,小波基函数选db4)-----------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','小波变换二级分解');
    [c,s]=wavedec2(gray_pic,2,'db4'); %小波二级分解
    %小波一级分解分量
    ca1=appcoef2(c,s,'db4',1);   %低频分量
    ch1=detcoef2('h',c,s,1);     %高频水平分量
    cv1=detcoef2('v',c,s,1);     %高频垂直分量
    cd1=detcoef2('d',c,s,1);     %高频对角分量
    %显示第1级分解各分量
    subplot(4,4,[3,4,7,8]);imshow(ch1,[]);title('HL1');
    subplot(4,4,[9,10,13,14]);imshow(cv1,[]);title('LH1');
    subplot(4,4,[11,12,15,16]);imshow(cd1,[]);title('HH1');
    %提取第2层的各分量
    ca2=appcoef2(c,s,'db4',2);   %低频分量
    ch2=detcoef2('h',c,s,2);     %高频水平分量
    cv2=detcoef2('v',c,s,2);     %高频垂直分量
    cd2=detcoef2('d',c,s,2);     %高频对角分量
    %显示第2级分解各分量
    subplot(4,4,1);imshow(ca2,[]);title('LL2');
    subplot(4,4,2);imshow(ch2,[]);title('HL2');
    subplot(4,4,5);imshow(cv2,[]);title('LH2');
    subplot(4,4,6);imshow(cd2,[]);title('HH2');
    
    • 程序运行效果:

    在这里插入图片描述

    二级小波重构

    %-------------------小波变换2级重构,小波基函数选db4-----------------------
    clear;
    close all;
    color_pic=imread('lena512color.bmp');  %读取图像
    gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
    figure('name','小波变换二级重构');
    [c,s]=wavedec2(gray_pic,2,'db4'); %小波二级分解
    re_ca2=wrcoef2('a',c,s,'db4',2);  %重建第二层低频分量系数
    re_ch2=wrcoef2('h',c,s,'db4',2);  %重建第二层高频水平分量系数
    re_cv2=wrcoef2('v',c,s,'db4',2);  %重建第二层高频垂直分量系数
    re_cd2=wrcoef2('d',c,s,'db4',2);  %重建第二层高频对角分量系数
    re_set2=[re_ca2,re_ch2;re_cv2,re_cd2]; %将各个分量图像拼接在一张图像
    subplot(1,2,1);imshow(re_set2,[]);title('第二层小波系数的重构');
    re_img2=re_ca2+re_ch2+re_cv2+re_cd2; %将各个分量合并复原
    subplot(1,2,2);imshow(re_img2,[]);title('二级重构图像');
    
    • 程序运行效果:

    在这里插入图片描述

    展开全文
  • DFT/数字图像处理

    2019-01-05 01:34:21
    DFT相关和对通过应用MATLAB对图像加噪声并进行处理 通过应用 fft 函数对原序列进行变换,并调整 N 值,观察不同 N 值的结果图 像,在做出对比后,保证 N 值不变,再分别确保 f1 和 f2 不变,改变另一个参数, 观察...
  • 图像处理 二维离散傅里叶变换DFT matlab代码图像处理领域离散傅里叶变换的作用二维离散傅里叶变换二维离散傅里叶变换公式将二维的离散傅里叶变换进行转化将系数转化为矩阵形式注意,从矩阵的乘积i形式可以看出,原来...

    图像处理领域离散傅里叶变换的作用

    将图像由时空域,转换为频域

    二维离散傅里叶变换

    二维离散傅里叶变换公式

    二维离散傅里叶变换公式

    将二维的离散傅里叶变换进行转化

    将不好处理的二维离散傅里叶变换转化为进行两次一维处理
    先处理行,再处理列
    二维离散傅里叶转化为两次一维处理
    公式如下:
    二维离散傅里叶变换公式

    将系数转化为矩阵形式

    在这里插入图片描述

    注意,从矩阵的乘积i形式可以看出,原来是N个值,输出后依然是N个值,而且要注意,输出的N个值的每一个值和输入得每一个值都有关系。换句话说,输出的F(0),F(1),F(2)…F(N),之中的每一个值,比如F(1),都需要,输入的所有值做贡献。
    f(x)的全部值对离散的傅氏变换四项中的每一项都产生影响。反之亦然。

    所以按照刚才将维的思路,进行矩阵的操作。
    权值矩阵A,原函数矩阵FF

    采用88的DFT操作,对每一个88图像块,进行一次操作

    matlab代码

    N=8;
    A=zeros(N);
    for k=0:N-1
        for m=0:N-1
            A(k+1,m+1)=(1/N)*exp(-2*pi*i*(k*m/N));%8*8的 w 的矩阵
        end
    end
    
    [Hh,Hw]=size(WYY);
    X=ceil(Hw/8)*8;
    Y=ceil(Hw/8)*8;
    hall_new=zeros(X,Y);
    hall_new(1:Hh,1:Hw)=WYY;%把Y分量赋值进去
    %hall_new(Hh+1:X,1:Hw)=repmat(WYY(Hh,1:Hw),X-Hh,1);
    %hall_new(1:Hh,Hw+1:Y)=repmat(WYY(1:Hh,Hw),1,Y-Hw);
    m=X/8;%行块数
    n=Y/8;%列块数
    for i1=1:m
         for i2=1:n
             FF=double(hall_new((i1-1)*8+1:i1*8,(i2-1)*8+1:i2*8));%按顺序取8*8的每一块
             BB((i1-1)*8+1:i1*8,(i2-1)*8+1:i2*8)=N*A*FF*A';%DFT变换,变成两次一维度处理,另一个函数,先处理一行,一行的8个值都会产生影响,以行和列为整体看
             KK((i1-1)*8+1:i1*8,(i2-1)*8+1:i2*8)=A'*BB((i1-1)*8+1:i1*8,(i2-1)*8+1:i2*8)*A;%DFT反变换
         end
    end
    

    未完待续

    展开全文
  • 傅里叶变换,是图像处理中的一个重要内容,频率域处理的操作都要建立在傅里叶变换的基础上,所以作为这个专栏的开篇,不如就简单介绍和实现一下离散傅里叶变换(DFT)。 一、傅里叶级数和变换 法国数学家傅里叶...

    上学期修了数字图像处理这门课程,想着正好趁这个机会写(shui)几篇文章,告诉自己没有白学。傅里叶变换,是图像处理中的一个重要内容,频率域处理的操作都要建立在傅里叶变换的基础上,所以作为这个专栏的开篇,不如就简单介绍和实现一下离散傅里叶变换(DFT)。


    一、傅里叶级数和变换

    法国数学家傅里叶提出,任何周期函数都可表示为不同频率的正弦函数和/或余弦函数之和,其中每个正弦函数和/或余弦函数都要乘以不同的系数,这个和就称为傅里叶级数。按照这个思想,周期为T的连续变量t的周期函数f(t),可表示为乘以适当系数的正弦函数和余弦函数之和,即

    f(t)=\sum_{n=-\infty }^{\infty }c_{n}e^{j\tfrac{2\pi n}{T}t},系数为

    c_{n}=\frac{1}{T}\int_{-T/2}^{T/2}f(t)e^{-j\tfrac{2\pi n}{T}t}dt, n=0,\pm 1,\pm 2,...

    另外根据欧拉公式有e^{j\theta }=cos\theta+jsin\theta,所以上述式子便可展开为正弦函数和余弦函数之和(其中涉及到复数的知识请读者自行了解,这里不作过多说明)。

    而一些(曲线下方面积有限的)非周期函数也能用正弦函数和/或余弦函数乘以加权函数的积分来表示。这种情况下的公式就是傅里叶变换,其在许多理论和应用科学中起到非常大的作用。连续单变量函数的傅里叶变换和反变换表示为

    \left\{\begin{matrix} F(\mu )=\int_{-\infty }^{\infty }f(t)e^{-j2\pi \mu t}dt\\ \\ f(t) =\int_{-\infty }^{\infty }F(\mu)e^{j2\pi \mu t}d\mu \end{matrix}\right.

    上述两个式子共同构成傅里叶变换对,可以表示为f(t)\Leftrightarrow F(\mu)

    同样,令f(t,z)是两个连续变量tz的连续函数,则其二维连续傅里叶变换对为

    \left\{\begin{matrix} F(\mu,\nu )=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}f(t,z)e^{-j2\pi (\mu t+\nu z)}dtdz \\ \\f(t,z)=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}F(\mu,\nu)e^{j2\pi (\mu t+\nu z)}d\mu d\nu \end{matrix}\right.

    二、离散傅里叶变换(DFT)

    有了上一节中所讲的数学基础,我们这里直接给出离散傅里叶的变换对

    \left\{\begin{matrix} F(u)=\sum_{x=0}^{M-1}f(x)e^{-j2\pi ux/M}, u=0,1,2,...,M-1\\ \\ f(x)=\frac{1}{M} \sum_{x=0}^{M-1}F(u)e^{j2\pi ux/M},x=0,1,2,...,M-1 \end{matrix}\right.

    将式子与连续形式的傅里叶变换进行对比,应该是容易理解的。有时,我们也会发现有的公式把1/M放在了第一个式子中,这并不会影响两个公式形成一个傅里叶变换对。此外在实现的时候,为了方便我们通常将DFT公式写成下面这种形式

    \left\{\begin{matrix} F(u)=\sum_{x=0}^{M-1}f(x)W_{M}^{ux}, u=0,1,2,...,M-1\\ \\f(x)=\frac{1}{M} \sum_{x=0}^{M-1}F(u)W_{M}^{-ux},x=0,1,2,..,M-1 \end{matrix}\right.

    W_{M}=e^{-j2\pi /M}

    若用矩阵计算的形式表达上面这个过程,就是

    \begin{bmatrix} F(0)\\ F(1)\\ F(2)\\ ...\\ F(M-1) \end{bmatrix}=\begin{bmatrix} W_{M}^{0} &W_{M}^{0} &W_{M}^{0} &... &W_{M}^{0} \\ W_{M}^{0}&W_{M}^{1} &W_{M}^{2} &... &W_{M}^{M-1} \\ W_{M}^{0}& W_{M}^{2} &W_{M}^{4} &... &W_{M}^{2(M-1)} \\ ...& ... &... & ... &... \\ W_{M}^{0}&W_{M}^{M-1} & W_{M}^{2(M-1)} & ...& W_{M}^{(M-1)^{2}} \end{bmatrix}\begin{bmatrix} f(0)\\ f(1)\\ f(2)\\ ...\\ f(M-1) \end{bmatrix}

    综上,给出一维DFT的实现过程如下。

    #一维离散傅里叶变换
    def dft(f):
        #得到长度
        M = f.shape[0]
        
        #计算变换矩阵
        x, y = np.mgrid[0:M, 0:M]
        w = x * y
        base = np.exp(-1j*2*np.pi/M)
        W = base**w
        
        #矩阵相乘计算结果
        F = np.dot(W, f)
        return F

    三、二维DFT及其可分离性

    类似于一维DFT,我们也可得到如下的二维离散傅里叶变换对

    \left\{\begin{matrix} F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi (ux/M+vy/N)},u=0,1,2,...,M-1,v=0,1,2,...,N-1\\ \\ f(x,y)=\frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{j2\pi (ux/M+vy/N)} ,x=0,1,2,...,M-1,y=0,1,2,...,N-1\end{matrix}\right.

    接下来我们对正变换进行化简,可得

    F(u,v)=\sum_{x=0}^{M-1}e^{-j2\pi ux/M}\sum_{x=0}^{N-1}f(x,y)e^{-j2\pi vy/N}=\sum_{x=0}^{M-1}F(x,v)e^{-j2\pi ux/M}

    F(x,v)=\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi xy/N}

    上述过程可以看到,f(x,y)的二维DFT可通过计算f(x,y)的每一行的一维变换,然后沿计算结果的每一列计算一维变换来得到。也就是说二维DFT通过多次一维DFT计算即可得到,参考下面实现过程。

    #二维离散傅里叶变换
    def dft_2d(f):
        #得到输入的行数和列数
        M, N = f.shape[0], f.shape[1]
        
        #初始化两个复数类型数组,用于保存结果
        F, F_x = np.zeros(shape=(M,N), dtype=np.complex128), np.zeros(shape=(M,N), dtype=np.complex128)
        
        #逐行逐列进行两次一维傅里叶变换
        for i in range(M):F_x[i,:] = dft(f[i,:])
        for i in range(N):F[:,i] = dft(F_x[:,i])
        
        return F

    四、使用DFT算法计算IDFT

    我们将二维离散傅里叶反变换过程两边取复共轭,并将得到的结果乘以MN

    MNf^{*}(x,y)=\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F^{*}(u,v)e^{-j2\pi (ux/M+vy/N)}

    然后,我们可以发现上式的右侧是F^{*}(u,v)的DFT。这告诉我们,若把F^{*}(u,v)代入计算二维傅里叶正变换的算法中,则结果将是MNf^{*}(x,y)。所以将这个结果取复共轭并乘以1/MN就可以得到f(x,y),就是我们想要的反变换,实现过程如下。

    #二维离散傅里叶反变换
    def idft_2d(F):
        #得到行数和列数
        M, N = F.shape[0], F.shape[1]
        
        #先对F的共轭进行正向离散傅里叶变换,除以常数后再取共轭
        f = np.conjugate(dft_2d(np.conjugate(F)))/M/N
        
        return f

    五、傅里叶变换中心化

    可以证明,一维正离散变换和反离散变换都是无限周期的,周期为M,即

    \left\{\begin{matrix} F(u)=F(u+kM)\\ \\ f(x) = f(x+kM) \end{matrix}\right.

    如一维情况那样,二维傅里叶变换及其反变换在u方向和v方向是无限周期的,即

    \left\{\begin{matrix} F(u,v)=F(u+k_{1}M,v)=F(u,v+k_{2}N)=F(u+k_{1}M,v+k_{2}N)\\ \\ f(x,y)=f(x+k_{1}M,y)=f(x,y+k_{2}N)=f(x+k_{1}M,y+k_{2}N) \end{matrix}\right.

    周期性在实现基于DFT的算法中很重要。区间0M-1上的变换数据由在点M/2处相遇的两个半周期组成,但该周期的较低部分出现在较高的频率处。针对显示和滤波的目的,在该区间内有一个数据连续并且正确排序的完整变换周期更为方便。也就说我们需要先将F(u,v)变换到F(u-M/2,v-N/2),方便我们进一步操作,下图显示了一维和二维情况下的这个过程。

    图1 冈萨雷斯原书中关于一维和二维傅里叶变换中心化的说明

    下面用代码实现了中心化和逆中心化的过程。

    #中心化
    def fshift(F):
        #两个轴平移半个周期
        M, N = F.shape[0], F.shape[1]
        F = np.roll(F, int(N/2), axis=0)
        F = np.roll(F, int(M/2), axis=1)
        
        return F
    
    #去中心化
    def ifshift(F):
        #两个轴平移半个周期
        M, N = F.shape[0], F.shape[1]
        F = np.roll(F, -int(N/2), axis=0)
        F = np.roll(F, -int(M/2), axis=1)
        
        return F

    六、效果展示

    首先,我们使用DFT得到图片的频率域,然后展示其频谱图。方法是先得到变换后结果的模长,然后使用log函数将其映射到图片可表示的范围。

    #图像频谱
    def fimage(img):
        return np.log(np.abs(img))
    图2 (a)原图;(b)使用自己完成的DFT函数变换得到频谱图;
    (c)使用自己完成的DFT函数和中心化函数变换得到的频谱图;
    (d)使用numpy包中FFT函数和中心化函数变换得到的频谱图。

     接下来是将自己完成的函数和numpy包中函数混用的情况,从结果上看基本没有差别,可以认为实现效果还不错。

    图3 (a)原图;
    (b)使用自己实现的函数进行正变换后使用numpy包中的函数进行反变换;
    (c)使用numpy包中的函数进行正变换后使用自己实现的函数进行反变换。

     七、多说两句

    这篇文章参考《冈萨雷斯 数字图像处理(第四版)》,只是对书中核心内容进行了总结并加以实现,未涉及到的细节可见原著。

    展开全文
  • DFT及HF的实现 1 DFT(离散傅里叶变换)的实现 1.1 DFT(离散傅里叶变换)的定义及原理 对于基于图像的傅里叶变换(二维离散傅里叶变换)的过程如下:首先对于每一行都做一维的...这样大小为MN的图像经过DFT就得到了一

    DFT及HF的实现

    1 DFT(离散傅里叶变换)的实现

    1.1 DFT(离散傅里叶变换)的定义及原理

    对于基于图像的傅里叶变换(二维离散傅里叶变换)的过程如下:首先对于每一行都做一维的傅里叶变换,然后对于每一列做一维的傅里叶变换。具体来说,先对于第1行的N个点做傅里叶变换(实部有值,虚部为0),将变换输出的实部放回原来第1行的实部,将输出的虚部放回第1行的虚部,这样计算完成全部的行之后,图像的实部和虚部包含的是中间数据,然后用相同的办法进行列方向上的相同的傅里叶变换,这样大小为MN的图像经过DFT就得到了一个MN的频谱(图片)。同时,根据快速傅里叶变换的计算要求,需要图像的行数、列数均满足2的n次方,如果不满足,在计算傅里叶变换之前先要对图像补零以满足2的n次方的要求。
    对于一个M*N的图像f(x,y),其二维离散傅里叶变化(DFT)公式如下:
    在这里插入图片描述
    实际的计算中,我们将上式分解为以下的两部分进行计算,先计算F(x,v),再由其计算得到最终的F(u,v):
    在这里插入图片描述

    1.2 DFT(离散傅里叶变换)的代码实现

    按照1.1小节的流程使用python进行代码的编写,具体代码见附件中的DFT_mself.py文件。主要流程是:1.计算变换矩阵;2.将赋值取对数加一;3.将对数频谱进行中心化。

    1.3 实验结果

    本小节对于所有的4张图片进行DFT变换,并将自己编写的DFT结果与python中numpy库中自带的二维傅里叶变换函数np.fft.fft2的结果进行比较。通过观察,我自己的编写的DFT函数的结果和numpy中自带的函数的FFT结果的效果几乎完全相同。其具体的实验结果如下:
    图片一结果:
    在这里插入图片描述
    通过观察可以发现,经过傅里叶变换后,频域图的中间有一条很亮的竖线,其在原图中代表着水平方向的纹理,由于水平方向的纹理较强(但是较稀疏),所以频域中的竖线较亮;在频域图的水平方向有三条比较亮的线,其对应着原图竖直方向的几条亮线。
    图片二结果:
    在这里插入图片描述
    通过观察可以发现,图二的竖直方向的纹理相比于图一来说更强更密集,而且分布更广,所以在频域图中的水平方向显示出来的亮度以及幅值都相比于图一更强。 在原图的水平方向的纹理没有图片一那么明显,所以在频域中的竖直方向幅值更低且分布的较为集中。
    图片三结果:
    在这里插入图片描述
    因为在频谱图中,中心点代表着图片的原图的低频特征,或者说是,图片的灰度值变化较慢。所以在频谱图中相对于图片一和图片二,图片三的中间区域的亮度较高。仔细观察也可发现,在频谱图的中心附近的上下左右分别有一个点,在水平与竖直方向也分别有线,其对应于原图的黑白边缘的过渡部分。
    图片四结果:
    在这里插入图片描述
    因为图片四的纹理较前三张图片较为复杂。所以在整个频谱图中的亮度较为均匀,在中心的亮度不是非常的突出,没有什么较为明显的特征。
    通过实验可知,傅里叶变换系数靠近中心描述的是图像中慢变化的特性,或者说灰度变化比较缓慢的特性(频率比较慢的部分);傅里叶变换系数远离中心描述的是图像中快变化的特性,或者说灰度变换比较剧烈的特性(频率比较快的部分);频谱中水平方向的亮度(幅值),对应于原图中竖直方向的纹理变化;频谱中竖直方向的亮度(幅值),对应于原图中水平方向的纹理变化。

    2 同态滤波的实现

    2.1 同态滤波的定义及原理

    同态滤波有一大作用是图像增强,其可以较好的去除乘性噪声,同时增加对比度以及标准化亮度,借此达到图像增强的目的。一副图像可以表示为其照度(illumination)分量和反射(reflectance)分量的乘积,虽然在时域上这两者是不可分离的,但是经由傅立叶转换两者在频域中可以线性分离。由于照度可视为环境中的照明,相对变化很小,可以看作是图像的低频成分;而反射率相对变化较大,则可视为高频成分。通过分别处理照度和反射率对像元灰度值的影响,通常是借由高通滤波器(high-pass filter),让图像的照明更加均匀,达到增强阴影区细节特征的目的。
    其过程为,先将原图取对数并进行傅里叶变换变到频域中,在频域中与滤波函数相乘(这里滤波函数作用到还没有进行中心化的DFT上),再将结果进行傅里叶逆变换并取指数。同态的性质就是保持相关的属性不变,而同态滤波的好处是将原本复杂的运算转为效能相同但相对简单的运算。其整体流程如下图:
    在这里插入图片描述
    对于其中的滤波函数,对于此实验我们在图片一中使用了低通滤波函数降低高频亮度对于图片的影响;在图片二中使用了高通滤波函数进行图片的增强。

    2.2 同态滤波的代码实现

    按照2.1小节的流程使用python进行代码的编写,具体代码见附件中的hf_mself.py文件。主要流程是:1.原图取对数;2.进行傅里叶变换;3.在频谱中与滤波函数相乘进行滤波;4.进行傅里叶逆变换;5.取指数得到最终的结果。

    2.3 实验结果

    本小节对于所有两张图片进行同态滤波,其具体的实验结果如下:
    图片一结果:
    在这里插入图片描述
    在这里插入图片描述
    这里通过滤波,将整体的图像变暗,相比于原图,更好的突出了手指部分的纹理细节。通过观察滤波前和滤波后的频谱图(没有中心化),可以发现四角的区域(为低频区域,因为没有中心化)经过滤波后幅值变小,这样即在原图中减少了亮度。
    图片二结果:

    在这里插入图片描述
    在这里插入图片描述
    图片二通过滤波,将图片进行了亮度增强。将原图右上角的黑暗部分“显示”了出来。通过对比滤波前后的频谱图,可以发现在高频处的幅值有明显的提高,即增加了原图片的亮度,从而达到了比较好的效果。

    2.4 使用自己的DCT函数与自带FFT函数的结果对比

    在这里插入图片描述
    通过观察,相同的图片和滤波函数,我自己的DCT相比较于numpy自带的fft2函数,效果基本一致。只是我自己的DCT函数处理后的图片亮度会高一些,这可能与离散傅里叶变换和快速傅里叶变换本身的算法有关,总体来说实现了相同的结果。

    展开全文
  • DFT的matlab源代码图像处理基础 每天的课程计划 (该材料也可在每章的课程中找到) Class 01 Tue 11-Aug-2020: 0.1级的视频 0.1课程 0.1课程介绍 1.1-定义 班02周四。 2020年8月13日: 1.1-此类的视频 1.1-图像处理...
  • DFT的matlab源代码包括数字图像处理 数字图像处理实验1 2 3 4 实验1:从bmp图像读取二进制数据。 实验2:DCT,IDCT和DFT,IDFT的实现。 实验3:使用Haar Wave实现GaussianFilter,MeanFilter,MedianFilter,Sobel...
  • OpenCV计算机视觉图像频域傅里叶 DFT 变换低通滤波逆变换IDFT 实验室做图像的,经常用到这部分,为了检测屏幕,看过好多博客,试用过许多代码,这个算是我找到的比较好用的,也容易改。 傅里叶变换(DFT)变换 Mat ...
  • 17中用于学习目的的图像处理库。 图书馆 图书馆特色 特征 进步 影像结构 完毕 向量运算(请参阅) 完毕 矩阵的范围索引 去做 解析器 完成(PNG / JPEG) 幻影浏览器 完毕 图像处理功能 看 特征 进步 影像结构 完毕 ...
  • 本篇直接对图片使用二维DFT公式,意在与两次一维DFT叠加的方式做对比。 二维DFT公式: X[k]=∑n=0N−1x[n]e−j2πNkn X[k]=\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn} X[k]=n=0∑N−1​x[n]e−jN2π​kn %% Q1 2D...
  • 数字图像处理实验要执行实验,请下载MatLab或使用在线MatLab()实验列表: 学习图像处理的基础知识并编写程序以读取和显示不同类型的数字图像。 对数字图像进行空间域增强,并编写用于灰度转换的程序。 执行直方图...
  • 1、傅里叶变换 其实就是时域转换为频域,时域是指物理量关于时间的变化,频率注重的是幅度和频率 任何的周期函数都可以转换成三角函数的和,也就是能够解析出一个周期函数含有哪些频率的...2、DFT 参考:https://zh
  • 《数字图像处理》第三版 Rafael C. Gonzalez等著 花了1,2个月断续的看书,终于有些进展了,一直到DFT这里,偏理论些。 到现在我都不清楚弄出图片的DFT的振幅图像,相位图来干啥的。不过没关系,按照作者写的来,...
  • 图像处理基础(三)DFT与IDFT变换

    千次阅读 2018-08-29 17:50:23
    傅里叶变换(DFT) 首先来看看傅里叶(DFT)变换的公式 (1) FP=\frac {1}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1}P_{x,y}\exp(-j(\frac{2 \pi}{N})(ux+vy)) 幅度 (2) w=\sqrt{u^2+v^2} 其中 u,v代表空间频率,即灰度梯度,...
  • 不能使用IA898的实用程序-数字图像处理 Criado primeira vez no curso do1ºsemestre 2017 安装 façao clone dorepositório 笔记本计算机ia898 / src / GenerateLibrary Dependência: - numpy - matplotlib - ...
  • 图像处理】使用一维DFT叠加实现对图片的二维傅里叶变换 MATLAB 一维DFTDFT转化为矩阵运算 参考文档 Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是...
  • SCC5830的存储库图像处理 Moacir A.Ponti,2018-1 内容: 文件夹包含代码中使用的图像 :基本库,加载图像,处理像素,显示图像并保存到磁盘 强调 :使用逐像素灰度信息增强图像 :使用直方图增强图像 空间过滤 :...
  • 这是对应《数字图像处理》第二章的最后一个例子,今天我们聊一聊傅里叶变换在数字图像处理领域中的应用。作为一名工科生,即便早已经把什么傅里叶级数、DFT/FFT、变换/逆变换这些公式忘得一干二净了,但是提到傅里叶...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,397
精华内容 2,158
关键字:

图像处理dft