0

【转】基于FPGA实现数字图像的镜像,含matlab源码和FPGA源码

几何变换-镜像

镜像的目的是将图像进行翻转,如图1所示,美国怀俄明大提顿国家公园被水面镜像。镜像可以用前向映射实现,同时由于输出坐标必然落在原先的图像区域内,所以不用进行区域判断,属于比较简单的几何变换。

图1 美国怀俄明大提顿国家公园(水面镜像).png

图1 美国怀俄明大提顿国家公园(水面镜像)

1 原理

镜像有两种模式—水平镜像和垂直镜像,它的原理如式1所示,Q为输出,I为输入,x和y为输入像素坐标,xt和yt为输出像素坐标,width和height为图像宽度和高度。可见镜像的本质是将输入坐标和图像的宽度和高度做减法以得到输出坐标,同时由于减法的结果必然小于被减数,故这实际上是单纯的无符号数的减法。
FPGA图像镜像原理.png

实际应用中会出现三种情况—水平镜像、垂直镜像和全镜像,所以需要一个模式选择来确定模块的工作方式。

2 matlab实现

图2 实验原图.png

图2 实验原图

Matlab实现水平、垂直、全镜像源码:

close all;          

clear all;

clc;

I=imread('test.png');

[ROW COL DIM] = size(I);

Ih = uint8(zeros(ROW, COL,DIM));%Horizontal mirroring

Iv = uint8(zeros(ROW, COL,DIM));%Vertical mirroring

Ihv = uint8(zeros(ROW, COL,DIM));

%水平镜像

for i =1:ROW

    for j=1:COL

        for k=1:DIM

        x = i;

        y = COL-j+1;

        z = k;

        Ih(x,y,z) =I(i,j,k);

        end

    end

end

%垂直镜像

for i =1:ROW

    for j=1:COL

        for k=1:DIM

        x = ROW-i+1;

        y = j;

        z = k;

        Iv(x,y,z) =I(i,j,k);

        end

    end

end

%水平垂直镜像

for i =1:ROW

    for j=1:COL

        for k=1:DIM

        x = ROW-i+1;

        y = COL-j+1;

        z = k;

        Ihv(x,y,z)=I(i,j,k);

        end

    end

end

figure,

subplot(221),imshow(I);title('原图');

subplot(222),imshow(Ih);title('水平镜像');

subplot(223),imshow(Iv);title('垂直镜像');

subplot(224),imshow(Ihv);title('水平垂直镜像');

图3 matlab实验结果.png

图3 matlab实验结果

3 FPGA 实现

共有四种模式:
Mode1: 原图,
Mode2:全镜像,
Mode3: 水平镜像,
Mode4:垂直镜像。
Verilog实现镜像源码:


`timescale 1ns / 1ps  

module mirror#(  
       parameter DW = 8,  
       parameter IW = 1920,  
       parameter IH = 1080,  
       parameter MODE = 0 //0 1 2 3  
       )  
       (  
       input                        pixelclk,  
       input                        reset_n,  
       input                        i_hsync,  
       input                        i_vsync,  
       input                        i_de,  
       input  [DW*3-1:0]            din,  
       input    [11:0]              hcount,//x  
       input    [11:0]              vcount,//y  

       output    [11:0]             hcount_t,//xt  
       output    [11:0]             vcount_t,//yt  
       output                       o_hsync,  
       output                       o_vsync,  
       output                       o_de,  
       output  [DW*3-1:0]           dout  
       );  

       assign o_hsync = i_hsync;  
       assign o_vsync = i_vsync;  
       assign o_de    = i_de;  
       assign dout    = din;   

       assign hcount_t = (MODE == 0)?hcount:  
                         (MODE == 1)?(IW-1)-hcount:  
                         (MODE == 2)?(IW-1)-hcount:hcount;  
       assign vcount_t = (MODE == 0)?vcount:  
                         (MODE == 1)?(IH-1)-vcount:  
                         (MODE == 2)?vcount:(IH-1)-vcount;     

endmodule

图4 FPGA实现全镜像.png

图4 FPGA实现全镜像

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2019-04-28 15:46:23 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它

微信扫码加入我们的圈子! shawn的FPGA圈.png
0

这篇文章不错,看了matlab代码一大坨,结果verilog代码实现起来这么简单。

编辑 标为违禁 删除 链接 更多选项...
comehope 头像
登录/注册后进行回答