matlab图像双线性插值,最近邻插值与几何变换

更新时间:2023-10-16 20:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验二 图像几何变换与插值

一、实验目的 巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。 二、实验内容

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))+ ...

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为变换后图像的宽度 [v u]=size(img);

theta=jiaodu/180*pi;

rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1]; inv_rot=inv(rot);

pix1=[1 1 1]*rot; %变换后图像左上点的坐标 pix2=[1 u 1]*rot; %变换后图像右上点的坐标 pix3=[v 1 1]*rot; %变换后图像左下点的坐标 pix4=[v u 1]*rot; %变换后图像右下点的坐标

height=round(max([abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix3(H))+0.5])); %变换后图像的高度 width=round(max([abs(pix1(W)-pix4(W))+0.5 abs(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方向的负轴超出的偏移量

for y=1-delta_y:height-delta_y for x=1-delta_x:width-delta_x

pix=[y x 1]*inv_rot; %用变换后图像的点的坐标去寻找原图像点的坐标, %否则有些变换后的图像的像素点无法完全填充 if pix(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为变换后图像的宽度 [h w]=size(img);

theta=jiaodu/180*pi;

rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];

pix1=[1 1 1]*rot; %变换后图像左上点的坐标 pix2=[1 w 1]*rot; %变换后图像右上点的坐标 pix3=[h 1 1]*rot; %变换后图像左下点的坐标 pix4=[h w 1]*rot; %变换后图像右下点的坐标

height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %变换后图像的高度 width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(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方向的负轴超出的偏移量

for i=1-delta_y:height-delta_y for j=1-delta_x:width-delta_x

pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标, %否则有些变换后的图像的像素点无法完全填充 float_Y=pix(1)-floor(pix(1)); float_X=pix(2)-floor(pix(2));

if pix(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、总结实验中遇到问题及解决方案,书写实验报告

本文来源:https://www.bwwdw.com/article/9uff.html

Top