围绕图像的坐标位置的改变,变换来讲
像素位置发生改变,从这个位置到了另一个位置,但是它的颜色不变。
后面几章讲解位置不变,但是颜色变。
上述二维矩阵不能满足所有变换通用一个计算公式
如下面的平移问题:
不能表示成如下形式,因为后面有后缀加号,想要把后缀加号去掉,变成一个通用的转换公式,但是矩阵里面没有平移的常量。
所以这样的坐标系统是不能完成转换公式的。
因此我们把它做变换,变换到齐次坐标,齐次坐标能让我们用统一的矩阵形式来实现变换。他们都在T坐标里。平移也在这个矩阵形式里面,来实现基本的几何变换。
所以要引入齐次坐标。
齐次坐标如何实现:是把2维变为3维的一种手段
以n+1维向量来表示n维向量,比如2维的给扩展1位变成3维。
z平面取固定值为1.
这样2*3矩阵和3*1矩阵相乘结果为(x0+△x,y0+△y),实现了平移。
平移变换矩阵:
因而写成矩阵形式,转换成T的矩阵。矩阵的表示形式:添加了一个维度,相应的不只是转换矩阵改变了,相应的坐标数值量也扩了一位,把2行3列的转换矩阵进一步再改扩充为3*3的矩阵。平移变换就可以是一个通用的计算公式了。
基本变换方法:一个普通的二维平移矩阵变成3维以后,转换方式就是这样一种过程:其中有2个转换地方
1是平移矩阵(转换矩阵)要变成3*3(可满足所有的几何变换形式),2是坐标的位置也增加一维。
几何变换的一般过程:
1,要把转移矩阵齐次化,改成3*3形式,2,把2维的数据2*n变成3*n形式,3,然后乘起来,转换矩阵乘以变换前的,用齐次矩阵=变换后的点集矩阵
常用的转换矩阵有以下3种形式:
注意:
平移:
图像经过平移之后,原来它在一个位置,平移到另一个位置,平移后的景物与原图像相同,景物是相同的,平移以后原来怎么放还怎么放。但是画布一定是扩大了。
比例缩放:
使得坐标这个像素往前了或者放大了。缩小一般不变形,但是放大会变形。
按比例缩小,就是长宽有一个固定的比例,如果不按固定比例缩小,会产生几何形变。
缩小的情况:
一幅图像你把它缩小了,数据量会减少。放大。
缩小一半就是4个点里取1个点,隔一行一取,隔一列一取。
放大,长宽各放大2倍,数据量多了,要把一个点复制为4个点,
注意图像缩放变换不是指我们所看到的图像的大小变换,而是指图像中的像素数量的变换。
水平镜像的特点:
高度没有改变量,第0列现在到了最后一列。最后一列到了图像的第0列。是以中心一半这样的调换,坐标位置调换。
垂直镜像的特点:
公式:
水平镜像:列数上改变了,-x0+fWidth
垂直镜像:x没有变,y变为-y0+fHeight
旋转变换:
旋转以后,宽高改变,很多地方需要插值,要插上白的像素。
旋转用sin和cos,相乘之后变为小数,小数乘以整数之后坐标就变成小数了,所以取整,总是有变形。所以很多空白地方需要填充。
插值:
最简单的插值是行插值或列插值,空点的像素等于前一点的像素,同样操作很多次。
复合变换:
多次进行基本变换而合成复合起来的变换。
做若干次的变换,可以每次做完都保存一个图,然后再做下一个变换。也可以直接把它复合的变换公式求出来就可以,这样速度会更快。
复合变换,因为是3*3矩阵,所以再乘以3*3之后还是3*3矩阵。若干次变换之后还是3*3阶的表示。所以把它变成齐次坐标之后后续的变换也很方便。
比如说复合平移。
比如说复合旋转。
复合旋转之后的角度是各个角度之和,
在实现代码上,计算机是围绕坐标怎么改,把坐标改了把原来像素赋到改的指定的空位里。因此需要开辟新的内存空间,根据你的指定大小开辟内存空间,然后把数据量复制过去。
坐标的转换,是增加到齐次,相应的转换矩阵也要齐次化。
以后就可以用统一形式来进行统一的变换
变换的过程是矩阵齐次化,每个坐标的像素点也变成齐次坐标,变成3*n阶的矩阵,乘以转换成齐次坐标的矩阵集。
这些是进行图像几何校正的基本方法
1,学会怎样开辟新的内存空间
因为图像变换之后,它的数据区,数据的宽度,高度,图像的数据都改变了,所以需要开辟新的内存空间
有的图像经过变换以后宽和高改变了,比如转置,放大,缩小,旋转。改变宽和高后,存文件时INFO-HEIGHT里面的信息都要相应改变。显示时也涉及这些问题。
宽高不变就很方便。
放大最基本的要素是产生了新的像素,平移和转置都是这个像素,没有增加,放大之后面积增加,从一个点产生了更多的点,所以要插值。
数据量是增加的
例1
%利用膨胀函数imdilate平移图像
close all;
clear all;
clc;
I=imread('lena.bmp'); %输入图像.这里的图像数据,uint8,表示变量是无符号整数.uint8是指
%0-2^8-1=255数据类型,在图像处理中常见.图像数据中的数据一般都为无符号整数.
%translate,平移 polyshape,不能直接操作读取出的图像矩阵。polyshape,由二维顶点定义的多边形。
%操作translate,将读取的图形矩阵转化为strel-Morphological structuring element,形态结构元素对象。
%区分move-在父窗口中移动或调整控件大小,控件是指对数据和方法的封装.
a=50;b=50;%设置平移坐标
se=translate(strel(1),[a,b]);
J1=imdilate(I,se);
a=-50;b=50;%设置平移坐标
se=translate(strel(1),[a,b]);%移动原图像
J2=imdilate(I,se);
a=50;b=-50;%设置平移坐标
se=translate(strel(1),[a,b]);%移动原图像
J3=imdilate(I,se);
a=-50;b=-50;%设置平移坐标
se=translate(strel(1),[a,b]);%移动原图像
J4=imdilate(I,se);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure,
subplot(1,3,1),imshow(I);axis on
subplot(1,3,2),imshow(J1),axis on;%绘制移动后图像
subplot(1,3,3),imshow(J2),axis on;%绘制移动后图像
figure,
subplot(1,2,1),imshow(J3),axis on;%绘制移动后图像
subplot(1,2,2),imshow(J4),axis on;%绘制移动后图像
例2
%用flip做图像镜像变换
%flip,翻转元素顺序。
%flip(),可翻转向量-沿向量的长度方向反转元素顺序,矩阵,数组。
%flip(A,dim)沿维度dim反转A中元素的顺序.flip(A,1)反转列元素,flip(A,2)反转行元素
close all;
clear all;
clc;
I=imread('lena.bmp'); %输入图像
J1=flip(I,1);%水平镜像
J2=flip(I,2);%垂直镜像
J3=flip(I,3);%水平垂直镜像
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure,
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(J1);%绘制移动后图像
subplot(2,2,3),imshow(J2),axis on;%绘制移动后图像
subplot(2,2,4),imshow(J3),axis on;%绘制移动后图像
例3
%用imresize实现图像的缩放
%imresize,调整图像大小。
%B=imresize(A,scale),将A的长宽大小缩放scale倍之后的图像.A可以是灰度、RGB或二值图像。
%A有两个以上维度,则imresize只调整前两个维度的大小。默认imresize使用双三次插值。
%B=imresize(A,[numrows numcols]),行数和列数由二元素向量[numrows numcols]指定。
%[Y,newmap]=imresize(X,map,___)调整索引图像X的大小.map是与该图像关联的颜色图。
%默认,imresize返回经过优化的新颜色图(newmap)和已调整大小的图像.返回与原始颜色图相同的颜色图,用'Colormap'参数。
%imresize(___,method) 指定使用的插值方法。
%imresize(___,Name,Value)返回调整大小后的图像,其中 Name,Value对组控制大小调整操作的各个方面。
close all;
clear all;
clc;
[I,map]=imread('lena.bmp'); %输入图像
J1=imresize(I,0.25);%设置缩放比例0.25
J2=imresize(I,3.5);%设置缩放比例3.5
J3=imresize(I,[164 40]);%设置缩放后的图像行列
J4=imresize(I,[164 NaN]);%按原图像生成
J5=imresize(I,1.6 ,'bilinear');%设置图像插值方法,双线性插值
J6=imresize(I,1.6,'triangle');%三角插值
[J7,newmap]=imresize(I,'Antialiasing',true,'method','nearest',...
'Colormap','original','Scale',0.15);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure(1),
subplot(131),imshow(I);
subplot(132),imshow(J1);
subplot(133),imshow(J2);
figure(2),
subplot(121),imshow(J3);
subplot(122),imshow(J4);
figure(3),
subplot(121),imshow(J5);
subplot(122),imshow(J6);
figure(4),
subplot(121),imshow(I);
subplot(122),imshow(J7);
例4
%转置函数transpose实现对图像的转置变换.
%transpose转置向量或矩阵.
close all;
clear all;
clc;
I=imread('lena.bmp'); %输入图像
J1=transpose(I);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure;
subplot(121),imshow(I);
subplot(122),imshow(J1);
例5
%imrotate实现图像的旋转。rotate,旋转。
%J=imrotate(I,angle),rotates image I by angle degrees in a counterclockwise direction
%around its center point.To rotate the image clockwise,specify a negative value for angle.
%imrotate makes the output image J large enough to contain the entire rotated image.
%imrotate uses nearest neighbor interpolation,setting the values of pixels in J that
%are outside the rotated image to 0(zero).
close all;
clear all;
clc;
I=imread('lena.bmp'); %输入图像
J1=imrotate(I,20);%旋转20度
J2=imrotate(I,-30);%旋转-30度
%J=imrotate(I,angle,method)rotates image I,using the interpolation method specified
%by method.
%J=imrotate(I,angle,method,bbox),where bbox specifies the size of the output image.
%If you specify 'crop',then imrotate makes the output image the same size as the input image.
%If you specify 'loose',then imrotate makes the output image large enough to include the
%entirety of the rotated image.
J3=imrotate(I,30,'bicubic','crop');%设置图像大小,实现旋转图像显示,双线性插值,图像大小相等
J4=imrotate(I,30,'bicubic','loose');%图像足够大,包括旋转图像
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure(1),
subplot(121),imshow(J1);
subplot(122),imshow(J2);
figure(2),
subplot(121),imshow(J3);
subplot(122),imshow(J4);
例6
%imcrop实现图像的剪切操作,crop裁切
%J = imcrop(I,rect)crops the image I according to rect,which specifies the
%size and position of the crop rectangle as [xmin ymin width height],in terms
%of spatial coordinates.The cropped image includes all pixels in the input
%image that are completely or partially enclosed by the rectangle.
close all;
clear all;
clc;
[I,map]=imread('lena.bmp'); %输入图像
rect=[90 90 100 100];%设置矩形框的位置(90 90)和大小(100 100).定义剪切区域
X1=imcrop(I,rect);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
figure(1),
subplot(121),imshow(I);
rectangle('Position',rect,'Linewidth',3,'EdgeColor','b');%显示定义的图像裁切区域
%rectangle创建带有尖角或圆角的矩形,rectangle('Position',pos)在二维坐标中创建一个矩形。
%将pos指定为[x y w h]形式的四元素向量(以数据单位表示).x和y元素确定位置,w和h元素确定大小
%rectangle(___,Name,Value)使用一个或多个名称-值对组参数指定矩形的属性。
%例如,'FaceColor','red' 指定红色填充颜色。
subplot(122),imshow(X1);
例7
%imcrop,用鼠标选择裁剪区域,实现交互式图像剪切
%J=imcrop(I)displays the image I in a figure window and creates an interactive
%Crop Image tool associated with the image.I can be a grayscale image,a truecolor
%image,or a logical array.
close all;
clear all;
clc;
[I,map]=imread('lena.bmp'); %输入图像
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
[I2,rect]=imcrop(I);%进行图像剪切
figure,
subplot(121),imshow(I);
rectangle('Position',rect,'Linewidth',2,'EdgeColor','b');
subplot(122),imshow(I2);