历史上的今天
返回首页

历史上的今天

今天是:2025年01月13日(星期一)

正在发生

2018年01月13日 | 视频图像处理常见几何变换介绍

2018-01-13 来源:互联网

图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置. 我们学习几何变换的关键就是要确定这种空间映射关系, 以及映射过程中的变换参数。


几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排。一个几何变换需要两部分运算:首先是空问变换所需的运算, 如平移、旋转和镜像等, 需要用它来表示输出图像与输入图像之间的〈像素〉映射关系:此外, 还需要使用灰度插值算法, 因为按照这种变换关系进行计算, 输出图像的像素可能被映射到输入图像的非整数坐标上。


主要有以下内容:


图像的平移变换


图像的镜像变换


图像的转置变换


图像的旋转变换


图像的缩放


1、图像的平移变换


在进行书写matlab代码之前,先来了解一下图像平移的理论基础。


我们知道,图像是由像素组成的,而像素的集合就相当于一个二维的矩阵,每一个像素都有一个“位置”,也就是像素都有一个坐标。假设原来的像素的位置坐标为(x0,y0),经过平移量(△x,△y)后,坐标变为(x1,y1),如下所示:


用数学式子表示可以表示为:


x1 = x0 + △x,


y1 = y0 + △y;


用矩阵表示为:


本来使用二维矩阵就可以了的,但是为了适应像素、拓展适应性,这里使用三位的向量。

式子中,矩阵:


称为平移变换矩阵(因子),△x和△y为平移量。


此外,我们也知道了,图像的高度H其实也就是像素的行数,对于坐标1≤X≤H;图像的长度也就是像素的列数,对应坐标1≤Y≤W。


上面是理论基础,下面我们就用matlab实现一下图像的平移变换,相应的matlab代码如下所示:


close all ;


clear all ;


clc ;


im = imread(‘F:/图像处理/Koala.jpg?imageView2/2/w/550’);%读入一幅图


[H,W,Z] = size(im); % 获取图像大小,H为垂直方向768点,W为水平方向1024点


I=im2double(im);%将图像类型转换成双精度


res = ones(H,W,Z); % 构造结果矩阵。每个像素点默认初始化为1(白色)


delX = 50; % 平移量X


delY = 100; % 平移量Y


