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

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

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

图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实验结果
3FPGA 实现
共有四种模式: 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实现全镜像