精华内容
下载资源
问答
  • 2021-10-28 20:43:02

    MATLAB初学——Matlab实现图像的几何变换

    1.图像比例缩放变换

    主要函数:imresize()
    实现代码

    image = imread('test.bmp');
    image_1 = imresize(image,0.5); %比例缩小0.5倍
    image_2 = imresize(image,[320,410]); %非比例缩小(指定行数和列数)
    image_3 = imresize(image,2); %比例放大1倍
    figure(1)
    imshow(image);
    title('原图');
    figure(2)
    imshow(image_1);
    title('比例缩小0.5倍');
    figure(3)
    imshow(image_2);
    title('非比例缩小');
    figure(4)
    imshow(image_3);
    title('比例放大');
    

    2.图像平移变换

    主要函数:translate(); imdilate(); imtranslate()
    实现代码

    image = imread('test.bmp');
    se = translate(strel(1), [150 150]); %将一个平面结构化元素分别向下和向右移动150个位置
    image_1 = imdilate(image,se); %利用膨胀函数平移图像
    image_2 = imtranslate(image,[150,150],'OutputView','full'); %平移后保持图像完整
    figure(1)
    imshow(image);
    title('原图');
    figure(2)
    imshow(image_1);
    title('平移后的图像');
    figure(3)
    imshow(image_2);
    title('平移后不被截去的图像');
    
    

    3.图像镜像变换

    主要函数:maketform(); imtransform();
    实现代码

    image = imread('test.bmp');
    [height,width,dim] = size(image);
    tform = maketform('affine',[-1 0 0;0 1 0;width 0 1]);
    image_1 = imtransform(image,tform,'nearest');
    tform2 = maketform('affine',[1 0 0;0 -1 0;0 height 1]);
    image_2 = imtransform(image,tform2,'nearest');
    subplot(1,3,1); imshow(image);  title('原图像');
    subplot(1,3,2); imshow(image_1);  title('水平镜像');
    subplot(1,3,3);  imshow(image_2);  title('垂直镜像');
    
    

    4.图像旋转变换

    主要函数:imrotate()
    实现代码

    image = imread('test.bmp');
    image_1 = imrotate(image,40,'nearest','crop'); %最近邻插值
    image_2 = imrotate(image,40,'nearest','loose'); 
    figure; imshow(image); title('原图像');
    figure; imshow(image_1); title('旋转后图像');
    figure; imshow(image_2); title('旋转后不被截去图像');
    
    

    5.图像绕某点(非中心点)旋转

    自定义函数,构建变换矩阵,与原图像矩阵相乘,实现先平移后旋转功能
    实现代码

    function rotate(img)
    [m,n] = size(img);
    M = ones(m,n);
    T1 = [1,0,0;0,1,0;-66,-66,1];  %平移至点P(66,66)
    T2 = [cosd(60),-sind(60),0;sind(60),cosd(60),0;0,0,1]; %逆时针旋转60°
    T =T2*T1;  %变换矩阵
    for i=1:m
        for j=1:n
            p = floor([i,j,1]*T);
            if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围 
             M(i,j) = img(p(1),p(2));   
            else 
            M(i,j) = 0;  
            end
        end
    end
    figure; imshow(M,[]); title('绕点P逆时针旋转60°');
    
    image = imread('test.bmp');
    image_1 = rgb2gray(image);
    figure
    subimage(image_1); 
    title('原图');
    rotate(image_1)
    
    
    更多相关内容
  • MATLAB图像基本变换的命令,适用于初学者
  • 本代码为MATLAB实现图像几何变换,包含图像的水平镜像、垂直错切、旋转和加倍,内附有图片经过代码处理后的结果
  • 图像的平移 图像的旋转 图像的切变 图像的镜像 上述函数的测试脚本 结果 图像的平移 function OutImage = ImageShiftFun(InputImage,deltaX,deltaY,method) %=============================================...

    目录

     

    图像的平移

    图像的旋转

    图像的切变

    图像的镜像

    上述函数的测试脚本

    结果


    图像的平移

    function OutImage = ImageShiftFun(InputImage,deltaX,deltaY,method)
    %================================================================
    % 功能:图像的x轴和y轴平移
    % 参数:InputImage为输入单通道图像,deltaX为x轴平移量,deltaY为y轴平移量。
    %method=1时采取向前映射,method=2时采取向后映射
    % 返回值:OutImage为InputImage同维数组
    % 主要思路:利用平移矩阵
    % 备注:如果图像为多通道则需要重复调用
    %        如果平移量为小数则采用邻域插值
    % 调用方法:OutImage = ImageShiftFun(InputImage,deltaX,deltaY)
    % 日期:2019.11.26
    % 作者:Leetion
    [iLimit,jLimit] = size(InputImage);
    switch method
        case 1
            OutImage = zeros(iLimit, jLimit);
            ShiftArray = [1 0 deltaX; 0 1 deltaY; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    InIndex= [xIndex;yIndex;1];
                    OutIndex = ShiftArray*InIndex; 
                    xOutIndex = round(OutIndex(1,1));
                    yOutIndex = round(OutIndex(2,1));
                    if (yOutIndex<=iLimit)&(xOutIndex <= jLimit)&(yOutIndex >= 1)&(xOutIndex >= 1)
                        OutImage(yOutIndex,xOutIndex) = InputImage(yIndex,xIndex);
                    end
                end
            end
        case 2
            OutImage = zeros(iLimit, jLimit);
            ShiftArray = [1 0 -deltaX; 0 1 -deltaY; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    OutIndex = [xIndex;yIndex;1];
                    InIndex = ShiftArray*OutIndex; %矩阵乘法
                    xInIndex = round(InIndex(1,1));
                    yInIndex = round(InIndex(2,1));
                    if (yInIndex<=iLimit)&(xInIndex<=jLimit)&(yInIndex>=1)&(InIndex>=1)
                        OutImage(yIndex,xIndex) = InputImage(yInIndex,xInIndex);
                    end
                end     
            end
        otherwise
            warning("method只能取1或2");
    end
    end
    
    

    图像的旋转

    function OutImage = ImageRotateFun(InputImage,x0,y0,theta,method)
    %================================================================
    % 功能:以任意中心点,任意角度旋转图像
    % 参数:InputImage为输入单通道图像,(x0,y0)为旋转中心,theta为旋转角度,顺时针为正,单位为度。
    %method=1时采取向前映射,method=2时采取向后映射
    % 返回值:OutImage为InputImage同维数组
    % 主要思路:利用旋转矩阵
    % 备注:如果图像为多通道则需要重复调用
    %       method1会因为向前映射出现马赛克
    %       采用邻域插值
    % 调用方法:OutImage = ImageRotateFun(InputImage,x0,y0,theta,method)
    % 日期:2019.11.26
    % 作者:Leetion
    theta = theta*pi/180;
    [iLimit,jLimit] = size(InputImage);
    switch method
        case 1
            OutImage = zeros(iLimit, jLimit);
            RotateArray = [cos(theta) -sin(theta) x0;sin(theta) cos(theta) y0; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    InIndex= [xIndex-x0;yIndex-y0;1];
                    OutIndex = RotateArray*InIndex; 
                    xOutIndex = round(OutIndex(1,1));
                    yOutIndex = round(OutIndex(2,1));
                    if (yOutIndex<=iLimit)&(xOutIndex <= jLimit)&(yOutIndex >= 1)&(xOutIndex >= 1)
                        OutImage(yOutIndex,xOutIndex) = InputImage(yIndex,xIndex);
                    end
                end
            end
        case 2
            OutImage = zeros(iLimit, jLimit);
            RotateArray = [cos(theta) sin(theta) x0;-sin(theta) cos(theta) y0; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    OutIndex = [xIndex-x0;yIndex-y0;1];
                    InIndex = RotateArray*OutIndex;
                    xInIndex = round(InIndex(1,1));
                    yInIndex = round(InIndex(2,1));
                    if (yInIndex<=iLimit)&(xInIndex <= jLimit)&(yInIndex >= 1)&(InIndex >= 1)
                        OutImage(yIndex,xIndex) = InputImage(yInIndex,xInIndex);
                    end
                end
                
            end
        otherwise
            warning("method只能取1或2");
    end
    end
    
    

    图像的切变

    function OutImage = ImageRateFun(InputImage,x0,y0,RateX,RateY,method)
    %================================================================
    % 功能:水平垂直切变
    % 参数:InputImage为输入单通道图像,(x0,y0)为旋转中心,theta为旋转角度,逆时针为正,单位为度。
    %method=1时采取向前映射,method=2时采取向后映射
    % 返回值:OutImage为InputImage同维数组
    % 主要思路:利用旋转矩阵,使用最近插值
    % 备注:如果图像为多通道则需要重复调用
    %       method1会因为向前映射出现马赛克
    %       采用邻域插值
    % 调用方法:OutImage = ImageRotateFun(InputImage,x0,y0,theta,method)
    % 日期:2019.11.26
    % 作者:Leetion
    [iLimit,jLimit] = size(InputImage);
    switch method
        case 1
            OutImage = zeros(iLimit, jLimit);
            RateArray = [RateX 0 x0;0 RateY y0; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    InIndex= [xIndex-x0;yIndex-y0;1];
                    OutIndex = RateArray*InIndex; 
                    xOutIndex = round(OutIndex(1,1));
                    yOutIndex = round(OutIndex(2,1));
                    if (yOutIndex<=iLimit)&(xOutIndex <= jLimit)&(yOutIndex >= 1)&(xOutIndex >= 1)
                        OutImage(yOutIndex,xOutIndex) = InputImage(yIndex,xIndex);
                    end
                end
            end
        case 2
            OutImage = zeros(iLimit, jLimit);
           RateArray = [1/RateX 0 x0;0 1/RateY y0; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    OutIndex = [xIndex-x0;yIndex-y0;1];
                    InIndex = RateArray*OutIndex; 
                    xInIndex = round(InIndex(1,1));
                    yInIndex = round(InIndex(2,1));
                    if (yInIndex<=iLimit)&(xInIndex <= jLimit)&(yInIndex >= 1)&(InIndex >= 1)
                        OutImage(yIndex,xIndex) = InputImage(yInIndex,xInIndex);
                    end
                end
                
            end
        otherwise
            warning("method只能取1或2");
    end
    end
    
    

    图像的镜像

    function OutImage = ImageMirrorFun(InputImage,Direction)
    %================================================================
    % 功能:图片镜像
    % 参数:InputImage为输入单通道图像
    % Direction=1时x方向镜像,Direction=2时y方向镜像
    % 返回值:OutImage为InputImage同维数组
    % 主要思路:利用镜像矩阵
    % 备注:如果图像为多通道则需要重复调用
    % 调用方法:OutImage = ImageMirrorFun(InputImage,Direction)
    % 日期:2019.11.26
    % 作者:李习银
    [iLimit,jLimit] = size(InputImage);
    switch Direction
        case 1
            OutImage = zeros(iLimit, jLimit);
            MirrorArray = [-1 0 iLimit+1;0 1 0; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    InIndex= [xIndex;yIndex;1];
                    OutIndex = MirrorArray*InIndex; 
                    xOutIndex = round(OutIndex(1,1));
                    yOutIndex = round(OutIndex(2,1));
                    if (yOutIndex<=iLimit)&(xOutIndex <= jLimit)&(yOutIndex >= 1)&(xOutIndex >= 1)
                        OutImage(yOutIndex,xOutIndex) = InputImage(yIndex,xIndex);
                    end
                end
            end
        case 2
            OutImage = zeros(iLimit, jLimit);
            MirrorArray = [1 0 0;0 -1 jLimit+1; 0 0 1];
            for yIndex = 1:iLimit
                for xIndex = 1:jLimit
                    InIndex= [xIndex;yIndex;1];
                    OutIndex = MirrorArray*InIndex; 
                    xOutIndex = round(OutIndex(1,1));
                    yOutIndex = round(OutIndex(2,1));
                    if (yOutIndex<=iLimit)&(xOutIndex <= jLimit)&(yOutIndex >= 1)&(xOutIndex >= 1)
                        OutImage(yOutIndex,xOutIndex) = InputImage(yIndex,xIndex);
                    end
                end
            end
        otherwise
            warning("method只能取1或2");
    end
    end
    

    上述函数的测试脚本

    %================================================================
    % 功能:几何变换
    % 主要思路:
    % 备注:
    % 日期:2019.11.26
    % 作者:Leetion
    clc,clear
    close all
    InputImage = imread('cameraman.tif'); 
    deltaX = 50;
    deltaY = 100;
    theta = 10;
    ShiftImage = ImageShiftFun(InputImage,deltaX,deltaY,2);
    RotateImage = ImageRotateFun(InputImage,128.5,128.5,theta,2);
    MirrorImage = ImageMirrorFun(InputImage,1);
    RateImage = ImageRateFun(InputImage,128.5,128.5,2,3,2);
    subplot(2,3,1)
    imshow(uint8(InputImage));
    title("原图");
    subplot(2,3,2)
    imshow(uint8(ShiftImage));
    title("平移");
    subplot(2,3,3)
    imshow(uint8(RotateImage)); 
    title("旋转后向插值");
    subplot(2,3,4)
    imshow(uint8(MirrorImage));
    title("镜像");
    subplot(2,3,5)
    imshow(uint8(RateImage));
    title("切变");
    RotateImage = ImageRotateFun(InputImage,128.5,128.5,theta,1);
    subplot(2,3,6)
    imshow(uint8(RotateImage)); 
    title("旋转前向插值");
    
    

    结果

    几何变换
    Fig1.图像的几何变换测试

    注:

    1.转载请注明出处。

    2.本文使用的算法是几何变换用矩阵表示。

    3.插值算法可以进一步优化,笔者精力有限没做尝试。

    4.本文的所有图像处理都使用了前向和后向两种映射,注意区别其产生的结果。

    展开全文
  • 常见的数字图像几何变换包括平移、镜像、旋转、缩放和错切等,是图像处理软件必须具备的操作手段。本次实验的目的是要求掌握各种变换的基本原理和方法,能够运用Matlab编写程序,实现这些变换。其中,由于变化产生...
  • 1.1使用matlab制作出题目所要求的图形。 定义一个a=zeros(300,300,3)的三维矩阵,用for循环对该矩阵中的每个像素点进行赋值运算,给出不同的值作为该图像每个像素点的灰度级,生成的图像如图所示: 1.2将此图以图形...

    实验内容

    已知3×3的图像如图所示:
    在这里插入图片描述
    A、将此图以图形中心为轴顺时针旋转30度。
    B、将此图放大二倍。
    C、对此图作水平镜像。
    D、对此图作垂直方向的错切。

    1.1使用matlab制作出题目所要求的图形。

    定义一个a=zeros(300,300,3)的三维矩阵,用for循环对该矩阵中的每个像素点进行赋值运算,给出不同的值作为该图像每个像素点的灰度级,生成的图像如图所示:
    在这里插入图片描述

    1.2将此图以图形中心为轴顺时针旋转30度。

    首先定义旋转角度为pi/6,即三十度,其次算出旋转后图像的矩阵大小,得到旋转后图像的长和宽,然后利用两个for循环遍历旋转后图像中的每个像素点,先将旋转中心移至原点,然后利用逆矩阵得到旋转后图像的坐标x和y在原图像中的坐标点x0、y0,由于在原图像中的坐标可能出现小数,因此利用最邻近插值算法对x0、y0进行四舍五入取整运算,然后再将旋转中心移至左上角,得到旋转后的图像如图所示:
    在这里插入图片描述
    过观察可发现旋转后的图像在边界处出现了不同程度的凹凸不平的噪声点,这是由于在处理旋转后图像坐标映射到原图坐标时太过于粗糙所导致的,此时采用双线性插值算法,让处理更为精细,处理后的图像如图所示:
    在这里插入图片描述

    1.3将此图放大二倍。

    图像放大与图像旋转类似,都是遍历变换后的图像每个像素点,然后在原图中找出对应的像素点坐标,同样用最邻近插值放大后的图像如图所示:
    在这里插入图片描述

    1.4对此图作水平镜像与垂直方向的错切

    水平镜像即将y方向的坐标作对称变换即可,垂直方向的错切则是对y方向的坐标点进行变换,变换后的图像如图所示:
    在这里插入图片描述

    实验代码附录如下:

    clc
    close all
    a=zeros(300,300,3);
    %%
    %生成图像
    for i=1:100
        for j=1:100
            a(i,j,2)=50;
            a(i,j,1)=0;
            a(i,j,3)=0;
        end
    end    
    for i=100:200
        for j=200:300
            a(i,j,2)=50;
            a(i,j,1)=0;
            a(i,j,3)=0;
        end
    end  
    for i=200:300
        for j=1:200
            a(i,j,2)=50;
            a(i,j,1)=0;
            a(i,j,3)=0;
        end
    end
    for i=1:100
        for j=100:300
            a(i,j,1)=255;
            a(i,j,2)=255;
            a(i,j,3)=255;
        end
    end
    for i=100:200
        for j=1:200
            a(i,j,1)=255;
            a(i,j,2)=255;
            a(i,j,3)=255;
        end
    end
    for i=200:300
        for j=200:300
            a(i,j,1)=255;
            a(i,j,2)=255;
            a(i,j,3)=255;
        end
    end
    figure;
    imshow(a);
    %%
    %图像旋转
    row=300;
    col=300;
    dushu= pi/6;                           %旋转角度
    row1 = round(abs(row*cos(dushu)) + abs(col*sin(dushu)));    %旋转后大小
    col1 = round(abs(col*cos(dushu)) + abs(row*sin(dushu)));
    I1 = zeros(row1, col1,3);
    for i = 1:row1
        for j = 1:col1
            c = i - row1/2;     %将旋转中心移至原点
            d = j - col1/2;
            x = c*cos(dushu) - d*sin(dushu);   %旋转 
            y = d*cos(dushu) + c*sin(dushu);
            x = round(x + row/2);  %将所需图像移至坐标系正值部分
            y = round(y + col/2);
            if x > 0 && x <= row && y <= col && y > 0                
                    I1(i,j,1) = a(x,y,1);
                    I1(i,j,2) = a(x,y,2);
                    I1(i,j,3) = a(x,y,3);
            end
        end
    end
    figure;
    imshow(I1);
    %%
    %使用双线性插值处理
    row=300;
    col=300;
    dushu= pi/6;                           %旋转角度
    row1 = round(abs(row*cos(dushu)) + abs(col*sin(dushu)));    %旋转后大小
    col1 = round(abs(col*cos(dushu)) + abs(row*sin(dushu)));
    I2 = zeros(row1, col1,3);
    for i = 1:row1
        for j = 1:col1
            c = i - row1/2;     %将旋转中心移至原点
            d = j - col1/2;
            x = c*cos(dushu) - d*sin(dushu);   %旋转 
            y = d*cos(dushu) + c*sin(dushu);
            x = x + row/2;  %将所需图像移至坐标系正值部分
            y = y + col/2;
            if x > 0 && x <= row && y <= col && y > 0                
            if x < 1           %边界处理
                x = 1;
            end
            if y < 1
                y = 1;
            end
            p=x-floor(x);
            q=y-floor(y);
            I2(i,j,1)=(1-q)*(1-p)*a(floor(x),floor(y),1)+(1-q)*p*a(ceil(x),floor(y),1)+q*(1-p)*a(floor(x),ceil(y),1)+q*p*a(ceil(x),ceil(y),1);
            I2(i,j,2)=(1-q)*(1-p)*a(floor(x),floor(y),2)+(1-q)*p*a(ceil(x),floor(y),2)+q*(1-p)*a(floor(x),ceil(y),2)+q*p*a(ceil(x),ceil(y),2);
            I2(i,j,3)=(1-q)*(1-p)*a(floor(x),floor(y),3)+(1-q)*p*a(ceil(x),floor(y),3)+q*(1-p)*a(floor(x),ceil(y),3)+q*p*a(ceil(x),ceil(y),3);
            end
        end
    end
    figure;
    imshow(I2);
    
    %%
    %图像水平镜像
    b=a;
    for i=1:300
        for j=1:300
            x1=i;
            y1=300-j+1;
            b(x1,y1,1)=a(i,j,1);
            b(x1,y1,2)=a(i,j,2);
            b(x1,y1,3)=a(i,j,3);
        end
    end
    
    %%
    %图像放大两倍
    %最邻近插值
    c=a;
    row1=2*row;
    col1=2*col;
    for i=1:600
        for j=1:600
            x=round(i/2);
            y=round(j/2);
            c(i,j,1)=a(x,y,1);
            c(i,j,2)=a(x,y,2);
            c(i,j,3)=a(x,y,3);
        end
    end
    
    figure;
    imshow(c);
    %%
    %双线性插值
    c1=a;
    for i=1:600
        for j=1:600
            x=i/2;
            y=j/2;
            if x < 1           %边界处理
                x = 1;
            end
            if y < 1
                y = 1;
            end
            p=x-floor(x);
            q=y-floor(y);
            c1(i,j,1)=(1-q)*(1-p)*a(floor(x),floor(y),1)+(1-q)*p*a(ceil(x),floor(y),1)+q*(1-p)*a(floor(x),ceil(y),1)+q*p*a(ceil(x),ceil(y),1);
            c1(i,j,2)=(1-q)*(1-p)*a(floor(x),floor(y),2)+(1-q)*p*a(ceil(x),floor(y),2)+q*(1-p)*a(floor(x),ceil(y),2)+q*p*a(ceil(x),ceil(y),2);
            c1(i,j,3)=(1-q)*(1-p)*a(floor(x),floor(y),3)+(1-q)*p*a(ceil(x),floor(y),3)+q*(1-p)*a(floor(x),ceil(y),3)+q*p*a(ceil(x),ceil(y),3);
        end
    end
    figure;
    imshow(c1);
    
    
    %%
    %图像错切
    d=zeros(300,300,3);
    dx=0.5;
    for i=1:300
        for j=1:300
            x=i;
            y=round(j+dx*i);
            d(x,y,1)=a(i,j,1);
            d(x,y,2)=a(i,j,2);
            d(x,y,3)=a(i,j,3);      
        end
    end
    figure;
    subplot(2,2,1),imshow(a),title('原图','fontsize',16);
    subplot(2,2,2),imshow(b),title('水平镜像','fontsize',16);
    subplot(2,2,3),imshow(d),title('图像错切','fontsize',16);
    

    双线性插值原理如下:

    将前两个关于g的函数代入第三个函数当中,即可推出双线性插值的公式。
    在这里插入图片描

    展开全文
  • 3.于MATLAB环境下编程实现图片不同的几何变换。三、实验内容1.将图像图像中心顺时针旋转30度,旋转之后的图像尺寸保持为原图像的尺寸。2.将原图像放大2倍3.得到该图像的水平镜像图片4.得到该图像的垂直错切图像...

    b2294574a19ba2119c3c83271abb4e2d.png

    一、实验名称

    图像的几何变换

    二、实验目的

    1.熟悉MATLAB软件的使用。
    2.掌握图像几何变换的原理及数学运算。
    3.于MATLAB环境下编程实现对图片不同的几何变换。

    三、实验内容

    1.将图像绕图像中心顺时针旋转30度,旋转之后的图像尺寸保持为原图像的尺寸。
    2.将原图像放大2倍
    3.得到该图像的水平镜像图片
    4.得到该图像的垂直错切图像

    四、实验仪器与设备

    Win10 64位电脑
    MATLAB2017a

    五、实验原理

    图像旋转
    所谓图像的旋转无非就是将图像中的所有像素整体旋转,即本质就是对每个像素进行旋转。对一个像素进行旋转,可以看出向量的旋转,利用向量旋转公式,得到旋转矩阵。当然,旋转之后,虽然图像的大小的不会变化的,但是便于我们坐标的选取,我们会计算出一个新的坐标系,所以这里两个过程,两个坐标系中坐标的相互转换,得到两个转换矩阵,这样一来,对于一个像素点,只需要对它进行相应的矩阵操作即可得到旋转之后的点坐标。当然,对于一些得到的映射点不是整数的情况下,我们可以按照要求进行取整或者插值操作即可。图像的放大
    图像的放大收缩,这里拿放大举例,就是拿更多的像素去表达原来的图像,但是图像整体不变,通俗一点就是,原来一个特征点,需要10个像素表示,放大就是现在我们用20个或者更多来表示这个特征点,这里填值的方法有很多,邻值插值,线性插值等。图像的水平镜像
    对像素矩阵进行水平转置即可。图像的垂直错切
    对垂直方向进行线性变换即可。

    六、实验过程及代码

    图像旋转

    function [newimage]=rotate(img,degree)
    
    %获取图片信息 注意三通道获取完 即定义三个变量
    [m,n,dep]=size(img);
    
    %计算出旋转之后,形成一个大矩形的长宽 可以看效果图
    rm=round(m*abs(cosd(degree))+n*abs(sind(degree)));
    rn=round(m*abs(sind(degree))+n*abs(cosd(degree)));
    
    %定义一个新矩阵,三通道的,存储新图片的信息
    newimage=zeros(rm,rn,dep);
    
    %坐标变换 分三步 
    m1=[1,0,0;0,1,0;-0.5*rm,-0.5*rn,1];
    m2=[cosd(degree),sind(degree),0;-sind(degree),cosd(degree),0;0,0,1];
    m3=[1,0,0;0,1,0;0.5*m,0.5*n,1];
    
    %利用循环,对每一个像素点进行变换
    for i=1:rm
        for j=1:rn
            tem=[i j 1];
            tem=tem*m1*m2*m3;
            x=tem(1,1);
            y=tem(1,2);
            x=round(x);
            y=round(y);
            if(x>0&&x<=m)&&(y>0&&y<=n)
            newimage(i,j,:)=img(x,y,:);
            end
            end
            end
    
    end
    主函数
     t=imread('a1.jpg');
    t1=rotate(t,30);
    subplot(1,2,1),imshow(uint8(t)),title('原图');
    subplot(1,2,2),imshow(uint8(t1)),title('旋转30度后');
    图像放大2倍
     t=imread('a1.jpg');
    [m,n,dep]=size(t);
    %自定义长 宽 
    rm=1400;
    rn=822;
    
    %构造新矩阵 存储收缩后的图片
    rt=zeros(rm,rn,dep);
    
    for i=1:rm
    for j=1:rn
    %坐标转换
    x=i*m/rm;
    y=j*n/rn;
    %求出偏移量
    u=x-floor(x);
    v=y-floor(y);
    %边缘处理
    if x<1
    x=1;
    end
    if y<1
    y=1;
    end
    %双线性插值
    rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;
    end
    end
    
    
    imshow(t);title('原图');
    figure;imshow(uint8(rt));title('加倍后的图片');

    图像的水平镜像

    t=imread('a1.jpg');
    [m,n,z]=size(t);
    rt=t;
    for i=1:m
    for j=1:n
    rt(i,j,:)=t(i,n-j+1,:);
    end
    end
    subplot(1,2,1),imshow(t),title('原图')
    subplot(1,2,2),imshow(rt),title('水平镜像')
    垂直方向错切:
    t=imread('a1.jpg');
    [m,n,z]=size(t);
    rt=zeros(m+n,n,z);
    for i=1:m
    for j=1:n
    rt(i+j,j,:)=t(i,j,:);
    end
    end
    subplot(1,2,1),imshow(t),title('原图')
    subplot(1,2,2),imshow(uint8(rt)),title('垂直错切')

    七、实验结果与分析

    图 1图像顺时针旋转30度

    9d09b67423c52c5f32520594ab837338.png


    图 2图像放大2倍

    135ea697bdd1bd819e9b701f148e577e.png


    图 3图像的水平镜像

    1e53aa6e444fd3f1542c0a53b8f5155d.png

    图 4垂直错切

    64a7b54ebe0111efb72c2a8d31bef7dc.png

    实验结果分析
    1、图像的旋转,其原理知识就是数学中向量的旋转,在确定好旋转角度后,计算出旋转后图片的大小,然后进行坐标转换,再向量旋转,最后在逆坐标转换即可。
    2、图像的放大与收缩,放大时,利用插值法填充空白像素点,这里可以用线性插值、双线性插值等方法;收缩时,这时我们就需要考虑舍弃一些不必要的像素点,尽可能多的保持原图像的完整性
    3、图像的水平镜像,实质是图像像素矩阵的水平逆转
    4、图像的错切,本质就是对原有坐标单方向进行函数变换

    八、实验总结及心得体会

    通过这次实验,自己学会了几种图像变换的方法:图像的放大、收缩、水平镜像、错切等,在进行放大的时候,接触到了插值法,有线性插值、双线性插值等,好多的原理知识都需要一定的高数知识,基础还是有点不扎实啊。在图形的放大时,在m、n两个变量搞混,其实也就是坐标轴建立处理差错。

    附:图像收缩原理验证定义
    图像的收缩通俗一点就是我们常说的放大、缩写,在数字图像处理中,就是指像素的增加与减少。比如22的图像,有4个像素,放大两倍,那么就有44=16个像素。
    那么怎么对图像进行收缩呢?
    这里拿放大举例:放大二倍的图像就是图片的width、height都扩大为原来的两倍,也就是像素总数为原来的四倍。那么怎么在保证图片内容不变的情况下增加像素呢?这个也简单,举个例子,比如一个红色的圆原来是4个像素(4个相同的像素)来表示,二倍后的圆那么就是用16个像素(也是相同的)来表示,通俗来说,就是用更多的像素来表示同一种图形。原来需要4个,那么现在就需要16个。
    当然,随机图像上面一个片段是由多个不同的像素表示,那么怎么增加像素个数,同时图形还不变化呢?这个就要用插值来计算了。举个例子,一段上坡路,现在要把它增长(在中间增长),那么肯定是在中间填入和两侧差不多的高度,使得原来的坡面同样也是连续的,保持原来的连续性。所以插值的目的是:通过填充像素,保持原图像的一致,和高数上变化后保持连续性相似。下图是插值法的说明:

    该算法的伪代码:

    我的理解:
    比如原图的大小为300400,放大两倍,变成600800;原图上(1,2)的点在放大图的点为(2,4)。这个应该比较好理解。
    编程的时候,我们是先构造出放大图像的空矩阵,再依次填值。这就要求我们要能够在已知知道放大图像中的一个点坐标,计算出原图的坐标,然后把原图的坐标赋值给新点。
    这里运用比例思想,比如x轴上,放大图为2,它占总长600的2/600,那么原图的x坐标同样也占x轴的2/600,计算出来为1.
    假设(x1,y1)为放大图像的值,(x0,y0)为原图的值,m,n为原图的横纵长度,rm,rn为放大图的横纵长度。

    有以下关系:

    x1/rm=x0/m y1/rn=y0/n
    可以推导出:x0=x1m/rm y0=y1n/rn
    最后再利用双线性插值法插值即可。
    这里代码是(其实就是先分别求出周围4个点,利用不同的取值函数就行,再计算):

    rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;

    be94ec007468b731be994f4cacd25b29.png
    展开全文
  • 图片CololfulRose贴在半抛物面上,画出正视图和俯视图
  • 图片Colorful Rose贴在抛物面z=x2+y2 ( x ≥0, 100 ≥z ≥10) 上,并显示正视图和俯视图。matlab实现
  • matlab之原始处理图像几何变换

    万次阅读 多人点赞 2014-10-25 23:39:30
    (一)图像几何变换理论知识 (1)图像的平移与比例  图像的平移很简单,平移前后的坐标分别为(x,y)和(x’,y’),则满足的关系式为  x’= x +Tx;  y’= y +Ty; 其中Tx与Ty分别为对应的偏移量。  ...
  • <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"> <title>Matlab图像几何变换之图像旋转 - Bryan_QAQ的博客 - CSDN...
  • MATLAB--数字图像处理 图像几何变换

    千次阅读 2019-12-12 22:33:36
    3.于MATLAB环境下编程实现图片不同的几何变换。 三、实验内容 1.将图像图像中心顺时针旋转30度,旋转之后的图像尺寸保持为原图像的尺寸。 2.将原图像放大2倍 3.得到该图像的水平镜像图片 4.得到该图像的垂直错切...
  • 熟悉matlab图像处理工具箱及图像缩放函数的使用;2.掌握图像缩放的方法和应用;二.实验设备1.PC机一台;2.软件matlab;三.程序设计在matlab环境中,程序首先读取图像,然后调用图像缩放函数,设置相关参数,再...
  • 完整代码,可直接运行
  • 1.水平平移 clc I1=imread('D:/123.jpg'); gray_image=rgb2gray(I1); [r,s]=size(gray_image); I2=zeros(r,s); dx=50; dy=50; trans=[1 0 0 ;0 1 0; dx dy 1]; for i=1:r for j=1:s temp=[i j 1];... ...
  • matlab图像几何变换

    2021-04-25 14:04:40
    学习掌握 MATLAB 软件有 实验报告 课程名称:数学实验 实验名称:平面图形的几何变换 指导教师: 实验目的、要求: 1. ......Matlab 图像几何操作_数学_自然科学_专业资料。第2章 图像几何操作 ? 2.1 图像的裁剪、缩放...
  • 实验报告课程名称:数学实验实验名称:平面图形的几何变换 指导教师:实验目的、要求:1. 了解几何变换的基本概念。2. 了解平移、伸缩、对称、旋转等变换。 3. 学习掌握MATLAB 软件有关的命令。实验仪器:安装有...
  • 数字图像处理使用matlab进行几何变换,内含.m源代码及详细实验报告
  • 1.编写一段代码,绘制一个球体,然后平移(利用hold on把变换前后的球体放在同一个figure中) 2. 编写一段代码,绘制一个柱体,然后绕x轴旋转60° 3. 用sphere生成多面体,然后对其进行错切变换 4.程序先绘制一个...
  • 图像几何变换的理论及MATLAB实现.pdf
  • matlab 图像几何变换

    千次阅读 2016-11-21 23:09:57
    1 启动MATLAB程序,读入图像并对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作%%%%%%平移 >> flowerImg=imread('flower.jpg'); >> se=translate(strel(1),[100 100]); >> img2=imdilate...
  • MATLAB中的几何变换

    2019-03-16 17:56:22
    MATLAB在数字图像处理中有很多几何变换的函数,以下为基本例子 首先读取原图像再一次进行几何变换 P=imread('picture1.png'); 1、图像旋转 imrotate(picture,angle,‘bilinear’or’nearest’); q其中picture是...
  • 图像几何变换与畸变校正算法研究与实现.ppt
  • .mlapp源代码,可以拿去直接用,拿来当自己的课设可不是不可以。 大报告详见:https://blog.csdn.net/weixin_42845306/article/details/117951465
  • 基于Matlab的数字图像几何变换实现.pdf
  • matlab图像几何变换(一)

    千次阅读 2018-09-13 16:35:33
    函数功能:实现图像的各种几何变换matlab中,简单的变换可以直接用单个函数实现图像缩放使用: g = imresize(f, scale); g = imresize(f, [ROW COL]); 图像旋转使用: g = imrotate(f, angle); ...
  • matlab图像几何变换

    2014-04-27 12:39:24
    matlab图像几何变换
  • 第2章 图像几何操作 ;2.1 图像的裁剪缩放与旋转;2.1 图像的裁剪缩放与旋转;2.1 图像的裁剪缩放与...2.2 图像几何变换;2.2 图像几何变换;2.2 图像几何变换;2.2 图像几何变换;2.2 图像几何变换;2.2 图像的几
  • (2)掌握图像平移、剪切、缩放、旋转、镜像、错切等几何变换的算法原理及编程实现(3)掌握matlab编程环境中基本的图像处理函数(4)掌握图像的复合变换二、涉及知识点(1)图像几何变换不改变图像像素的值,只改变像素所在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,099
精华内容 2,439
关键字:

matlab实现图像几何变换

matlab 订阅