– 掌握图像几何变换的原理
– 掌握图像缩放的方法
– 掌握图像旋转的方法
– 掌握图像镜像的方法
– 掌握图像平移的方法
图像的放大收缩,拿放大举例,就是拿更多的像素去表达原来的图像,但是图像整体不变,通俗一点就是,原来一个特征点,需要10个像素表示,放大就是现在我们用20个或者更多来表示这个特征点,填值的方法有很多,邻值插值,线性插值等。
2、图像旋转
图像的旋转就是将图像中的所有像素整体旋转,即本质就是对每个像素进行旋转。对一个像素进行旋转,可以看出向量的旋转,利用向量旋转公式,得到旋转矩阵。当然,旋转之后,虽然图像的大小的不会变化的,但是便于我们坐标的选取,我们会计算出一个新的坐标系,所以这里两个过程,两个坐标系中坐标的相互转换,得到两个转换矩阵,这样一来,对于一个像素点,只需要对它进行相应的矩阵操作即可得到旋转之后的点坐标。当然,对于一些得到的映射点不是整数的情况下,我们可以按照要求进行取整或者插值操作即可。
3、图像的水平和垂直镜像
对像素矩阵进行水平转置和对垂直方向进行线性变换。
4、图像的平移
改变图像的横纵坐标值
三、实验环境
–Windows XP/ Windows 7
–Matlab 7.0.1/ Matlab R2008
四、实验内容与步骤
– 读取并显示一幅灰度图像(如果用的是彩色图像,可用rgb2gray()函数将彩色图像转换为灰度图像);
– 对原图像进行缩放操作,调整缩放参数,将图像缩放至不同大小,放大图像时分别采用最近邻插值法和双线性插值法进行插值,记录不同结果;
function[Q] = sf(n)
P = imread('moon.tif');
figure,imshow(P);
title('原图像');
P = double(P);
Pkg=size(P);
Ph=Pkg(:,1);
Pw=Pkg(:,2);
Intw=round(Pw * n);
Inth=round(Ph * n);
Q=zeros(Inth,Intw);
for i=1:Inth
for j=1:Intw
x=round(i/n);
y=round(j/n);
if(x < 1)
x = 1;
end
if(x > Ph)
x = Ph;
end
if(y < 1)
y = 1;
end
if(y > Pw)
y = Pw;
end
Q(i,j)=P(x,y);
end
end
figure,imshow(uint8(Q));
title(‘输出图像’);
end
2、 双线性插值
在最近邻插值时,对于源图中坐标为浮点数的点,直接四舍五入取整带来了严重的失真。比如0.75直接取1,更科学的方法是,0.75距离1为0.25,距离0为0.75,按照距离的占比取相应点像素值的找比。
function A = imscale(B,S) %定义缩放函数,B为源图像,A为目标图像,S为缩放倍数
[r,c] = size(B);
nr= round(r*S); %根据放大倍数乘原行数的结果,取其四舍五入的值作为新的行
nc= round(c*S); %根据放大倍数乘原列数的结果,取其四舍五入的值作为新的列
A = zeros(nr,nc); %用新的行列生成目标图像矩阵
SB = zeros(r+1,c+1); %新建一个矩阵SB,大小在B的基础上行列都加1
SB(2:r+1,2:c+1)=B;
SB(2:r+1,1)=B(:,1);
SB(1,2:c+1)=B(1,:);
SB(1,1)=B(1,1);
for Ai=1:nr
for Aj=1:nc
Bi=(Ai-1)/S;
Bj=(Aj-1)/S;
i=fix(Bi);
j=fix(Bj);
u=Bi-i;
v=Bj-j;
i=i+1;
j=j+1;
A(Ai,Aj)=(1-u)*(1-v)*SB(i,j)+u*v*SB(i+1,j+1)+u*(1-v)*SB(i+1,j)+(1-u)*v*SB(i,j+1);
end
end
end
I=imread('moon.tif');
figure,imshow(I);
Dst=imscale(I,1.5); %调用imscale()函数
figure,imshow(uint8(Dst));
imwrite(Dst,'ims1.5.jpg');
– 对原图像进行旋转操作,调整角度参数,分别采用最近邻插值法和双线性插值法进行插值,记录不同结果;
将图像向左旋转45度:
img = imread('moon.tif');
figure;
imshow(img);
title('原图');
[row col ch] = size(img);
d = [row col]/2;
x = pi/4;
R = [cos(x), -sin(x)
sin(x), cos(x)];
R = R';
cc = ceil(row*sin(x)+col*cos(x));
rr = ceil(row*cos(x)+col*sin(x));
dd = [rr cc]/2;
img2 = uint8(zeros(rr,cc,ch));
for k = 1:ch
for i = 1:rr
for j = 1:cc
p = [i;j];
pp = (R*(p-dd)+d);
mn = floor(pp);
x = pp(1);
y = pp(2);
m = mn(1);
n = mn(2);
if m>=1 && m
=1 && n
if x-m <= 0.5
x = m;
else
x = m+1;
end
if y-n <= 0.5
y = n;
else
y = n+1;
end
img2(i,j,k) = img(x,y,k);
end
end
end
end
figure;
imshow(img2);
title('旋转45度结果');
– 对原图像进行水平镜像和垂直镜像操作;
I=imread('moon.tif');
[M,N]=size(I);
I_x=I;
for i=1:M
for j=1:N
I_x(i,j)=I(i,N-j+1);
end
end
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imshow(I_x);
I_y=I;
for i=1:M
for j=1:N
I_y(i,j)=I(M-i+1,j);
end
end
subplot(2,2,3);
imshow(I_y);
– 自己编写一段程序,实现对图像的平移操作,调整平移参数,记录不同实验结果。
将moon图像向左上角平移50
I=imread('moon.tif');
figure,imshow(I);
[r,c]=size(I);
dst=zeros(r,c);
dx=-50;
dy=-50;
tras=[1 0 dx;0 1 dy;0 0 1];
for i=1:r
for j=1:c
temp=[i;j;1];
temp=tras*temp;
x=temp(1,1);
y=temp(2,1);
if(x>=1&&x<=r)&&(y>=1&&y<=c)
dst(x,y)=I(i,j);
end
end
end
figure,imshow(uint8(dst));
通过改变dx和dy的值可以实现各种平移操作:
向左下角平移80:
垂直向下平移100:
水平向右平移150:
六、实验心得与体会
通过本次实验对图像进行各种几何变化,对原始图像按照需要产生大小、形状和位置的变化包括缩放、旋转、水平和垂直镜像以及平移。感受到了图像处理是通过矩阵的变化实现的,将课本上的理论和实际结合起来,加深了对课堂所学的理解。
对于matlab的使用更加熟练,提高了自己的动手能力,在调节图像的过程之中,遇到了很多困难,通过查阅丰富了很多理论知识,收获颇丰,希望在今后的学习中能够更加熟练。