matlab图像双线性插值最近邻插值与几何变换.docx
《matlab图像双线性插值最近邻插值与几何变换.docx》由会员分享,可在线阅读,更多相关《matlab图像双线性插值最近邻插值与几何变换.docx(12页珍藏版)》请在冰豆网上搜索。
matlab图像双线性插值最近邻插值与几何变换
实验二图像几何变换与插值
一、实验目的
巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容
1、理解反向变换的实现思路
2、图像缩放及插值Matlab取整命令:
floor,ceil,round
分别实验最近邻插值和双线性插值
f=imread('lena.bmp');
beishu=0.5;
[row,col]=size(f);
r1=round(row*beishu);
c1=round(col*beishu);
b=zeros(r1,c1);
fori=1:
r1
forj=1:
c1
i1=round(i/beishu);
j1=round(j/beishu);
ifi1<1
i1=1;
end
ifj1<1
j1=1;
end
b(i,j)=f(i1,j1);
end
end
b=uint8(b);
figure;
imshow(f);
figure
imshow(b);
3、图像旋转及插值
以图像中心为轴实现任意角度(逆时针为正)的图像旋转,分别实验两种插值算法
f=imread('lena.bmp');
B=imrotate(f,45,'nearest','crop');
C=imrotate(f,45,'bilinear','crop');
figure;
subplot(121);
imshow(f);
title('原图像');
subplot(122);
imshow(B);
title('最近邻插值');
figure;
subplot(121);
imshow(f);
title('原图像');
subplot(122);
imshow(C);
title('双线性插值');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab练习程序(图像放大/缩小,最邻近插值)
ccc
cl;
w=0.6;%放大或缩小的宽度
h=1.4;%放大或缩小的高度
img=imread('Corner.png');
imshow(img);
[mn]=size(img);
imgn=zeros(h*m,w*n);
rot=[h00;0w0;001];%变换矩阵x=h*u,y=w*v
inv_rot=inv(rot);
forx=1:
h*m
fory=1:
w*n
pix=[xy1]*inv_rot;
imgn(x,y)=img(round(pix
(1)),round(pix
(2)));
end
end
figure,imshow(uint8(imgn))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab练习程序(图像放大/缩小,双线性插值)
ccc
m=1.8;%放大或缩小的高度
n=2.3;%放大或缩小的宽度
img=imread('lena.jpg');
imshow(img);
[hw]=size(img);
imgn=zeros(h*m,w*n);
rot=[m00;0n0;001];%变换矩阵
fori=1:
h*m
forj=1:
w*n
pix=[ij1]/rot;
float_Y=pix
(1)-floor(pix
(1));
float_X=pix
(2)-floor(pix
(2));
ifpix
(1)<1 %边界处理
pix
(1)=1;
end
ifpix
(1)>h
pix
(1)=h;
end
ifpix
(2)<1
pix
(2)=1;
end
ifpix
(2)>w
pix
(2)=w;
end
pix_up_left=[floor(pix
(1))floor(pix
(2))]; %四个相邻的点
pix_up_right=[floor(pix
(1))ceil(pix
(2))];
pix_down_left=[ceil(pix
(1))floor(pix
(2))];
pix_down_right=[ceil(pix
(1))ceil(pix
(2))];
value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
%按权重进行双线性插值
imgn(i,j)=value_up_left*img(pix_up_left
(1),pix_up_left
(2))+...
value_up_right*img(pix_up_right
(1),pix_up_right
(2))+...
value_down_left*img(pix_down_left
(1),pix_down_left
(2))+...
value_down_right*img(pix_down_right
(1),pix_down_right
(2));
end
end
figure,imshow(uint8(imgn))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab练习程序(图像旋转,最邻近插值)
ccc
cl;
H=1;%索引pix中第一个元素,即高度
W=2;%索引pix中第二个元素,即宽度
jiaodu=45;%要旋转的角度,旋转方向为顺时针
img=imread('Corner.png');%这里v为原图像的高度,u为原图像的宽度
imshow(img);%这里y为变换后图像的高度,x为变换后图像的宽度
[vu]=size(img);
theta=jiaodu/180*pi;
rot=[cos(theta)-sin(theta)0;sin(theta)cos(theta)0;001];
inv_rot=inv(rot);
pix1=[111]*rot;%变换后图像左上点的坐标
pix2=[1u1]*rot;%变换后图像右上点的坐标
pix3=[v11]*rot;%变换后图像左下点的坐标
pix4=[vu1]*rot;%变换后图像右下点的坐标
height=round(max([abs(pix1(H)-pix4(H))+0.5abs(pix2(H)-pix3(H))+0.5]));%变换后图像的高度
width=round(max([abs(pix1(W)-pix4(W))+0.5abs(pix2(W)-pix3(W))+0.5]));%变换后图像的宽度
imgn=zeros(height,width);
delta_y=abs(min([pix1(H)pix2(H)pix3(H)pix4(H)]));%取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(W)pix2(W)pix3(W)pix4(W)]));%取得x方向的负轴超出的偏移量
fory=1-delta_y:
height-delta_y
forx=1-delta_x:
width-delta_x
pix=[yx1]*inv_rot;%用变换后图像的点的坐标去寻找原图像点的坐标,
%否则有些变换后的图像的像素点无法完全填充
ifpix(H)>=0.5&&pix(W)>=0.5&&pix(H)<=v&&pix(W)<=u
imgn(y+delta_y,x+delta_x)=img(round(pix(H)),round(pix(W)));
end
end
end
figure,imshow(uint8(imgn))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab练习程序(图像旋转,双线性插值)
ccc
jiaodu=45;%要旋转的角度,旋转方向为顺时针
img=imread('lena.jpg');%这里v为原图像的高度,u为原图像的宽度
imshow(img);%这里y为变换后图像的高度,x为变换后图像的宽度
[hw]=size(img);
theta=jiaodu/180*pi;
rot=[cos(theta)-sin(theta)0;sin(theta)cos(theta)0;001];
pix1=[111]*rot;%变换后图像左上点的坐标
pix2=[1w1]*rot;%变换后图像右上点的坐标
pix3=[h11]*rot;%变换后图像左下点的坐标
pix4=[hw1]*rot;%变换后图像右下点的坐标
height=round(max([abs(pix1
(1)-pix4
(1))+0.5abs(pix2
(1)-pix3
(1))+0.5]));%变换后图像的高度
width=round(max([abs(pix1
(2)-pix4
(2))+0.5abs(pix2
(2)-pix3
(2))+0.5]));%变换后图像的宽度
imgn=zeros(height,width);
delta_y=abs(min([pix1
(1)pix2
(1)pix3
(1)pix4
(1)]));%取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1
(2)pix2
(2)pix3
(2)pix4
(2)]));%取得x方向的负轴超出的偏移量
fori=1-delta_y:
height-delta_y
forj=1-delta_x:
width-delta_x
pix=[ij1]/rot;%用变换后图像的点的坐标去寻找原图像点的坐标,
%否则有些变换后的图像的像素点无法完全填充
float_Y=pix
(1)-floor(pix
(1));
float_X=pix
(2)-floor(pix
(2));
ifpix
(1)>=1&&pix
(2)>=1&&pix
(1)<=h&&pix
(2)<=w
pix_up_left=[floor(pix
(1))floor(pix
(2))];%四个相邻的点
pix_up_right=[floor(pix
(1))ceil(pix
(2))];
pix_down_left=[ceil(pix
(1))floor(pix
(2))];
pix_down_right=[ceil(pix
(1))ceil(pix
(2))];
value_up_left=(1-float_X)*(1-float_Y);%计算临近四个点的权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left
(1),pix_up_left
(2))+...
value_up_right*img(pix_up_right
(1),pix_up_right
(2))+...
value_down_left*img(pix_down_left
(1),pix_down_left
(2))+...
value_down_right*img(pix_down_right
(1),pix_down_right
(2));
end
end
end
figure,imshow(uint8(imgn))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
实验一Matlab图像基本操作
一、实验目的
熟悉利用Matlab进行图像处理的基本操作,了解图像数据的存储形式及进行图像处理编程的步骤方法。
二、实验内容
1、图像读写与显示
重点函数:
imread,imwrite,imshow
2、彩色图像灰度化
计算公式:
Gray=R*0.299+G*0.587+B*0.114
3、图像马赛克
局部平均,改变窗口大小比较处理结果,如取2×2、4×4或更大尺寸的窗口
4、图像平移
分别完成图像水平方向、竖直方向和两个方向的平移
三、实验要求
1、编写代码,完成各项实验内容
2、总结实验中遇到问题及解决方案,书写实验报告
实验二图像几何变换与插值
一、实验目的
巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容
4、理解反向变换的实现思路
5、图像缩放及插值
Matlab取整命令:
floor,ceil,round
分别实验最近邻插值和双线性插值
6、图像旋转及插值
以图像中心为轴实现任意角度(逆时针为正)的图像旋转,分别实验两种插值算法
三、实验要求
1、编写代码,完成各项实验内容
2、总结实验中遇到问题及解决方案,书写实验报告
THANKS!
!
!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考