0

基于FPGA实现图像裁剪

1 几何变换介绍

几何变换:从新规定图像内像素的几何排列方式。
几何变换包括:缩放、旋转、平移等。这些变换一般用于校正图像处理引起的空间失真,或者通过将图像配准到一个预定义的坐标系统中用于规范化该图像(例如,将一幅航拍图像配准到一个特定的地图投影中,或者在立体视觉中对两幅互相配对的图像进行整形,使得行与外极限)。
与点操作和局部滤波器不同,输出图像通常来说并不是来自同一个输入像素位置。这就意味着需要一些形式的缓存来处理由于几何形状改变引起的延迟。最简单的方法是将输入图像或输出图像(或两者)保存在一个帧缓存中。大部分的几何变换不太容易用数据同时实现输入和输出。
输入和输出像素间的映射可以用两种不同的方法。
几何变换的前向和逆向映射.png

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

前向映射将输出像素坐标(u,v)定义为输入像素坐标的一个函数mf
前向映射适用于处理数据流输入,例如,来自一个摄像头,因为它为每个输入像素指定其像素值会映射到输出的什么地方。
逆向映射:
逆向映射.jpg

逆向映射定义输入像素坐标为输出坐标的一个函数mr
逆向映射更适用于产生数据流输出,例如图像数据流输出到显示屏,因为对于每一个输出像素,逆向映射指定了像素值是来自输入图像的什么位置。
几何变换的基本结构.png

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

2 几何变换–裁剪

2.1裁剪原理

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

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

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);   %显示剪切的图像

matlab实现图像裁剪.png

图3 matlab实现裁剪

2.3 FPGA实现裁剪

FPGA源码见下面第一个回答

FPGA实现图像裁剪.png

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

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名

想向站长提问,微信扫码立刻加入! shawn的FPGA圈.png
0
  答案登陆可见 做站不容易,小伙伴支持一下我们吧!
编辑 标为违禁 删除 链接 更多选项...
shawn 头像
0

正在学习图像处理,书上公式看懂了,matlab也看懂了,就是不知道怎么搞到FPGA里面,这个文章写得蛮清楚的。

编辑 标为违禁 删除 链接 更多选项...
Charlie_Jade 头像

评论

刚开始做还没入门,请问有了第一个回答的源码建立工程后,quartus还要哪些操作和代码可以得到和matlab运行效果类似的结果呢

zenghaoxiong 头像zenghaoxiong ( 2019-08-14 15:50:18 +0800 )编辑
登录/注册后进行回答