• FPGA实现图像几何变换:旋转


      旋转一般是指将图像围绕某一指定点旋转一定的角度。 旋转通常也会改变图像的大小,和图像平移的处理一样,可以把转出显示区域的图像截去,也可以改变输出图像的大小以扩展显示范围。

      本篇博客实现的旋转算法改编自上一篇博客的镜像,因此不说那么多理论,直接记录重点。

    一、MATLAB实现

     1、函数法

    %--------------------------------------------------------------------------
    %                       函数法旋转
    %--------------------------------------------------------------------------
    clc;
    clear all;
    RGB = imread('monkey.jpg'); %读取图像
    
    L_rotate  = imrotate(RGB,90,'crop');
    R_rotate  = imrotate(RGB,-90,'crop');
    rotate    = imrotate(RGB,180,'crop');
    
    subplot(2,2,1),imshow(RGB);      title('原图');
    subplot(2,2,2),imshow(L_rotate); title('水平镜像');
    subplot(2,2,3),imshow(R_rotate); title('垂直镜像');
    subplot(2,2,4),imshow(rotate);title('水平垂直镜像');

    运行结果:

    2、公式法

    %--------------------------------------------------------------------------
    %                       公式法旋转
    %--------------------------------------------------------------------------
    clc;
    clear all;
    RGB = imread('monkey.jpg'); %读取图像
     
    [ROW,COL,N] = size(RGB);
    
    L_rotate  = uint8(zeros(ROW, COL,N)); %Left  rotate
    R_rotate  = uint8(zeros(ROW, COL,N)); %Right rotate
    rotate    = uint8(zeros(ROW, COL,N)); %180° rotate
    
    %左转90度
    for i =1:ROW
        for j=1:COL
            for k=1:N
                x = COL-j+1;
                y = i;
                z = k;
                L_rotate(x,y,z) =RGB(i,j,k);
            end
        end
    end
    
    %右转90度
    for i =1:ROW
        for j=1:COL
            for k=1:N
                x = j;
                y = ROW-i+1;
                z = k;
                R_rotate(x,y,z) =RGB(i,j,k);
            end
        end
    end
    
    %旋转180度
    for i =1:ROW
        for j=1:COL
            for k=1:N
                x = ROW-i+1;
                y = COL-j+1;
                z = k;
                rotate(x,y,z) =RGB(i,j,k);
            end
        end
    end
    
    subplot(2,2,1),imshow(RGB);      title('原图');
    subplot(2,2,2),imshow(L_rotate); title('左转90度');
    subplot(2,2,3),imshow(R_rotate); title('右转90度');
    subplot(2,2,4),imshow(rotate);   title('旋转180度');

    运行结果:

       两种方法得到的结果一致,表明公式正确。

    二、FPGA实现

       本次实验基于镜像改编而来,其他模块一致,仅旋转算法部分不同。

    always @(*) begin
        case(mode)
            2'b00   : begin                                     //原图
                        rotate_x = cnt_col;
                        rotate_y = cnt_row;
                      end
            2'b01   : begin                                     //右转90度
                        rotate_x = cnt_row;
                        rotate_y = (COL-1) - cnt_col;
                      end
            2'b10   : begin                                     //旋转180度
                        rotate_x = (COL-1) - cnt_col;
                        rotate_y = (ROW-1) - cnt_row;
                      end
            2'b11   : begin                                     //左转90度(右转270度
                        rotate_x = (ROW-1) - cnt_row;
                        rotate_y = cnt_col;
                      end
            default : begin
                        rotate_x = cnt_col;
                        rotate_y = cnt_row;
                      end
        endcase
    end

    三、上板验证

      总共4种模式,模式0、1、2、3 分别得到如下结果: 

      把这4副图也按MATLAB的样子拼到一块看看吧:

      和上面的 MATLAB 实验结果对比,可以看到此次图像旋转实验成功。

      视频演示如下所示:

     

    后记

      本博客整理的旋转算法仅支持90度周期的旋转,任意角度的旋转算法还待进一步研究。此外本次所选图片为正方形,如果是长方形图片,则必须在设计旋转算法的模块好好思考如何设计坐标和数值的对应关系。

    参考资料:[1] OpenS Lee:FPGA开源工作室(公众号)

  • 相关阅读:
    模拟测试48
    模拟测试47
    模拟测试46
    NOIP模拟测试29(A)
    NOIP模拟测试19
    NOIP模拟测试18(T3待更新)
    杂题
    noip模拟测试18 T2搜索
    noip模拟测试17 2019-08-11 考后反思
    noip模拟测试14 20190807 考试反思
  • 原文地址:https://www.cnblogs.com/xianyufpga/p/12499478.html
Copyright © 2020-2023  润新知