基於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實現全鏡像