前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >几何变换--图像裁剪

几何变换--图像裁剪

作者头像
FPGA开源工作室
发布2019-10-29 11:53:56
1.5K0
发布2019-10-29 11:53:56
举报
文章被收录于专栏:FPGA开源工作室FPGA开源工作室

基于FPGA图像的裁剪

1 几何变换介绍

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

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

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

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

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

前向映射:

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

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

逆向映射:

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

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

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

2 几何变换--裁剪

2.1裁剪原理

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

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

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的数字识别三

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档