2.Zooming and Shrinking Images by Bilinear Interpolation
通过双线性插值来缩放和缩小图像
(a)编写一个能够通过双线性插值来缩放和缩小图像的计算机程序。程序的输入是水平和垂直方向的所需大小。您可以忽略混叠效果。
(b)下载图。2.19,并使用您的程序将此图像从1024x1024缩小到256x256像素。
(c)使用程序将图像放大(b)回到1024x1024。解释一下造成他们存在差异的原因。
代码:
function ex_2(k)
%双线性插值缩放图像 内核为矩阵操作
%此处参数详细说明
%k 为放大缩小的比例
%filep 为输入图像文件名
%Image为原图
%IT为原图矩阵
%TransImage为缩放后的矩阵
clc;
%%
%确定图片路径
[filename,filepath] = uigetfile('*.*');
if isequal(filename,0)
disp('User selected Cancel');
else
disp(['User selected ', fullfile(filepath,filename)]);
end
filep=strcat(filepath,filename);
%%
%step1:准备工作——将图片读入,并检查一下缩放比是否小于等于0
if ischar(filep)
[Image,M]=imread(filep);%将图读入Image,颜色读入M
end
if k<=0
error('k不能为0')
end
%%
%step2:将目标图像矩阵建立为0矩阵
[H,W,D]=size(Image);%分别返回 Image 的查询维度的长度。
TransH=round(H*k);
TransW=round(W*k);
TransImage=zeros(TransH,TransW,D);%缩放之后新的矩阵大小
%%
%step3:将输入图像上下左右各加一列(行),这一步为了后面边缘像素的插值操作
IT=zeros(H+2,W+2,D);
IT(2:H+1,2:W+1,:)=Image;
IT(1,2:W+1,:)=Image(1,:,:);IT(H+2,2:W+1,:)=Image(H,:,:);
IT(2:H+1,1,:)=Image(:,1,:);IT(2:H+1,W+2,:)=Image(:,W,:);
IT(1,1,:)=Image(1,1,:);IT(1,W+2,:)=Image(1,W,:);
IT(H+2,1,:)=Image(H,1,:);IT(H+2,W+2,:)=Image(H,W,:);
%%
%step4 新图的某个像素(i j)映射到原图(ox oy)上,并双线性插值算出新图该矩阵的灰度
for j=1:TransH
for i=1:TransW
ox=(i-1)/k;oy=(j-1)/k;%用新的大图映射到小图的位置上
%向下取整得到整数x,y
x=floor(ox);y=floor(oy);
%接下来带入公式即可
u=ox-x;%gapx
v=oy-y;%gapy
x=x+1;y=y+1;%因为IT中多加了一行一列
TransImage(i,j,:)=u*v*IT(x+1,y+1,:)+v*(1-u)*IT(x,y+1,:)+(1-v)*u*IT(x+1,y,:)+(1-v)*(1-u)*IT(x,y,:);
end
end
%%
%同时输出原图和更改后的图
figure
subplot(1,2,1);
imshow(Image,M);
title('原图')
subplot(1,2,2)
imshow(TransImage,M);
title(['缩放后 缩放比为',num2str(k)]);
%%
imwrite([uint8(TransImage),M],'zoom.jpg');
end
这个代码有点长,要好好品一品啊uu们。步骤之间我都分段了,先复制到matlab里就能看到分段。
对于该代码的几点说明:
1.创建:该代码是一个函数:应在matlab中 新建——>函数,然后写在这个里面
2.运行:在命令行窗口输入函数名+函数的参数
参考书: