matlab图像旋转怎么操作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab图像旋转怎么操作?相关的知识,希望对你有一定的参考价值。

参考技术A

下图显示新图像与原图像的长宽关系,注意如果旋转角度是120度,则需要取绝对值,具体参见下面源代码。

下图显示原图像旋转后的点与原图像点的对应关系,以按此公式求得新图像每一点对应的原图像点。



旋转后,由于图像点可能是非整数,出现像素空洞问题,故需要进行插值法,下面选用最近邻插值法。

源代码

[html] view plain copy

    function img_rotate=my_img_rotate_chazhi(img1,angle)  

    % 旋转后图像=my_img_rotate(原图像,旋转角度) 0<旋转角度<360  

    % 查找新图对应的原图像素点  

    % 最邻近点插值方法  

    [h,w,d]=size(img1);  

    radian=angle/180*pi;  

    cos_val = cos(radian);  

    sin_val = sin(radian);  

    w2=round(abs(cos_val)*w+h*abs(sin_val));  

    h2=round(abs(cos_val)*h+w*abs(sin_val));  

    img_rotate  = uint8(zeros(h2,w2,3));    %像素是整数  

    for x=1:w2  

    for y=1:h2  

    x0 = uint32(x*cos_val + y*sin_val -0.5*w2*cos_val-0.5*h2*sin_val+0.5*w);  

    y0= uint32(y*cos_val-x*sin_val+0.5*w2*sin_val-0.5*h2*cos_val+0.5*h);      

    x0=round(x0);         %最邻近插值  

    y0=round(y0);         %最邻近插值  

    if x0>0 && y0>0&& w >= x0&& h >= y0  

    img_rotate(y,x,:) = img1(y0,x0,:);  

    end  

    end  

    end  

    %I = imread('C:\\Users\\yytang\\Desktop\\love.jpg')  

    %I2=my_img_rotate(I,30);  

    %figure,imshow(I2);  

=怎么SHOW旋转后的图像=
=图像是怎么显示的=
图像的显示都是基于矩阵像素来显示的...上面每一张图像的图像信息其实是一个RGB矩阵来的.所以必须把旋转后的图像放到一个像素矩阵中才能显示这个旋转后的图像.
设一张图像的大小是col*row的.那么以这个图像对角线为直径的圆就能够包含这个图像经旋转后的图像..在这里因为图像的显示是矩阵式的,所以这里以图像对角线为边长构造一个正方形来保存旋转后的图像.从上面旋转后的图像可以看出效果啦,旋转后的图像就包含在这个正方形的矩阵中.

=计算旋转图像所需要的正方形=
因为图像是col*row的,所以这个正方形的边长 new_img_size = (col^2+row^2)^0.5;
这样使用matlab就可以生成一个存储最终图像的rgb矩阵了:

[cpp] view plain copy

    img_rotated = uint8(zeros(new_img_size , new_img_size , 3); //%一个像素由RGB三个分量表现.  

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中figure的图像旋转

Matlab 图像平移旋转缩放镜像

Matlab 图像平移旋转缩放镜像

怎么用matlab确定图像中矩形物体的位置及旋转角度

如何使用MATLAB围绕不是图像中心点的点旋转图像?

CImage图像旋转问题