基于FPGA图像的镜像

几何变换-镜像

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

基于FPGA图像的镜像

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

1 原理

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

基于FPGA图像的镜像 

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

2 matlab实现

基于FPGA图像的镜像

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('水平垂直镜像');

基于FPGA图像的镜像

3 matlab实验结果

3FPGA 实现

共有四种模式: Mode1: 原图,

               Mode2:全镜像,

               Mode3: 水平镜像,

               Mode4:垂直镜像。

Verilog实现镜像源码:

  1. `timescale 1ns / 1ps  

  2.   

  3. module mirror#(  

  4.        parameter DW = 8,  

  5.        parameter IW = 1920,  

  6.        parameter IH = 1080,  

  7.        parameter MODE = 0 //0 1 2 3  

  8.        )  

  9.        (  

  10.        input                        pixelclk,  

  11.        input                        reset_n,  

  12.        input                        i_hsync,  

  13.        input                        i_vsync,  

  14.        input                        i_de,  

  15.        input  [DW*3-1:0]            din,  

  16.        input    [11:0]              hcount,//x  

  17.        input    [11:0]              vcount,//y  

  18.          

  19.        output    [11:0]             hcount_t,//xt  

  20.        output    [11:0]             vcount_t,//yt  

  21.        output                       o_hsync,  

  22.        output                       o_vsync,  

  23.        output                       o_de,  

  24.        output  [DW*3-1:0]           dout  

  25.        );  

  26.          

  27.        assign o_hsync = i_hsync;  

  28.        assign o_vsync = i_vsync;  

  29.        assign o_de    = i_de;  

  30.        assign dout    = din;   

  31.   

  32.        assign hcount_t = (MODE == 0)?hcount:  

  33.                          (MODE == 1)?(IW-1)-hcount:  

  34.                          (MODE == 2)?(IW-1)-hcount:hcount;  

  35.        assign vcount_t = (MODE == 0)?vcount:  

  36.                          (MODE == 1)?(IH-1)-vcount:  

  37.                          (MODE == 2)?vcount:(IH-1)-vcount;     

  38.          

  39. endmodule  

基于FPGA图像的镜像

4 FPGA实现全镜像

点“图像处理往期精彩”了解更多

基于FPGA的车牌字符提取

一种MXN维的手写字符识别算法

基于HDMI的视频流输入输出实验

一种简单的基于FPGA车牌定位算法的实现

基于FPGA的数字识别三

更多精彩推荐,请关注我们

基于FPGA图像的镜像