zoukankan      html  css  js  c++  java
  • 图像变换

    1旋转图像,并显示图像的傅里叶频谱

     1 I=zeros(256,256);
     2 I(28:228,108:148)=1;
     3 subplot(2,4,1);
     4 imshow(I);
     5 title('原始图像');
     6 J=fft2(I);%对信号进行快速Fourier变换,注释一
     7 F=abs(J);%求得Fourier变换后的振幅,注释二
     8 J1=fftshift(F)%注释三
     9 subplot(2,4,2);
    10 imshow(J1,[5 50])
    11 title('原图像的傅里叶频谱');
    12 J=imrotate(I,30,'bilinear','crop');%逆时针旋转30度,注释四
    13 subplot(2,4,3);
    14 imshow(J);
    15 title('旋转30度');
    16 J1=fft2(J);
    17 F=abs(J1);
    18 J2=fftshift(F);
    19 subplot(2,4,4)
    20 imshow(J2,[5 50])
    21 title('旋转30度傅里叶频谱');
    22 J=imrotate(I,60,'bilinear','crop');%逆时针旋转60度
    23 subplot(2,4,5);
    24 imshow(J);
    25 title('旋转60度后');
    26 J1=fft2(J);
    27 F=abs(J1);
    28 J2=fftshift(F);
    29 subplot(2,4,6)
    30 imshow(J2,[5 50])
    31 title('旋转60度傅里叶频谱');
    32 J=imrotate(I,90,'bilinear','crop');%逆时针旋转90度
    33 subplot(2,4,7);
    34 imshow(J);
    35 title('旋转90度后');
    36 J1=fft2(J);
    37 F=abs(J1);
    38 J2=fftshift(F);
    39 subplot(2,4,8)
    40 imshow(J2,[5 50])
    41 title('旋转90度傅里叶频谱');

    2二维余弦正反变换

     1 I=imread('C:\Users\Administrator\Desktop\lenagray.jpg');
     2 subplot(1,3,1)
     3 imshow(I);
     4 title('原始图像')
     5 J=dct2(I);
     6 subplot(1,3,2)
     7 imshow(log(abs(J)),[]);
     8 title('余弦变换系数');
     9 k=idct2(J)/255;
    10 subplot(133);
    11 imshow(k);
    12 title('余弦反变换恢复图像');

    3尺度变化

     1 I=zeros(256,256);
     2 I(8:248,110:136)=255;
     3 figure(1);
     4 imshow(I);
     5 J3=fft2(I);
     6 F2=abs(J3);
     7 F3=fftshift(F2);
     8 figure(2);
     9 imshow(F3,[5 30]);
    10 a=0.1;
    11 
    12 for i=1:256
    13     for j=1:256;
    14         I(i,j)=I(i,j)*a;
    15     end
    16 end
    17 J2=fft2(I);
    18 F1=abs(J2);
    19 J3=fftshift(F1);
    20 figure(3);
    21 imshow(J3,[5 30])

    当f(x,y)在水平方向进行扩展,相同间隔下频谱中u方向零点的数量也增加

    4傅里叶变换实例

     1 I=imread('D:/picture/lenagray.jpg');
     2 figure;imshow(I);
     3 p=fft2(I);
     4 p=fftshift(p);
     5 figure;imshow(log(abs(p)),[8 10]);
     6 I1=imnoise(I,'gaussian',0,0.01);
     7 figure;imshow(I1);
     8 p1=fft2(I);
     9 p1=fftshift(p1);
    10 figure;imshow(log(abs(p1)),[8 10]);

    figure1是原图figure2是原图的傅里叶频谱图(已经移中),

    figure3是加了高斯噪声的lena图,及其对应的频谱图。

    有一些关于频谱图的结论:中心白色区域是低频,但能量高,幅角大,中心之外的区域是黑色区域,对应的是高频,能量幅度小,

    对于图像灰度变化缓慢的区域,对应它变换后的低频分量部分;图像灰度呈阶跃变换的区域,对应变换后的高频部分。除颗粒噪声外,图像细节的边缘、轮廓处都是灰度变化突出区域。他们都具有变换后的高频分量特征。我个人观点是图像的灰度值越小即越黑则对应的频谱中心区域越小,高频成分占的比重越高。

    具体关于频谱的内容可以看一下这两篇博客

    https://blog.csdn.net/Struggle_For_M/article/details/51207370
    https://blog.csdn.net/ViatorSun/article/details/82387854
    5相位谱交换,进行图像重构。
     1 Load lena.mat;
     2 Load boy.mat;
     3 Jf=fft2(J1);
     4 FAi=abs(If);
     5 FPi=angle(If);
     6 FAj=abs(Jf);
     7 FPj=angle(Jf);
     8 IR=FAi.*cos(FPj)+FAi.*sin(FPj).*i;
     9 JR=FAj.*cos(FPi)+FAj.*sin(FPi).*i;
    10 IR1=abs(ifft2(IR));
    11 JR1=abs(ifft2(JR));
    12 subplot(221)
    13 imshow(I1);
    14 title('男孩原图像');
    15 subplot(222)
    16 imshow(J1);
    17 title('美女原图像');
    18 subplot(223)
    19 imshow(IR1,[]);
    20 title('男孩的幅值谱和美女的相位谱组合');
    21 subplot(224)
    22 imshow(JR1,[]);
    23 title('美女的幅值谱和男孩的相位谱组合');

     

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    注释一:

    ​​1.  Y = fft(y);

    2.  Y = fft(y,N);

    式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。

    注释二:

    注释三:

      fft是一维傅里叶变换,即将时域信号转换为频域信号fftshift是针对频域的,将FFT的DC分量移到频谱中心

    即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交换与反对角线的交换

      fft:对模拟信号进行变换,变换结果是左右对称的,有负频率,如下图(a)中的作图所示。

    DFT的求和区间是0~N-1,DFT的物理意义是对fft的结果等间隔的采样N点,但是人为的规定0~N-1使得只采样了正频率,和fft结果不一致。由于fft的对称性或者说是周期性(见(b)的右图),所以可以以DFT结果以Fs/2为中心, 把Fs/2频率右半部分移到左半部分(即N/2~N-1)个点平移到负半轴,这样的结果的形状就同(a)中右面的图一致了,这也即是fftshift的原因。。其实是为了与fft结果一致。

    其他内容可参考:https://www.cnblogs.com/WHaoL/p/6595132.html  

     注释四:

    imrotate函数说明

    调用格式

    编辑
    B = imrotate(A,angle)
    B = imrotate(A,angle,method)
    B = imrotate(A,angle,method,bbox)
      

    调用格式说明

    B = imrotate(A,angle)
    将图像A(图像的数据矩阵)绕图像的中心点旋转angle度, 正数表示逆时针旋转, 负数表示顺时针旋转。返回旋转后的图像矩阵。
    B = imrotate(A,angle,method)
    使用method参数可以改变插值算法,method参数可以为下面这三个值:
    'nearest':最邻近线性插值(Nearest-neighbor interpolation)
    'bilinear': 双线性插值(Bilinear interpolation)
    'bicubic': 双三次插值(或叫做双立方插值)(Bicubic interpolation)
    B = imrotate(A,angle,method,bbox)
    bbox参数用于指定输出图像属性:
    'crop': 通过对旋转后的图像B进行裁剪, 保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
    'loose': 使输出图像足够大, 以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。 一般这种格式产生的图像的尺寸都要大于源图像的尺寸。
  • 相关阅读:
    Prometheus监控node-exporter常用指标含义
    Go 程序开发的注意事项
    kafka集群安装和使用
    storm集群的安装
    如何用zabbix监控mysql多实例
    企业环境下用脚本设置ubuntu防火墙
    使用教程:宝塔服务器管理助手Linux面版
    Zabbix是什么?
    小白都能看懂的Linux系统下安装配置Zabbix
    Linux:检查当前运行级别的五种方法
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10578580.html
Copyright © 2011-2022 走看看