zoukankan      html  css  js  c++  java
  • 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));

    图像镜像

  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/cofludy/p/7953744.html
Copyright © 2011-2022 走看看