视频图像处理常见几何变换介绍

视频技术

15人已加入

描述

解决几何变换的一般思路

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

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

主要有以下内容:

·图像的平移变换

·图像的镜像变换

·图像的转置变换

·图像的旋转变换

·图像的缩放

1、图像的平移变换

在进行书写matlab代码之前,先来了解一下图像平移的理论基础。设图像的高度为H,宽度为W,如下所示:

视频图像处理

我们知道,图像是由像素组成的,而像素的集合就相当于一个二维的矩阵,每一个像素都有一个“位置”,也就是像素都有一个坐标。假设原来的像素的位置坐标为(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’);%读入一幅图

[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表示的宽度的平移量,正值往右平移,负值往左平移。

2、图像的镜像变换

图像的镜像变换分为水平镜像和垂直镜像,下面分别进行这两种镜像的介绍,首先说明一下,无论是水平镜像还是垂直镜像,镜像后高度和宽度都不变。

 视频图像处理

H图像的高度,关联x W:图像的宽度,关联y

·水平镜像操作:以原图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换。示意图如下所示

 视频图像处理

水平镜像中,原图中的(x0,y0)经过水平镜像后,坐标变成了(x0,W-y0),用数学公式表达就是:

x1 = x0,

y1 = W-y0 ;

写成矩阵就是:

 视频图像处理

也就是说,水平镜像变换矩阵(因子)为:

 视频图像处理

用matlab代码实现如下所示:

 视频图像处理

代码已经没有什么好介绍的了,跟前面的平移差不多,只不过变换矩阵是水平镜像变化矩阵,得到的效果如下所示:a2

·垂直镜像操作:以原图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。示意图如下所示:

 视频图像处理

垂直镜像中,原图中的(x0,y0)经过垂直镜像后,坐标变成了(H-x0,y0),用数学公式表达就是:

x1 = H - x0,

y1 = y0 ;

写成矩阵就是:

 视频图像处理

也就是说,垂直镜像变换矩阵(因子)为:

 视频图像处理

用matlab代码实现如下所示:

close all ;

clear all ;

clc ;

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

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

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

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

tras = [-1 0 H; 0 1 0; 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;%显示图片,一行两列,第二幅

代码实现的效果如下所示:

       3、图像的转置变换

图像的转置就是将图像像素的x坐标和y坐标互换。这样将改变图像的高度和宽度,转置后图像的高度和宽度也将互换。

图像的转置用数学公式描述就是:

x1 = y0,

y1 = x0;

写出矩阵如下所示:

 视频图像处理

用matlab实现的代码如下所示:

close all ;

clear all ;

clc ;

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

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

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

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

tras = [0 1 0; 1 0 0; 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;%显示图片,一行两列,第二幅

实现的效果如下所示:

视频图像处理

    4、图像的旋转

一般情况下,旋转操作会有一个旋转中心,这个旋转中心一般为图像的中心,旋转之后图像的大小一般会发生改变。图像像素原来的坐标为(x0,y0),(顺时针)选择Θ角度后得到(x1,y1),用数学公式表达如下所示:

x1 = x0·cosΘ + y0·sinΘ,

y1 = -x0·sinΘ + y0·cosΘ;

用矩阵表示如下所示:

 视频图像处理

matlab中有直接实现图像旋转的函数,整理我们就直接使用图像的旋转函数,代码如下所示:

 视频图像处理

这里主要是说明一下imrotate函数,这个函数就是对图像旋转的函数,输入是图像和旋转的角度,角度为正值时,逆时针旋转;角度为负值时,顺时针选择。代码实现的效果如下所示:

       5、图像的缩放

下面值来介绍一下图像的缩放主要是根据函数imresize来实现的,我们先来看看代码和效果图,然后分析图像的缩放函数。代码和效果图像所示:

close all ;

clear all ;

clc ;

[im,map] = imread(‘Hydrangeas.bmp’);%读入图片

im0 = imresize(im,0.26);%进行缩放到原来的0.26倍

im1 = imresize(im,1);%缩放原来的比例

im2 = imresize(im,3.5);%进行缩放到原来的3.5倍

im3 = imresize(im,[64 40]);%进行图像的缩放并设置图像的行列

im4 = imresize(im,1.6,‘bilinear’);%进行线性插值实现缩放

im5 = imresize(im,1.6,‘triangle’);

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

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

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

subplot(1,2,1), imshow(im,map);%显示图片,一行两列,第一幅

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

缩小:

 

等大:

 

放大

 

缩放并且设置行列:

 

线性插值:

 
       

下面介绍一下imresize函数的使用信息(可以通过在matlab 使用help imresize查看):

该函数主要用来调整图像大小。

B = imresize(A,SCALE)返回一个图像,大小是原来的SCALE倍;A是灰度、RGB或者二进制图像。

B = imresize(A,[NUMROWS NUMCOLS])调整图像大小,使其具有指定数量的行和列。 NUMROWS或NUMCOLS可能都是NaN,在这种情况下,将自动计算行数或列数,以便保留图像宽高比。

[Y,NEWMAP] = imresize(X,MAP,SCALE)调整索引图像的大小,其中按照SCALE的倍数对原图像进行调整。

[Y,NEWMAP] = imresize(X,MAP,[NUMROWS NUMCOLS])调整索引图像的大小,通过调整行数和列数进行调整。

要控制imresize使用的插值方法,可以在上面的语法中添加一个METHOD参数,如下所示:

(A,SCALE,METHOD)

(A,[NUMROWS NUMCOLS],METHOD),

imresize(X,MAP,M,METHOD)

imresize(X,MAP,[NUMROWS NUMCOLS],METHOD)

METHOD可以是一个命名一般插值方法的字符串:

‘nearest’ - 最近邻插值

‘bilinear’ - 双线性插值

‘bicubic’ - 三次插值;默认方法

METHOD也可以是一个命名插值内核的字符串:

‘box’ - 用盒形内核插值

‘triangle’ - 三角形内核插值 (相当于“双线性”)

‘cubic’ - 用立方核插值 (相当于“bicubic”)

‘lanczos2’ - 用Lanczos-2内核插值

‘lanczos3’ - 插入Lanczos-3内核

最后,METHOD可以是{f,w}形式的双元素单元阵列,其中f是自定义内插内核的处理函数,w是自定义内核的宽度。在区间-w / 2 《= x 《w / 2之外,f(x)必须为零。可以使用标量或向量输入来调用处理函数f。

可以通过使用上述任何语法之后的参数/值对来实现对imresize的附加控制。例如:

B = imresize(A,SCALE,PARAM1,VALUE1,PARAM2,VALUE2,。..)

参数包括:

‘Antialiasing’- 真假指定缩小图像时是否执行抗锯齿。默认值取决于您选择的插值方法。对于‘nearest’ METHOD参数,默认值为false;对于所有其他方法,默认值为true。

‘Colormap’ - (仅与索引图像相关) ‘original’ 或 ‘optimized’;如果‘original’ ,则输出newmap与输入图相同。如果是“优化”,则会创建一个新的优化颜色映射。默认值为“optimized”。

‘Dither’ - (仅适用于索引图像)true或false; 指定是否执行颜色抖动。默认值为true。

‘Method’ - 如上所述

‘OutputSize’ - 一个双元素向量[MROWS NCOLS], 指定输出大小。一个元素可以是NaN,在这种情况下,自动计算另一个值以保留图像的宽高比。

‘Scale’ - 一个标量或两元素向量,指定调整大小的比例因子。如果它是标量,则将相同的比例因子应用于每个维度。如果它是向量,它分别包含行和列尺寸的比例因子。

例子:

使用默认的双三次插值和抗混叠缩小两倍:

I = imread(‘rice.png’);

J = imresize(I,0.5);

figure,imshow(I), figure,imshow(J)

使用最近邻内插收缩因子2。 (这是最快的方法,但质量最差):

J2 = imresize(I,0.5,‘nearest’);

调整索引图像的大小:

[X,map] = imread(‘trees.tif’);

[Y,newmap] = imresize(X,map,0.5);

imshow(Y,newmap)

调整RGB图像的大小以获得64行,自动计算列数:

RGB = imread(‘peppers.png’);

RGB2 = imresize(RGB,[64 NaN]);

图像的几何变化差不多就到这里了,matlab中有很多函数可以实现图像的几何变换,这里就不详细说明了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分