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开源工作室(公众号)

posted @ 2020-03-10 21:51  咸鱼IC  阅读(3456)  评论(3编辑  收藏  举报