tras = [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵


for x0 = 1 : H%第1行到第768行


for y0 = 1 : W%第1列到第1024列


temp = [x0; y0; 1];%将每一点的位置进行缓存,1行1列,1行2列···1行1024列


temp = tras * temp; % 根据算法进行,矩阵乘法:转换矩阵乘以原像素位置


x1 = temp(1, 1);%新的像素x1位置,也就是新的行位置(从1~768)


y1 = temp(2, 1);%新的像素y1位置,也就是新的列位置(从1~1024)


% 变换后的位置判断是否越界


if (x1 《= H) & (y1 《= W) & (x1 》= 1) & (y1 》= 1)%新的行位置要小于新的列位置


res(x1,y1,:)= I(x0,y0,:);%进行图像平移,颜色赋值


end


end


end;


set(0,‘defaultFigurePosiTIon’,[100,100,1000,500]);%设置窗口大小


set(0,‘defaultFigureColor’,[1 1 1]);%设置窗口颜色


figure;%打开一个窗口,用来显示(多幅)图像


subplot(1,2,1), imshow(I),axis on ;%显示图片,一行两列,第一幅


subplot(1,2,2), imshow(res),axis on;%显示图片,一行两列,第二幅

然后下面我们分析一下关键的代码:


读入图像之后,得到im,我们可以看到im是一个三维的变量,包括了像素的位置(高度(即垂直长度)和宽度(即水平长度)),像素的颜色。(注,24位真彩图:也是用矩阵表示,图像像素直接用RGB颜色显示,而不是通过颜色索引表。图像像素的颜色用三个变量表示即(R,G,B),每个变量从0~255变化,因此一个像素也就是8bit*3=24bit,一个像素用24bit表示可以有2^24种颜色。)我们可以看到会有unit8,就是8bit的原因。


然后我们获取图像的大小,用H,W,Z三个变量接收,其中H接收了图片的高度(也就是垂直长度),W接收了图片的宽度(水平长度),然后Z接收了图片的颜色值。


然后我们将图像转换成双精度类型I,这是因为使用双精度可以仿真在转换过程中发生精度损失的问题,也是方便我们进行转换。转换之后,我们可以看到unit8的类型别我们转换成了double类型。


接着,我们构造一个图像res矩阵,这个图像首先进行归一化,也就是让里面的元素全部为1,对于图像,就是一张白色的图片了。这个图像主要是用来“保存”我们进行位移后的图像。


然后我们就设置平移量、构造平移变换矩阵。这个矩阵我们根据前面的理论部分可以得到。


接着便是重点了,进行平移变换。我们来一句一句解读这个循环。当x0=1,y0=1时,得到第一个像素的位置,也就是(x0,y0)这个像素,然后将这个像素位置进行缓存,也就是构造一个矩阵temp,即理论中的:

 

然后进行位置转换,也就是进行矩阵相乘,用变换矩阵乘以原像素矩阵,得到了变换后像素矩阵:

 

接着,我们需要把变换后的像素位置“提取”出来,用x1,y1进行存储;为什么要获取位置呢?这是因为我们要判断这个像素是否越界了,也就是进行平移之后,得到的这个像素位置是否还存在显示区域里面,也就是我们的


if (x 《= H) & (y 《= W) & (x 》= 1) & (y 》= 1) 语句


当还在显示区域里面时,我们要进行移位显示:


res(x1,y1,:)= I(x0,y0,:);%进行图像平移,颜色赋值


这个语句的含义是,把I中的RGB值(也就是颜色值)赋值给res,也就是说,前面矩阵相乘只是移动的像素位置,但是颜色没有进行移动,这里进行图像颜色的平移,当x0=1,y0=1时,把该点的位置图像颜色进行移动过去。


当x0=1,y0=2时,移动第二点。我们可以看到,这里的代码是:从左到右平移,也就是先进行宽度的平移;从上到下,进行高度的平移。当两个循环完成之后,图像也就像平移完成了。


最后的代码就是显示图像了,其中axis on 的意思是打开左边,方便我们进行查看平移后的位置。从上面的效果我们可以得到,delx表示的高度的平移量,delx为正值时往下平移,delx为负值时往上平移;而dely表示的宽度的平移量,正值往右平移,负值往左平移。

推荐阅读

史海拾趣

Delphi Connection Systems公司的发展小趣事

随着市场的不断发展,Delphi Connection Systems公司意识到单靠自身的力量难以在激烈的市场竞争中立足。于是,公司积极寻求与其他企业的战略合作,通过资源共享、优势互补,共同开拓市场。公司与一家知名的汽车制造商建立了战略合作关系,为其提供高质量的连接器产品,从而成功进入了汽车电子行业市场。

BOWEI公司的发展小趣事

随着市场的不断发展,Delphi Connection Systems公司意识到单靠自身的力量难以在激烈的市场竞争中立足。于是,公司积极寻求与其他企业的战略合作,通过资源共享、优势互补,共同开拓市场。公司与一家知名的汽车制造商建立了战略合作关系,为其提供高质量的连接器产品,从而成功进入了汽车电子行业市场。

CEVA, Inc公司的发展小趣事

面对不断变化的市场环境和技术挑战,CEVA公司积极应对,抓住机遇。例如,在执行编码标准并降低许可证风险方面,CEVA的DevOps/实时开发团队面临着在更高效地执行编码标准的同时降低许可证相关风险的挑战。公司通过优化开发流程、提升自动化水平等方式,成功应对了这一挑战。同时,CEVA也通过增加站点布局、拓建电商能力、提升产品竞争力等手段,抓住市场机遇,迎接未来。

Aten International公司的发展小趣事

随着业务的不断发展,Aten International开始积极拓展全球市场。通过与国际知名企业的合作,Aten International成功将其产品和服务推广至全球各地。同时,公司还设立了多个海外分支机构和办事处,以便更好地服务全球客户。这一举措不仅提升了Aten International的品牌影响力,也为公司的持续发展奠定了坚实基础。

Analogic Corporation公司的发展小趣事

随着业务的不断发展,Aten International开始积极拓展全球市场。通过与国际知名企业的合作,Aten International成功将其产品和服务推广至全球各地。同时,公司还设立了多个海外分支机构和办事处,以便更好地服务全球客户。这一举措不仅提升了Aten International的品牌影响力,也为公司的持续发展奠定了坚实基础。

百佳(BAIJIA)公司的发展小趣事

在多年的发展过程中,百佳公司始终坚守品质至上的原则。他们严格把控产品质量,从原材料采购到生产制造的每一个环节都进行严格的监控和检测。同时,百佳公司还注重提升客户服务水平,为客户提供及时、专业的技术支持和售后服务。正是这种对品质的坚持和对客户的尊重,使得百佳公司赢得了广大客户的信赖和长期合作。

这五个故事只是百佳公司在电子行业发展中的一部分缩影。它们展示了百佳公司从初创时期的艰苦与坚持,到抓住市场机遇迅速崛起,再到技术创新引领发展、拓展国际市场实现全球化布局,以及坚持品质至上赢得客户信赖的完整历程。这些故事不仅见证了百佳公司的成长和成功,也展现了电子行业的蓬勃发展和无限可能。

问答坊 | AI 解惑

[转帖]招聘嵌入式系统程序员 C语言测试

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。 从被面试者的角度来 ...…

查看全部问答>

飞思卡尔HCS08和coldfire v1 KBI教程

这是我们写的一个教程,适用于飞思卡尔的HCS08系列单片机和coldfire v1系列的MCU…

查看全部问答>

VxWorks应用层通信程序

  有在VxWorks应用层通信的软件没,比如传送一个文件或一串消息? 请各位高手指点?…

查看全部问答>

你第一linux操作系统是什么,你现在用什么linux操作系统

  调查,我的第一个linux操作系统是ubuntu,我从09年暑假开始接触linux,装的就是ubuntu8.04,然后虽然接触过fedora,redhat,debian,suse等,但一直觉得ubuntu爽快,哈哈,现在一直在用ubuntu,甚至开发FPGA,大家呢,欢迎大家讨论…

查看全部问答>

DIY数控电源进度帖

安装了controlSUIT,开始回顾TI的例程,用官方的.c文件,建了工程,编译通过了。 Piccolo的资料相对没有2812那么多。进度不是很快,有压力啊。…

查看全部问答>

ucosII 移植到LM3S9B92上还真是不简单

一直想把ucosII V2.92移植到LM3S9B92上去,但前前后后搞了将近三个星期了,还是没有一点结果,指针总是越界,第一个任务还没启动起来就会进入死循环,真是郁闷啊。…

查看全部问答>

DAC功放电路

用DAC做了个因为播放器,又用LM386做了个功放,想问一下在将dac输出接到LM386的输入端前是不是要加入滤波电路呢?不知道为什么,噪音好大…

查看全部问答>

为什么EPM570会被程序弄死?

写了个串口调试程序用来测试板子各个工作点状态的,但是居然第一次烧录几次后CPLD就不能再烧录了干脆坏掉了,只能换芯片,要知道100脚的epm570更换起来多费时间。是不是程序导致芯片内部短路了?…

查看全部问答>

【NUCLEO-F410RB】2.给nucleo移植上ucos-ii,用信号量实现led闪烁

本帖最后由 caizhiwei 于 2015-12-6 17:17 编辑      虽然管理员寄过来的板子不能用,但是还得完成任务。所以抽出时间把ucos-ii移植上另外一块Nucleo板子上,奉上工程源码,供大家享用~~ int main(void) {     ...…

查看全部问答>

LED恒流驱动电源最新

我有个论文要写,关于LED恒流驱动的,市面是否有新颖或新款的电路。有创新点的。评职称用很愁啊。 …

查看全部问答>