利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行相关的知识,希望对你有一定的参考价值。

根据矩阵计算:



平移旋转以后,还需要插值,才能显示完整的图像

clear all; close all; clc;
img=imread('lena.bmp');       
[h w]=size(img); 

%平移旋转参数
a = 10; b = 20;
theta = 30 /180*pi; 

% 旋转矩阵
rot=[cos(theta) -sin(theta) 0;
     sin(theta) cos(theta)  0;
     0          0           1];
% 平移矩阵
move = [ 1 0 a;
         0 1 b;
         0 0 1];
%平移加旋转
rot = rot * move;
     
pix1=[a b 1]*rot; % 左上点的坐标 
pix2=[a w+b 1]*rot;      % 右上点的坐标 
pix3=[h+a b 1]*rot; % 左下点的坐标 
pix4=[h+a w+b 1]*rot; % 右下点的坐标 

height = round(max([abs(pix1(1)-pix4(1)) abs(pix2(1)-pix3(1))]));     %变换后图像的高度 
width = round( max([abs(pix1(2)-pix4(2)) abs(pix2(2)-pix3(2))]));      %变换后图像的宽度 

imgn=zeros(height,width); 
delta_y = abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); 
delta_x = abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); 

for i=1-delta_y:height
  for j=1-delta_x:width
        pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
        float_Y=pix(1)-floor(pix(1));
        float_X=pix(2)-floor(pix(2));    
        if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w  
            pix_up_left=[floor(pix(1)) floor(pix(2))];     %四个相邻的点
            pix_up_right=[floor(pix(1)) ceil(pix(2))];  
            pix_down_left=[ceil(pix(1)) floor(pix(2))];
            pix_down_right=[ceil(pix(1)) ceil(pix(2))]; 
            value_up_left=(1-float_X)*(1-float_Y);
        value_up_right=float_X*(1-float_Y);             
        value_down_left=(1-float_X)*float_Y;             
        value_down_right=float_X*float_Y; 
            
imgn(i+delta_y,j+delta_x) = value_up_left*img(pix_up_left(1),pix_up_left(2))+...
value_up_right*img(pix_up_right(1),pix_up_right(2))+...
value_down_left*img(pix_down_left(1),pix_down_left(2))+...
value_down_right*img(pix_down_right(1),pix_down_right(2)); 
        end            
    end 
end 
imshow(uint8(imgn));title('平移旋转并插值');


参考技术A 如果我没理解错,这个问题并不复杂。假设图像矩阵为A,则设旋转角度为thita,放缩比率为k,则
B=imrotate(imresize(A,k),thita);
即可。
如果是彩色图像,将RGB三个矩阵分别做同样的操作即可。追问

需要通过矩阵变换来实现的,就是不用matlab自带的函数。请问你有方法么

追答

自己的方法其实也就是把系统函数实现了一遍而已,就是数字图像处理的放射变换和插值。你可以试着自己看一看相关内容。

Matlab 图像平移旋转缩放镜像

今天学习了用Matlab实现对图像的基本操作。在Matlab中,图像是按照二维矩阵的形式表示的。所以对图像的操作就是对矩阵的操作。 

对图像进行缩放、平移、旋转,都可以转化为矩阵的运算。 
关于变换矩阵的构造,请参考: 
《 [gym 101047C Robotics Competition] 矩阵快速幂求解点旋转平移N次之后的位置》 
参考原图: 
技术分享图片

1. 图像平移

init = imread(‘Fig3.tif‘); % 读取图像
[R, C] = size(init); % 获取图像大小
res = zeros(R, C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)
delX = 50; % 平移量X
delY = 50; % 平移量Y
tras = [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵 

for i = 1 : R
    for j = 1 : C
        temp = [i; j; 1];
        temp = tras * temp; % 矩阵乘法
        x = temp(1, 1);
        y = temp(2, 1);
        % 变换后的位置判断是否越界
        if (x <= R) & (y <= C) & (x >= 1) & (y >= 1)
            res(x, y) = init(i, j);
        end
    end
end;

imshow(uint8(res)); % 显示图像

技术分享图片

2. 图像旋转

init = imread(‘Fig3.tif‘); % 读取图像
[R, C] = size(init); % 获取图像大小
res = zeros( R,  C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)

alfa = -15 * 3.1415926 / 180.0; % 旋转角度
tras = [cos(alfa) -sin(alfa) 0; sin(alfa) cos(alfa) 0; 0 0 1]; % 旋转的变换矩阵

for i = 1 : R
    for j = 1 : C
        temp = [i; j; 1];
        temp = tras * temp;% 矩阵乘法
        x = uint16(temp(1, 1));
        y = uint16(temp(2, 1));
        % 变换后的位置判断是否越界
        if (x <= R) & (y <= C) & (x >= 1) & (y >= 1)
            res(i, j) = init(x, y);
        end
    end
end;

imshow(uint8(res));  % 显示图像

技术分享图片

3. 图像缩放

init = imread(‘Fig3.tif‘); % 读取图像
[R, C] = size(init); % 获取图像大小
timesX = 3; % X轴缩放量
timesY = 3; % Y轴缩放量
res = zeros(timesX * R, timesY * C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)
tras = [1/timesX 0 0; 0 1/timesY 0; 0 0 1]; % 缩放的变换矩阵 

for i = 1 : timesX * R
    for j = 1 : timesY * C
        temp = [i; j; 1];
        temp = tras * temp; % 矩阵乘法
        x = uint8(temp(1, 1));
        y = uint8(temp(2, 1));
        % 变换后的位置判断是否越界
        if (x <= R) & (y <= C) & (x >= 1) & (y >= 1)
            res(i, j) = init(x, y);
        end
    end
end;

imshow(uint8(res)); % 显示图像

技术分享图片

4. 图像镜像(水平)

init = imread(‘Fig3.tif‘);
[R, C] = size(init);
res = zeros(R, C);

for i = 1 : R
    for j = 1 : C
        x = i;
        y = C - j + 1;
        res(x, y) = init(i, j);
    end
end

imshow(uint8(res));

技术分享图片





以上是关于利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 图像平移旋转缩放镜像

opencv 图像平移缩放旋转翻转 图像仿射变换

MATLAB实现图像平移

OpenCV从仿射矩阵得到旋转量平移量缩放量

OpenCV从仿射矩阵得到旋转量平移量缩放量

Android Matrix图像变换处理