matlab图像双线性插值,最近邻插值与几何变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二图像几何变换与插值
一、实验目的
巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容
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);
for i=1:r1
for j=1:c1
i1=round(i/beishu);
j1=round(j/beishu);
if i1<1
i1=1;
end
if j1<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);
[m n]=size(img);
imgn=zeros(h*m,w*n);
rot=[h 0 0;0 w 0;0 0 1]; %变换矩阵x=h*u,y=w*v
inv_rot=inv(rot);
for x=1:h*m
for y=1:w*n
pix=[x y 1]*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);
[h w]=size(img);
imgn=zeros(h*m,w*n);
rot=[m 0 0;0 n 0;0 0 1]; %变换矩阵
for i=1:h*m
for j=1:w*n
pix=[i j 1]/rot;
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if pix(1) < 1%边界处理
pix(1) = 1;
end
if pix(1) > h
pix(1) = h;
end
if pix(2) < 1
pix(2) =1;
end
if pix(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))+ ...