几何变换--图像裁剪

基于FPGA图像的裁剪

1 几何变换介绍

几何变换:从新规定图像内像素的几何排列方式。

几何变换包括:缩放、旋转、平移等。这些变换一般用于校正图像处理引起的空间失真,或者通过将图像配准到一个预定义的坐标系统中用于规范化该图像(例如,将一幅航拍图像配准到一个特定的地图投影中,或者在立体视觉中对两幅互相配对的图像进行整形,使得行与外极限)。

与点操作和局部滤波器不同,输出图像通常来说并不是来自同一个输入像素位置。这就意味着需要一些形式的缓存来处理由于几何形状改变引起的延迟。最简单的方法是将输入图像或输出图像(或两者)保存在一个帧缓存中。大部分的几何变换不太容易用数据同时实现输入和输出。

   输入和输出像素间的映射可以用两种不同的方法。

几何变换--图像裁剪

1 几何变换的前向和逆向映射

    前向映射:

           

几何变换--图像裁剪

前向映射将输出像素坐标(uv)定义为输入像素坐标的一个函数mf

前向映射适用于处理数据流输入,例如,来自一个摄像头,因为它为每个输入像素指定其像素值会映射到输出的什么地方。

    逆向映射:

           

几何变换--图像裁剪

逆向映射定义输入像素坐标为输出坐标的一个函数mr

逆向映射更适用于产生数据流输出,例如图像数据流输出到显示屏,因为对于每一个输出像素,逆向映射指定了像素值是来自输入图像的什么位置。

几何变换--图像裁剪

2 几何变换的基本结构左:前向映射右:逆向映射

2 几何变换--裁剪

2.1裁剪原理

前向映射将原图像的像素坐标作为自变量,以某个变换函数得出目标图像的像素坐标,裁剪变换的变换函数如式1Q为输出,I为输入,xy为原图像坐标,tblr为四个边界,从某种角度来看,它实际上一种非线性滤波器,保留输入坐标的同时变换输出色彩。

几何变换--图像裁剪

所以,实现一个裁剪模块实际上是要通过给定的边界信息来确定可以输出的一个区域,然后根据是否在这个区域内来确定输出。

2.2 matlab实现裁剪

close all;                  %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量

clear all;

clc;

[A,map]=imread('peppers.png');  %读入图像

rect=[75 68 130 112];           %定义剪切区域

X1=imcrop(A,rect);              %进行图像剪切

set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置

set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置

subplot(121),imshow(A); %显示原图像

rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') %显示图像剪切区域

subplot(122),imshow(X1);   %显示剪切的图像

几何变换--图像裁剪

3 matlab实现裁剪

2.3 FPGA实现裁剪

1.     `timescale 1ns / 1ps  

2.       

3.     module corp#(  

4.            parameter DW = 8,//sigle lane 8bit  

5.            parameter IW = 1920,  

6.            parameter LEFT = 100,  

7.            parameter RIGHT = 700,  

8.            parameter TOP = 100,  

9.            parameter BUTTOM = 500  

10.        )  

11.        (  

12.        input                        pixelclk,  

13.        input                        reset_n,  

14.        input                        i_hsync,  

15.        input                        i_vsync,  

16.        input                        i_de,  

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

18.        input    [11:0]              hcount,  

19.        input    [11:0]              vcount,  

20.        output                       o_hsync,  

21.        output                       o_vsync,  

22.        output                       o_de,  

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

24.        );  

25.   

26.        reg  [DW*3-1:0]           dout_r;  

27.        reg                       hsync_r;  

28.        reg                       vsync_r;  

29.        reg                       de_r;  

30.          

31.        //Sequence alignment  

32.        always @(posedge pixelclk) begin  

33.          hsync_r <= i_hsync;  

34.          vsync_r <= i_vsync;  

35.          de_r    <= i_de;  

36.        end  

37.          

38.        assign o_hsync = hsync_r;  

39.        assign o_vsync = vsync_r;  

40.        assign o_de    = de_r;  

41.        assign dout = dout_r;   

42.          

43. always @(posedge pixelclk or negedge reset_n) begin  

44.   if(!reset_n)  

45.     dout_r <= 0;  

46.   else if( hcount >LEFT && hcount < RIGHT && vcount > TOP && vcount <BUTTOM)// Crop Area  

47.     dout_r <= din;  

48.   else  

49.     dout_r <= 0;//background color  

50. end    

51.          

52.          

53. endmodule  

实现结果:

几何变换--图像裁剪

4 FPGA实现裁剪

几何变换中裁剪也是最简单的一个,我们可以通过裁剪保留我们最感兴趣的部分。

 

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

基于FPGA的车牌字符提取

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

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

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

基于FPGA的数字识别三

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

几何变换--图像裁剪

万水千山总是情,点个 “在看” 行不行!!!

几何变换--图像裁剪