zoukankan      html  css  js  c++  java
  • 数字图像处理及MATLAB实现实验四——图像变换

    1.图像的傅里叶变换一(平移性质)

     傅里叶变换的平移性质表明了函数与一个指数项相乘等于将变换后的空域中心移到新的位置,并且平移不改变频谱的幅值。

    I=imread('1.bmp');
    figure(1)
    imshow(real(I));
    I=I(:,:,3);
    fftI=fft2(I);
    sfftI=fftshift(fftI); %求离散傅里叶频谱
    %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    RRfdp1=real(sfftI);
    IIfdp1=imag(sfftI);
    a=sqrt(RRfdp1.^2+IIfdp1.^2);
    a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    figure(2)
    imshow(real(a));
    I=imread('2.bmp');
    figure(1)
    imshow(real(I));
    I=I(:,:,3);
    fftI=fft2(I);
    sfftI=fftshift(fftI); %求离散傅里叶频谱
    %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    RRfdp1=real(sfftI);
    IIfdp1=imag(sfftI);
    a=sqrt(RRfdp1.^2+IIfdp1.^2);
    a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    figure(2)
    imshow(real(a));
    I=imread('3.bmp');
    figure(1)
    imshow(real(I));
    I=I(:,:,3);
    fftI=fft2(I);
    sfftI=fftshift(fftI); %求离散傅里叶频谱
    %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    RRfdp1=real(sfftI);
    IIfdp1=imag(sfftI);
    a=sqrt(RRfdp1.^2+IIfdp1.^2);
    a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    figure(2)
    imshow(real(a));

     实验结果符合傅里叶变换平移性质

    2.图像的傅里叶变换二(旋转性质)

    %构造原始图像
    I=zeros(256,256);
    I(88:168,124:132)=1; %图像范围是256*256,前一值是纵向比,后一值是横向比
    imshow(I)
    %求原始图像的傅里叶频谱
    J=fft2(I);
    F=abs(J);
    J1=fftshift(F);figure
    imshow(J1,[5 50])
    %对原始图像进行旋转
    J=imrotate(I,90,'bilinear','crop');
    figure
    imshow(J)
    %求旋转后图像的傅里叶频谱
    J=fft2(I);
    F=abs(J);
    J2=fftshift(F);figure
    imshow(J2,[5 50])

    3.图像的离散余弦变换一

    %对cameraman.tif文件计算二维DCT变换
    RGB=imread('cameraman.tif');
    figure(1)
    imshow(RGB)
    I=rgb2gray(RGB);
    %真彩色图像转换成灰度图像
    J=dct2(I);
    %计算二维DCT变换
    figure(2)
    imshow(log(abs(J)),[])
    %图像大部分能量集中在左上角处
    figure(3);
    J(abs(J)<10)=0;
    %把变换矩阵中小于10的值置换为0,然后用idct2重构图像
    K=idct2(J)/255;
    imshow(K)

    4.图像的离散余弦变换二

    % I=imread('1.bmp');
    % figure(1)
    % imshow(real(I));
    % I=I(:,:,3);
    % fftI=fft2(I);
    % sfftI=fftshift(fftI); %求离散傅里叶频谱
    % %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    % RRfdp1=real(sfftI);
    % IIfdp1=imag(sfftI);
    % a=sqrt(RRfdp1.^2+IIfdp1.^2);
    % a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    % figure(2)
    % imshow(real(a));
    % I=imread('2.bmp');
    % figure(1)
    % imshow(real(I));
    % I=I(:,:,3);
    % fftI=fft2(I);
    % sfftI=fftshift(fftI); %求离散傅里叶频谱
    % %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    % RRfdp1=real(sfftI);
    % IIfdp1=imag(sfftI);
    % a=sqrt(RRfdp1.^2+IIfdp1.^2);
    % a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    % figure(2)
    % imshow(real(a));
    % I=imread('3.bmp');
    % figure(1)
    % imshow(real(I));
    % I=I(:,:,3);
    % fftI=fft2(I);
    % sfftI=fftshift(fftI); %求离散傅里叶频谱
    % %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
    % RRfdp1=real(sfftI);
    % IIfdp1=imag(sfftI);
    % a=sqrt(RRfdp1.^2+IIfdp1.^2);
    % a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
    % figure(2)
    % imshow(real(a));
    
    % %构造原始图像
    % I=zeros(256,256);
    % I(88:168,124:132)=1; %图像范围是256*256,前一值是纵向比,后一值是横向比
    % imshow(I)
    % %求原始图像的傅里叶频谱
    % J=fft2(I);
    % F=abs(J);
    % J1=fftshift(F);figure
    % imshow(J1,[5 50])
    % %对原始图像进行旋转
    % J=imrotate(I,90,'bilinear','crop');
    % figure
    % imshow(J)
    % %求旋转后图像的傅里叶频谱
    % J=fft2(I);
    % F=abs(J);
    % J2=fftshift(F);figure
    % imshow(J2,[5 50])
    
    % %对cameraman.tif文件计算二维DCT变换
    % RGB=imread('cameraman.tif');
    % figure(1)
    % imshow(RGB)
    % I=rgb2gray(RGB);
    % %真彩色图像转换成灰度图像
    % J=dct2(I);
    % %计算二维DCT变换
    % figure(2)
    % imshow(log(abs(J)),[])
    % %图像大部分能量集中在左上角处
    % figure(3);
    % J(abs(J)<10)=0;
    % %把变换矩阵中小于10的值置换为0,然后用idct2重构图像
    % K=idct2(J)/255;
    % imshow(K)
    
    RGB=imread('cameraman.tif');
    I=rgb2gray(RGB);
    I=im2double(I); %转换图像矩阵为双精度型
    T=dctmtx(8);    %产生二维DCT变换矩阵
    %矩阵T及其转置T'是DCT函数P1*X*P2的参数
    B=blkproc(I,[8 8],'P1*x*P2',T,T');
    maxk1=[ 1 1 1 1 0 0 0 0 
            1 1 1 0 0 0 0 0
            1 1 0 0 0 0 0 0
            1 0 0 0 0 0 0 0 
            0 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0 
            0 0 0 0 0 0 0 0 ];  %二值掩模,用来压缩DCT系数
    B2=blkproc(B,[8 8],'P1.*x',mask1); %只保留DCT变换的10个系数
    I2=blkproc(B2,[8 8],'P1*x*P2',T',T);    %重构图像
    figure,imshow(T);
    figure,imshow(B2);
    figure,imshow(I2);
    
    RGB=imread('cameraman.tif');
    I=rgb2gray(RGB);
    I=im2double(I); %转换图像矩阵为双精度型
    T=dctmtx(8);    %产生二维DCT变换矩阵
    %矩阵T及其转置T'是DCT函数P1*X*P2的参数
    B=blkproc(I,[8 8],'P1*x*P2',T,T');
    maxk1=[ 1 1 1 1 0 0 0 0 
            1 1 1 0 0 0 0 0
            1 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0 
            0 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0
            0 0 0 0 0 0 0 0 
            0 0 0 0 0 0 0 0 ];  %二值掩模,用来压缩DCT系数
    B2=blkproc(B,[8 8],'P1.*x',mask1); %只保留DCT变换的10个系数
    I2=blkproc(B2,[8 8],'P1*x*P2',T',T);    %重构图像
    figure,imshow(T);
    figure,imshow(B2);
    figure,imshow(I2);

    5.图像的哈达玛变换

    cr=0.5;
    I=imread('cameraman.tif');
    I=im2double(I)/255; %将读入的unit8类型的RGB图像I转换为double类型的数据
    figure(1),imshow(I);%显示
                        %求图像大小
    [m_I,n_I]=size(I);  %提取矩阵I的行列数,m_I为I的行数,n_I为I的列数
    sizi=8;
    snum=64;
    %分块处理
    t=hadamard(sizi) %生成8*8的哈达码矩阵
    hdcoe=blkproc(I,[sizi sizi],'P1*x*P2',t,t');
                     %将图片分成8*8像素块进行哈达码变换
                     %重新排列系数
    CE=im2col(hdcoe,[sizi,sizi],'distinct');
        %将矩阵hdcode分为8*8互不重叠的子矩阵,再将每个子矩阵作为CE的一列
    [Y Ind]=sort(CE); %对CE进行升序排序
                      %舍去方差较小的系数,保留原系数的二分之一,即32个系数
    [m,n]=size(CE);%提取矩阵CE的行列数,m为CE的行数,n为CE的列数
    snum=snum-snum*cr;
    for i=1:n
    CE(Ind(1:snum),i)=0;
    end
    %重建图像
    re_hdcoe=col2im(CE,[sizi,sizi],[m_I,n_I],'distinct');
                      %将矩阵的列重新组织到块中
    re_I=blkproc(re_hdcoe,[sizi sizi],'P1*x*P2',t',t);
                      %进行反哈达码变换,得到压缩后的图像
    re_I=double(re_I)/64; %转换为double类型的数据
    figure(2);
    imshow(re_I);

    %计算原始图像和压缩后图像的误差
    error=I.^2-re_I.^2;
    MSE=sum(error(:))/prod(size(re_I));



  • 相关阅读:
    iOS-开发日志-UIButton
    苹果API常用英语名词
    iOS-开发日志-UIimageView
    IOS-开发日志-UILabel相关
    iOS-开发日志-UIPageControl
    Maven-生成可执行的Jar包
    RabbitMQ不讲武德,发个消息也这么多花招
    Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue
    windows server 2012 R2里IIS配置.net core2.1遇到的坑
    VScode中配置C++运行环境
  • 原文地址:https://www.cnblogs.com/zhying99/p/10766446.html
Copyright © 2011-2022 走看看